出自:http://blog.csdn.net/leixiaohua1020/article/details/11800877
 

在使用FFMPEG的类库进行编程的过程中,可以直接输出解复用之后的的视频数据码流。只需要在每次调用av_read_frame()之后将得到的视频的AVPacket存为本地文件即可。

经试验,在分离MPEG2码流的时候,直接存储AVPacket即可。

在分离H.264码流的时候,直接存储AVPacket后的文件可能是不能播放的。

如果视音频复用格式是TS(MPEG2 Transport Stream),直接存储后的文件是可以播放的。

复用格式是FLV,MP4则不行。

经过长时间资料搜索发现,FLV,MP4这些属于“特殊容器”,需要经过以下处理才能得到可播放的H.264码流:

1.第一次存储AVPacket之前需要在前面加上H.264的SPS和PPS。这些信息存储在AVCodecContext的extradata里面。

并且需要使用FFMPEG中的名为"h264_mp4toannexb"的bitstream filter 进行处理。

然后将处理后的extradata存入文件

具体代码如下:

  1. FILE *fp=fopen("test.264","ab");
  2. AVCodecContext *pCodecCtx=...
  1. unsigned char *dummy=NULL;   //输入的指针
  2. int dummy_len;
  3. AVBitStreamFilterContext* bsfc =  av_bitstream_filter_init("h264_mp4toannexb");
  4. av_bitstream_filter_filter(bsfc, pCodecCtx, NULL, &dummy, &dummy_len, NULL, 0, 0);
  5. fwrite(pCodecCtx->extradata,pCodecCtx-->extradata_size,1,fp);
  6. av_bitstream_filter_close(bsfc);
  7. free(dummy);

2.通过查看FFMPEG源代码我们发现,AVPacket中的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以AVPacket肯定这不是标准的nalu。其实,AVPacket前4个字表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。

具体代码如下:

  1. char nal_start[]={0,0,0,1};
  2. fwrite(nal_start,4,1,fp);
  3. fwrite(pkt->data+4,pkt->size-4,1,fp);
  4. fclose(fp);

经过以上两步处理之后,我们就得到了可以正常播放的H.264码流

最新文章

  1. Redis学习总结
  2. ThinkPHP的URL重写+路由+伪静态,实现SEO效果。
  3. ubuntu16.04安装jdk,tomcat
  4. 搭建Maven私服
  5. 意外的节点类型 Element。只能在简单内容或空内容上调用 ReadElementString 方法
  6. PCA understanding
  7. 支持HTML5新标签
  8. node express
  9. 生成PDF并下载。
  10. 使用 APPLY
  11. JAVA反射系列之Field,java.lang.reflect.Field使用获取方法
  12. LD_LIBRARY_PATH vs LIBRARY_PATH
  13. 搭建网络yum源
  14. 多个DispatcherServlet有什么用处.md
  15. 使用docker Registry快速搭建私有镜像仓库
  16. [luogu P2234] [HNOI2002]营业额统计
  17. [转]PHP 汉字转拼音
  18. Eclipse安装STS(Spring Tool Suite (STS) for Eclipse)插件
  19. copy assign retain 修饰属性的set 方法
  20. ASP.Net生成静态HTML页

热门文章

  1. 【教程】鼠标右键新建添加RTF文档
  2. Python爬取爱奇艺【老子传奇】评论数据
  3. SQL Server 商业智能
  4. 【论文笔记】Training Very Deep Networks - Highway Networks
  5. 在Mac上安装与使用mitmproxy
  6. IP段对应表
  7. [转]BigDecimal不整除异常
  8. C语言 · 日期计算
  9. GIT——总结.1-
  10. [转]TF-IDF与余弦相似性的应用(一):自动提取关键词