ffmpeg从MP4中提取H264裸流(新旧API对比)

问题

在分离mpe中的H264码流的时候,如果使用ffmpeg在命令行操作非常简单,ffmpeg -i video.mp4 -codec copy -f h264 video.h264,这一句就可以将MP4中的H264裸流提取出来了。
尝试着想用代码来实现这一功能,发现将av_read_frame()得到的AVPacket存入文件,得到的文件用PotPlayer是不能播放的。通过查找相关内容发现,MP4格式需要使用FFMPEG中的名为"h264_mp4toannexb"的bitstream filter 来处理AVPacket,下面是新旧API在实现上的不同部分。

老版本API

AVBitStreamFilterContext* h264bsfc =  av_bitstream_filter_init("h264_mp4toannexb"); 

AVPacket packet;
while( av_read_frame(format_ctx_, &packet) >= 0 ) {
    if( packet.stream_index == video_stream_index ) {
        uint8_t* outbuf = nullptr;
        int outlen = 0;
        av_bitstream_filter_filter(h264bsfc, codec_ctx_, NULL, 
            &outbuf, &outlen, packet.data, packet.size, 0);
        fwrite(packet.data, packet.size, 1, fp);
        if(outbuf){
            av_free(outbuf);
        }
    }

    av_free_packet(&packet);
}

av_bitstream_filter_close(h264bsfc);

新版本API

AVBSFContext * h264bsfc;
const AVBitStreamFilter * filter = av_bsf_get_by_name("h264_mp4toannexb");
ret = av_bsf_alloc(filter, &h264bsfc);
avcodec_parameters_copy(h264bsfc->par_in, input_fmt_ctx->streams[video_stream_index]->codecpar);
av_bsf_init(h264bsfc);

AVPacket* packet = av_packet_alloc();
while( av_read_frame(format_ctx_, packet) >= 0 ) {
    if( packet.stream_index == video_stream_index ) {
        ret = av_bsf_send_packet(h264bsfc, packet);
        if(ret < 0) qDebug("av_bsf_send_packet error");

        while ((ret = av_bsf_receive_packet(h264bsfc, packet)) == 0) {
            fwrite(packet->data, packet->size, 1, fp);
        }
    }

    av_packet_unref(packet);
}

av_packet_free(&packet);
av_bsf_free(&h264bsfc);

参考链接

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 如此强大的FFmpeg,能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流...
    骚之哈塞給阅读 25,910评论 6 39
  • 因为正在学习音视频,从当当买了关于FFmpeg的书,在家补充知识。遇到了一些命令行的使用,我把它从书上移到笔记上,...
    请叫我果爸阅读 14,991评论 0 18
  • 前言 如此强大的FFmpeg,能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流...
    sillen阅读 10,756评论 2 45
  • 前言 如此强大的FFmpeg,能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流...
    RichyLeo阅读 17,621评论 1 22
  • 喝酒不吃主食的一般!不知道太具体的原因,这个酒能喝不能喝,也许有天然的成分在,有的那确实灌不倒,有的一沾两眼就黑,...
    纵情嬉戏天地间阅读 1,675评论 0 0

友情链接更多精彩内容