MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略。笔者也是在改编LIVE555流媒体时,增加mp4文件类型支持时遇到了该问题。(一)首先,从原理上了解一下这2种格式的区别:AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的。H264 描述:H.264 bitstream with start codes.一般对于一下HDVD等电影的压制格式,是带有起始码0×00000001的。(二)其次,通过VLC播放器,可以查看到具体的格式。打开视频后,通过菜单【工具】/【编解码信息】可以查看到【编解码器】具体格式,举例如下,编解码器信息:编码: H264 – MPEG-4 AVC (part 10) (avc1)编码: H264 – MPEG-4 AVC (part 10) (h264)(三)最后,分享一下ffmpeg demux MP4文件后,转换视频流为live555可直接使用的h264 ES流的经验和方法:针对(avc1),av_read_frame后,取前四个字节为长度,把前四字节直接替换为0×00,0×00,0×00,0×01即可,但注意每个frame可以有多个NAUL:  AVPacket pkt;    AVPacket* packet = &pkt;    av_init_packet(packet);    av_read_frame(ctx, packet);

if(packet->stream_index == 0)    {//is video stream

       const char start_code[4] = { 0, 0, 0, 1 };            if(is_avc_ || memcmp(start_code, packet->data, 4) != 0)            {//is avc1 code, have no start code of H264                int len = 0;                uint8_t *p = packet->data;

                is_avc_ = True;                do                 {//add start_code for each NAL, one frame may have multi NALs.                    len = ntohl(*((long*)p));                    memcpy(p, start_code, 4);

                    p += 4;                    p += len;                    if(p >= packet->data + packet->size)                    {                        break;                    }                } while (1);            }        }对于另外一种格式,(h264), 则直接对每个packet调用av_bitstream_filter_filter处理每个packet即可:  bsfc_ = av_bitstream_filter_init("h264_mp4toannexb");

   if(pkt->stream_index == 0)   {//is video stream

      AVBitStreamFilterContext* bsfc = bsfc_;        int a;        while (bsfc) {            AVPacket new_pkt = *pkt;            a = av_bitstream_filter_filter(bsfc, encode_ctx_, NULL,                &new_pkt.data, &new_pkt.size,                pkt->data, pkt->size,                pkt->flags & AV_PKT_FLAG_KEY);            if(a == 0 && new_pkt.data != pkt->data && new_pkt.destruct) {                uint8_t *t = (uint8_t*)(new_pkt.size + FF_INPUT_BUFFER_PADDING_SIZE); //the new should be a subset of the old so cannot overflow                if(t) {                    memcpy(t, new_pkt.data, new_pkt.size);                    memset(t + new_pkt.size, 0, FF_INPUT_BUFFER_PADDING_SIZE);                    new_pkt.data = t;                    a = 1;                } else                    a = AVERROR(ENOMEM);            }            if (a > 0 && pkt->data != new_pkt.data) {                av_free_packet(pkt);                new_pkt.destruct = av_destruct_packet;            } else if (a < 0) {                envir() << "!!!!!!!!!!av_bitstream_filter_filter failed" << ",res=" << a << "\n";            }            *pkt = new_pkt;

            bsfc = bsfc->next;        }    }

AVC1和H264的区别及利用相关推荐

  1. MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项

    原文:http://www.mworkbox.com/wp/work/314.html MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略.笔者也是在改编LIVE555 ...

  2. (转)MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项

    出自:http://www.mworkbox.com/wp/work/314.html 2013-05-04 MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略.笔者也 ...

  3. 技术贴:解码时AVC1和H264的区别

    我一直疑问为什么有些视频解码时显示格式是:H264,大部分又是:AVC1 我在搜索编程资料时在微软的msdn上发现的: 原文:http://msdn.microsoft.com/en-us/libra ...

  4. AVC1与H264的区别

    今天上网时偶尔发现这个在我脑海里疑惑的问题的答案. H.264 Video Types The following media subtypes are defined for H.264 video ...

  5. H264/AVC视频解码时AVC1和H264的区别

    The following media subtypes are defined for H.264 video.

  6. H.264 x264 h264 AVC1的关系和区别

    H.264是MPEG4的第十部分,是一个标准. 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. x264是一个编码器,他参照的 ...

  7. AVC1与H264的差别

    今天上网时偶尔发现这个在我脑海里疑惑的问题的答案. H.264 Video Types The following media subtypes are defined for H.264 video ...

  8. 技术贴:解码时AVC1和H264的差别

    我一直疑问为什么有些视频解码时显示格式是:H264,大部分又是:AVC1 我在搜索编程资料时在微软的msdn上发现的: 原文:http://msdn.microsoft.com/en-us/libra ...

  9. == ===区别,利用!= !==判空。

    之前在一个项目中需要对后台传过来的数据进行判断是否为空的处理我写了 if(data !== "")之后被公司前辈看见了给我改成了if(data!=""); 于是 ...

最新文章

  1. geany配置python_Linux系统下搭建基于Geany+Python开发环境
  2. Python中docstring文档的写法
  3. 卷积神经网络的网络层与参数的解析
  4. C之printf()函数
  5. myeclipse中导入android项目后无法视图下查看XML视图
  6. linuxl下创建mysql用户和组_Linux中用户与用户组管理
  7. srsLTE源码学习:RLC,无线链路控制子层抓包rlc_pcap.h,rlc_pcap.cc
  8. Vysor_2.1.2破解,及安装包
  9. python上三角九九乘法表_用5行Python代码打印九九乘法表
  10. 九宫格c语言实验报告,9X9,九宫格测试,C编程。
  11. SNMP弱口令导致的网络入侵
  12. 太戈编程DEVC++教师答案库
  13. Wagtail 教程 2:简单博客实现
  14. 微信小程序赞赏功能,非微信赞赏功能
  15. Python数据分析学习 二
  16. 如何将Google表格电子表格插入Google文档
  17. 软件工程网络15个人作业3——案例分析(201521123107)
  18. esclip直接快捷键构造函数_IntelliJ Idea 常用快捷键
  19. 涪陵创新计算机学校2015元旦晚会,涓涓之情助力成才丨重庆市涪陵创新计算机学校助推纳雍脱贫...
  20. Tomcat配置问题(踩坑记录)

热门文章

  1. Zend Frameworks 3 官网例子Album Module的结构分析
  2. 我从平面设计师转行做程序猿
  3. LNMP架构环境搭建流程很详细
  4. 【Android】Android Parcelable 源码解析
  5. 在成长的路上,我们都是孤独的赶路人!
  6. 那些高阅读量文章的标题都是怎么取的?14种模板直接套用
  7. MySQL之锁-行级锁
  8. 古筝 4 ·7 音按音几种方法技巧
  9. 重庆电信强化线上渠道基础管理
  10. 渗透测试神器Nessus使用教程