ios 播放输出视频问题

来源:9-2 Java调用C接口-1

慕标8476938

2018-11-12

c语言,抽取一个视频流,抽取完之后,直接放到一个.mp4文件下,然后播放这个mp4。ios下面抽取一个视频流之后,为什么放到一个.mp4文件下,这个mp4文件路径也对,在沙盒下面放着,播放的时候为什么播放不出来,我用的苹果自带的播放器AVPlayerLayer播放的,下面是我的代码

+ (NSString *)mediea_info:(NSURL *)inputUrl{

    NSString *inputStr = [inputUrl absoluteString];

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

    NSString *outputPath = [docDir stringByAppendingPathComponent:@"output.mp4"];

    const char *inputchar = [inputStr UTF8String];

    const char *outputchar = [outputPath UTF8String];

    AVFormatContext *fmt_ctx = NULL;

    int ret;

    int audio_index;

    size_t len;

    AVPacket pkt;

    

    av_log_set_level(AV_LOG_INFO);

    ret = avformat_open_input(&fmt_ctx, inputchar, NULL, NULL);

    if (ret < 0) {

        av_log(NULL,AV_LOG_ERROR,"Can't open file: %s\n",av_err2str(ret));


    }

    

    FILE *dst_fd = fopen(outputchar, "wb");

    if (!dst_fd) {

        av_log(NULL, AV_LOG_ERROR, "can't open outputfile");

        avformat_close_input(&fmt_ctx);

        return nil;

    }

    av_dump_format(fmt_ctx,0,inputchar,0);

    

    ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);

    

    if (ret < 0) {

        av_log(NULL,AV_LOG_ERROR,"没有找到语音流");

        avformat_close_input(&fmt_ctx);

        fclose(dst_fd);

        return nil;

    }

    av_init_packet(&pkt);

    audio_index = ret;

    while (av_read_frame(fmt_ctx, &pkt) >= 0) {

        if (pkt.stream_index == audio_index) {

            len = fwrite(pkt.data, 1, pkt.size, dst_fd);

            if (len != pkt.size) {

                av_log(NULL,AV_LOG_WARNING,"waring");

            }

        }

        av_packet_unref(&pkt);

    }

    if (dst_fd) {

        fclose(dst_fd);

    }

    avformat_close_input(&fmt_ctx);

    return [NSString stringWithCString:outputchar encoding:NSUTF8StringEncoding];

}



写回答

1回答

李超

2018-11-12

你的问题我没看明白,抽取的数据为啥放到mp4 下?你是咋放的?

0
3
李超
回复
慕标8476938
其实是两个层面,一是在 iOS里使用ffmpeg对多媒体文件进行处理,二是对于处理后的视频帧进行渲染。我看你的代码是对从mp4文件中抽取出了音频包,并写到了一个文件里。但这样是播不了的。为什么呢?这是由于你写入的文件是普通文件,以aac为例,如果你用fwrite函数写文件的话,你应该自己在每个音频包前面加 AAC Header,这样播放器才能认识。还有一种方法是使用 ffmpeg 相关的API写文件,这样你就不用自己组装头了,也方便了很多。现在我看你的描述感觉你对这块还是不太清楚,你可以看看我上传的关于iOS的player的代码,然后单步跟着调试一下,看看它是怎么做的。这样更有利于你的学习。
2018-11-12
共3条回复

经典再升级-FFmpeg5.0核心技术精讲,打造音视频播放器

学好FFmpeg核心技术,做高效,高薪,有竞争力的音视频工程师

2726 学习 · 814 问题

查看课程