• 音视频封装格式


    mp4(mov.c)

     

    ffmpeg对应ff_mov_demuxer - "mov,mp4,m4a,3gp,3g2,mj2"

    mp4文件由一系列box组成,box 结构如下:

     box 脉络 (蓝色 - containter box, * - full box)

    ftypstsd
    mdatstts
    stss
    mdhdstsz
    tkhdhdlrstsc
    mvhdmdiaminfstblstco
    moovtrakedtselst *

     box 详情

    ftyp - size:32 type:ftyp; (isom - iso base media file)

               major_brand:isom - 4字节编码表示格式,"qt  ",mp41,mp42等

               minor_version:512 - 表示major_brand 的版本号说明信息;

               compatible_brands: isomiso2avc1mp41,具体如下:

    1. 00000000: 0000 0020 6674 7970 6973 6f6d 0000 0200 ... ftypisom....
    2. 00000010: 6973 6f6d 6973 6f32 6176 6331 6d70 3431 isomiso2avc1mp41

    stsd - full box, data=entry个数(4字节)+多个entry实体;

    avcC box(通常size为49=6+2+34+1+2+4,ffmpeg内没有具体解析,nalu大小一般占两个字节,实际(lengthSizeMinusOne & 3)+1)

    configurationVersion(8) AVCProfileIndication(8) profile_compatibility(8) AVCLevelIndication(8)

    reserved(6 ‘111111’b) lengthSizeMinusOne(2) reserved(3 ‘111’b) numOfSequenceParameterSets(低5位)

    spsSize(大端存放) sps numOfPictureParameterSets(8) ppsSize(大端存放) pps

    avcC格式打包的h264是用1、2或4字节NALU长度分割NALU单元,区别AnnexB起始码分割。

    stss - full box - entry_count表示多少个关键帧,numberX表示关键帧序号

    size type(0x73747373) + version(1) flags(3) entry_count(4) number1(4) number2(4) ...

    stsz - full box - sample_size表示采样大小,用于大小一致的音频,否则为0,sample_count表示表示多少个采样,entry_sizeX表示采样的大小

    size type(0x7374737A) + version(1) flags(3) sample_size(4) sample_count(4) entry_size1(4) entry_size2(4)...

    ts(mpegts.c)

    ffmpeg对应ff_mpegts_demuxer - "mpegts"

    PSI 是节目特定信息,包括节目关联表(PAT,Program Association Table)、节目映射表(PMT,Program Map Table)、条件接收表(CAT)、网络信息表(NIT)

    m3u8(hls.c)

    ffmpeg对应ff_hls_demuxer - "hls"

    1. #EXTM3U // 开始
    2. #EXT-X-VERSION:3
    3. #EXT-X-ALLOW-CACHE:YES
    4. #EXT-X-TARGETDURATION:16
    5. #EXT-X-MEDIA-SEQUENCE:0
    6. #EXT-X-PLAYLIST-TYPE:VOD
    7. #EXT-X-KEY:METHOD=AES-128,URI="",IV=0x00000000000000000000000000000000
    8. #EXTINF:11.000000,
    9. news-0.ts
    10. #EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS=“avc1.42e00a,mp4a.40.2”
    11. http://example.com/low/index.m3u8
    12. #EXT-X-ENDLIST // 结束

    flv

    flv header:F(1byte)+L(1byte)+V(1byte)+Version(1byte通常为1)+(5bit为0+1bit音频存在+1bit为0+1bit视频存在)+文件大小(4byte)

    flv body:多个pre tagsize + tag 单元(tag header+tag body)

       tag header:

    tag类型1byte8:audio,9:video,18:script data
    数据区大小3byte
    时间戳3byte
    时间扩展字段1byte
    StreamID3byte

       tag body:

        meta data tag

        audio data tag

        video data Tag

    dav(dhav.c)

    DAHUA或者DHAV0xfd(0x44\0x48\0x41\0x56\0xfd)开始

    最后dhav(0x64\0x68\0x61\0x76\0xfd),结尾偏移长度(小端)

    参考

    FLV协议分析        常见视频封装格式(2) —TS

  • 相关阅读:
    joplin更新后找不到文章
    Cocos Creator 3.6 新特性详解 3/3:性能篇
    P2672 [NOIP2015 普及组] 推销员 day15
    layui移除(删除)table表格的一行
    【kali-密码攻击】(5.2.1)密码分析:Hash Identifier(哈希识别)
    react setState异步操作数据的问题
    进程间通信学习笔记(有名管道和无名管道)
    matlab新手快速上手6(引力搜索算法)
    java使用策略模式优化代码中的if-else if 判断。
    SDS-redis动态字符串
  • 原文地址:https://blog.csdn.net/dadan1314/article/details/113559352