最近在学习音视频开发,需要开发一个从flv文件中提取h264码流的demo。

具体的原理,在雷神的文章中写的很清楚了:
https://blog.csdn.net/leixiaohua1020/article/details/39767055
https://blog.csdn.net/leixiaohua1020/article/details/39802819

在这里致敬一下雷神,给我们这些小白入门音视频铺平了道路!

但是雷神在Demo中使用的API是旧版本的API,比如bitstream_filter相关的:
av_bitstream_filter_init()
av_bitstream_filter_filter()
等,这些API即将被弃用,我们需要使用新版本的API。

但是网上并没有找到相关的实现,根据上面链接的方法也并不能正确解析出h264码流。

在分析bitstream_filter.c源码后我们发现,在调用av_bsf_init()前需要调用avcodec_parameters_from_context(),增加解码必要的一些参数。

修改后的demo如下,大家可以用来参考。因为我也是刚入门,所以欢迎大家批评指正~:

#include <stdio.h>
#include <libavformat/avformat.h>
#define FFMPEG_NEWint main() {AVFormatContext *ifmt_ctx = NULL;AVPacket pkt;int ret, i;int videoindex = -1, audioindex = -1;const char *in_filename = "demo.flv";const char *out_filename_v = "ffmpeg_demo.h264";const char *out_filename_a = "ffmpeg_demo.mp3";//av_register_all(); 已废弃if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {printf("Could not open input file.");goto ERROR;}if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {printf("Failed to retrieve input stream information");goto ERROR;}videoindex = -1;for (i=0; i<ifmt_ctx->nb_streams; i++) { //nb_streams:视音频流的个数if (ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)videoindex = i;else if (ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)audioindex = i;}printf("\nInput Video===========================\n");av_dump_format(ifmt_ctx, 0, in_filename, 0);  // 打印信息printf("\n======================================\n");FILE *fp_audio=fopen(out_filename_a,"wb+");  FILE *fp_video=fopen(out_filename_v,"wb+");#ifdef FFMPEG_NEWAVBSFContext *bsf_ctx = NULL; const AVBitStreamFilter *pfilter = av_bsf_get_by_name("h264_mp4toannexb");if (pfilter == NULL) {printf("Get bsf failed!\n");goto ERROR;}
#else AVBitStreamFilterContext* h264bsfc =  av_bitstream_filter_init("h264_mp4toannexb");
#endifwhile (av_read_frame(ifmt_ctx, &pkt) >= 0) {if (pkt.stream_index == videoindex) {#ifdef FFMPEG_NEWif ((ret = av_bsf_alloc(pfilter, &bsf_ctx)) != 0) {printf("Alloc bsf failed!\n");goto ERROR;}ret = avcodec_parameters_from_context(bsf_ctx->par_in, ifmt_ctx->streams[videoindex]->codec);if (ret < 0) {printf("Set Codec failed!\n");goto ERROR;}ret = av_bsf_init(bsf_ctx);if (ret < 0) {printf("Init bsf failed!\n");goto ERROR;}av_bsf_send_packet(bsf_ctx, &pkt);ret = av_bsf_receive_packet(bsf_ctx, &pkt);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)break;else if (ret < 0) {printf("Receive Pkt failed!\n");goto ERROR;}
#elseav_bitstream_filter_filter(h264bsfc, ifmt_ctx->streams[videoindex]->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
#endifprintf("Write Video Packet. size:%d\tpts:%lld\n",pkt.size,pkt.pts);fwrite(pkt.data, 1, pkt.size, fp_video);}else if (pkt.stream_index == audioindex) {printf("Write Audio Packet. size:%d\tpts:%lld\n",pkt.size,pkt.pts);fwrite(pkt.data, 1, pkt.size, fp_audio);}av_packet_unref(&pkt);}
#ifdef FFMPEG_NEWav_bsf_free(&bsf_ctx);
#elseav_bitstream_filter_close(h264bsfc);
#endiffclose(fp_video);fclose(fp_audio);avformat_close_input(&ifmt_ctx);return 0;ERROR:if (ifmt_ctx)avformat_close_input(&ifmt_ctx);if (fp_audio)fclose(fp_audio);if (fp_video)fclose(fp_video);if (bsf_ctx)av_bsf_free(&bsf_ctx);return -1;
}

从flv文件中提取h264码流(使用av_bsf_send_packet和av_bsf_receive_packet)相关推荐

  1. Mp4文件中提取H264码流

    一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...

  2. 使用代码从抓包文件中提取H264码流

    1 从抓包文件中过滤出包含单条流的RTP包 使用ssrc 或者 payload type过滤皆可,具体如下图: 2 使用wireshark可以提前分析下本条码流到底有没有丢包 这样就可以预先知道这条流 ...

  3. 【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    原文地址为: [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph A ...

  4. [转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012  Email:skyseraph00@163 .com 一.MP4格式基 ...

  5. 流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    源地址:http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html [流媒體]H264-MP4格式及在MP4文件中提取H264的S ...

  6. 【转载】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本概 ...

  7. 从flv文件中提取音频并存储为mp3格式

    在优酷上下载了一些教学视频,为了把它们放到mp3里面,需要从这些flv文件中提取出音频数据并存储为mp3格式. 操作系统是centos 5.3. 在网上搜索了一下,找到以下方法: 方法一:使用menc ...

  8. H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装 ...

  9. 【流媒体】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的 ...

最新文章

  1. 集合框架(List的三个子类的特点)
  2. (传送门) Ubuntu随身系统
  3. 网络编程学习笔记(socketpair函数)
  4. Python3安装配置【转】
  5. SAP OData服务性能测量的四种办法
  6. java内存区域及静态常量池、运行时常量池介绍
  7. e盾网络验证源码_Laravel [mews/captcha] 图片验证码
  8. 录制电脑屏幕的软件_电脑屏幕录制操作方法,太实用了!
  9. 分布式团队_我们说的意思是:我们是一个分布式优先团队
  10. PMI、砺志咨询活动:项目经理软技能征文大赛—15个PDU、免费软技能培训
  11. XML Web services 发现
  12. 行业研究 | 语音识别行业发展现状解读
  13. WordPress 5.2 Beta 1 发布,将于4月30日推出正式版
  14. $ 在 JQuery 里的意思
  15. 基于PCA的ORL人脸识别---Python
  16. drawboard pdf拆分文件_Drawboard PDF 免费版
  17. kali系统卸载Docker容器
  18. 清北学堂2018noip集训D1
  19. 华为0基础——名字的美丽度
  20. 抓包工具 - HttpWatch(功能详细介绍)

热门文章

  1. Ubuntu18.04重启后无法进入图形化界面
  2. .sbt文件的配置详解
  3. 计算机视觉相关词汇翻译
  4. 爬虫系列之链家的信息爬取及数据分析
  5. npm WARN tarball tarball data for xxxx@^0.25... npm项目依赖安装卡住,报错,尝试多次无果的解决方法
  6. 电子技术——负反馈特性
  7. 管理信息系统基础知识点
  8. java空对象怎么判断,java怎么判断对象为空
  9. 如何下载原生纯净的Windows系统?(MSDN)
  10. Duplicated tag: ‘mirrors‘ (position: START_TAG seen ...erred\r\n