出自:http://www.mworkbox.com/wp/work/314.html

2013-05-04

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的。
来源文档:http://msdn.microsoft.com/zh-cn/library/dd757808(v=vs.85).aspx
(二)其次,通过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;
        }
    }

转载于:https://www.cnblogs.com/lihaiping/p/5284600.html

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

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

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

  2. 优酷视频kux格式转换为MP4的两种技巧

    优酷作为老牌的视频站点,每天都有很多人在上面看视频.也有一些朋友会将视频从优酷上下载下来,放到手机上进行观看.可是,如果下载的视频跟手机尺寸不匹配怎么办呢?而且优酷视频只能在优酷上才能够播放,对于那些 ...

  3. springmvc配置同时支持html和jspl两种格式的页面

    通常情况下,springmvc返回一种格式的文件,通过配置前缀和后缀,相应controller层只需返回字符串,就可以跳转到相关页面. 有时候,项目中html和jsp页面同时存在,如果不做特殊配置,需 ...

  4. Python 不改变Excel单元格样式—xls和xlsx两种格式

    因为xls和xlsx两种格式,xlsx是被加密了传统的方式读取修改不了 下面是xls格式读取修改 # -*- coding: utf-8 -*-# # ------------------------ ...

  5. POST请求的两种格式

    1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可 ...

  6. Java使用poi导出数据到excel(包括xls和xlsx两种格式)并通过浏览器下载

    情景:将数据导出到excel是java开发常用的功能,数据量不大的时候,xls和xlsx两种格式的文件都行,但是数据量太大的时候就有区别了,xls格式的文件一个sheet页最多只能存六万多条数据,而x ...

  7. java excel api xlsx_Java 解析Excel(xls、xlsx两种格式)

    Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...

  8. Java 解析Excel(xls、xlsx两种格式)

    Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...

  9. HDMI原理详解以及时序流程(视频是三对差分信号,音频Audio是PCM级(无压缩)传输,包含在数据包内,依靠协议规定采样)HDMI可以传输RGB与YUV两种格式

    资料来源:HDMI介绍与流程 - TaigaComplex - 博客园 最近要用ZYNQ开发版的HDMI做显示,看着硬件管脚和例程只能发呆,于是决心去弄清楚HDMI的工作原理,查找了很多资料,都是碎片 ...

最新文章

  1. 基于Python的人工智能美颜系统
  2. R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析、用虚线标记进行数据填充的区域
  3. 乘客公交车上被盗 司机该不该停车闭门等警察
  4. 计算机网络-基本概念(11)【应用层】
  5. win10user文件夹迁移_Win10用户文件如何从系统盘转到其他盘
  6. kmp有next和nextval的C语言,KMP模式匹配算法中next和nextval的求解(轉)
  7. (25)软件工程开发规范
  8. 【Firewalld(Iptables)】
  9. 线上Linux服务器运维安全策略经验分享
  10. 【python】conda配置python项目环境(Conda常用命令)
  11. c语言课程设计物业,C语言课程设计报告--物业管理系统.doc
  12. 手把手教你做一个简单的VB数据库程序
  13. 直播视频卡顿延迟时如何优化
  14. 输入中文错误:\xE4\xBB\x8E\xE5\x85\xA5...‘ for column ‘detail‘ at row 1
  15. 怎么查看网站的域名 如何查询网站的IP地址
  16. 2011斯坦福大学iOS应用开发教程学习笔记(第六课)故事版
  17. Ubuntu 20.04 -中文输入法-fcitx-connection failed [ip:91.189.91.38 80]
  18. http常用请求头与响应头字段详解
  19. 配置 SNAT 和NAT
  20. 创新案例分享 | 建设医院绩效管理系统,促进医院健康良性发展

热门文章

  1. Flash入门教程:给任意照片添加雪景动画_Flash_||太平洋电脑网
  2. 来 COSCon'21 北京线下聚会,将开心开源进行到底!
  3. vscode通过ssh扩展连接Linux虚拟机
  4. android开发apk在qq发送无法正常安装的问题
  5. 百度编辑器-Ueditor
  6. Linux 进程间通信之 - 信号量
  7. ubantu 后台运行Django
  8. MAN PVCREATE
  9. 数商云X日本高化学,共同打造跨境化学品B2B平台新范式
  10. 黑马程序员Java零基础视频教程_上部(P1-P80)