zoukankan      html  css  js  c++  java
  • 【多媒体封装格式详解】---MKV

    http://blog.csdn.net/tx3344/article/details/8162656#

    http://blog.csdn.net/tx3344/article/details/8176288

    Matroska 开源多媒体容器标准。MKV属于其中的一部分。
    Matroska常见的有.MKV视频格式、MKA音频格式、.MKS字幕格式、.MK3D files (stereoscopic/3D video).

    官方介绍文档:

    http://www.matroska.org/technical/diagram/index.html#detailed

    Header
    Meta Seek Information
    Segment Information
    Track
    Chapters
    Clusters
    Cueing Data
    Attachment
    Tagging

     官方介绍文档部分翻译:

    Header:

    1. 该文件所使用的EBML版本及类型

    Metaseek:

    1. 其包含其他组在文件中的位置,如:Track information, Chapters, Tags, Cues, Attachments等.
    2. 该元素不是必要的,如果没有该元素,要找到其他的Level 1 elements需要搜索整个文件.这是因为其他items可已任意顺序排列,如Chapters可能在Clusters的中间, 这是EBML和Matroska的灵活性的一部分

    Segment Information:

    1. 包含文件的基本信息.包括文件title一个唯一的ID,使得该文件可以在世界各地被识别(可能是一系列文件的一部分)

    Track:

    1. 包含关于每个轨道的基本信息, 如音视频标识, 分辨率, 采样率, 编码类型及编码私有数据(private data)

    Chapters:

    1. 其包含所有的章节(是jump到音视频的一种方式(通过设置预定义的点))

    Clusters:

    1. 包含所有的Clusters(包含所有轨道的视频/音频帧)

    Cueing Data:

    1. 包含每一个轨道的索引. 很像MetaSeek, 但其用于seek到指定的播放时间. 如果没有该section也可以seek, 但是会非常麻烦(播放器必须搜索整个文件去获取正确的时间戳)

    Attachment:

    1. 可以附加任何类型的文件(What you attach is up to you.)

    Tags:

    1. 包含该文件及所有轨道的标签(类似ID3中的tags, 包含视频制作者, 签发者, 演员信息等)

     注:ebml中同级别的元素没有特定的顺序

    Level 0
    Grouping
    Level 1
    Level 2 Level 3
    EBML
    Header
    EBMLVersion
       
    DocType
       
    Segment
    Meta Seek Information
    SeekHead
    Seek
    SeekID
    SeekPosition
    Seek
    SeekID
    SeekPosition
    Segment Information
    Info
    Title  
    SegmentUID  
    Track
    Tracks
    TrackEntry
    Name
    TrackNumber
    TrackType
    TrackEntry
    Name
    TrackNumber
    TrackType
    Chapters
    Chapters
    Edition Entry  
    Clusters
    Cluster
    Timecode  
    BlockGroup Block
    BlockGroup
    Block
    ReferenceBlock
    BlockGroup Block
    Cluster
    Timecode  
    BlockGroup Block
    BlockGroup Block
    BlockGroup Block
    BlockGroup
    Block
    BlockDuration
    Cueing Data
    Cues
    CuePoint
    CueTime
    CuePosition
    CuePoint
    CueTime
    CuePosition
    Attachment
    Attachments
    AttachedFile
    FileName
    FileData
    AttachedFile
    FileName
    FileData
    Tagging
    Tags
    Tag
    MultiTitle
    Language
    Tag
    MultiTitle
    Language

     complex representation:

    Header:

    1. 必须放在文件头部, 这样库才能知道是否能读取该文件
    2. EBML是非常简单的, 其并不只是用于Matroska, 同样也用于其他一些潜在的应用.正因为如此, 其才有版本更新的可能性.EBMLVersion元素可以让解析器知道是否该读取该文件

    DocType:

    1. 其指明这是一个Matroska文件
    2. 如果是其他类型的ebml文件, 那Matroska的解析器虽然可以解析ebml, 但其无法处理文件内部的数据

     Meta Seek:

    1. 让parser知道文件中主要部分的位置.
    2. 仅有一个SeekHead
    3. 通常用来获取文件的信息
    4. 当回放文件seek时, 使用的是Cues

    Segment Information:

    1. 提供识别该文件的信息.包含title和SegmentUID(一个随机数)

     Track:

    1. 由Name + TrackNumber + TrackType组成
    2. 同时包含语言类型, 编码类型, TrackUID等

     Clusters:

    1. 拆Blocks, seek及错误保护
    2. 没有限制可包含多少或多长时间的数据(开发者通常限制在5s或5m之内)
    3. 每一个Cluster的开头是一个时间戳(通常是Cluster中第一个block的播放时间,but it doesn't have to be.)
    4. 每一个Cluster含有一个或多个BlockGroups
    5. 每个BlockGroup包含一个block data和与该block相关的任何信息
    6. The ReferenceBlock shown above, in the BlockGroup, is what we use instead of the basic "P-frame"/"B-frame" description.

    Cues:

    1. 用于seek
    2. 十分灵活, 可以为每一个block建立索引. 对于视频文件, 也可以仅对关键帧建立索引

    有两个时间戳需要注意:

    1. Cluster中的时间戳  =>相对于整个文件
    2. Block 结构中的时间戳=>相对于该Cluster中的时间戳

    Libs

    NameVersionUpdated
    (on this page)
    Link
    libebml 1.3.3 2015-10-21 Download
    Comment:
    libmatroska 1.4.4 2015-10-20 Download
    Comment:
    yamka   2010-04-21 Homepage
    Comment:

    http://www.matroska.org/downloads/windows.html

    1.EBML(Extensible Binary Meta Language)


    MKV是建立在EBML这种语言的基础上,所以要了解MKV格式需要先了解EBML这种语言。

    EBML是一种类似于XML格式的可扩展二进制元语言,使用可变长度的整数存储,以节省空间。

    EBML基本元素结构:

    typedef struct {
    vint ID // EBML-ID
    vint size // size of element
    char[size] data // data
    } EBML_ELEMENT;

    ID标志属性类型

    size为后面data部分的大小

    data部分为ID所标识属性的实际数据

    上面可以看到ID和size的类型都是vint,vint(Unsigned Integer Values of Variable Length)可变长度无符号整型,比传统32/64位整型更加节省空间。

    长度计算方法为

    长度 = 1 +整数前缀0比特的个数.

    从MKV文件中简单接一段来举个例子。这是16进制表示方式


    因为每个EBML元素都是由ID size data 三部分组成,我们就按照这些来分析。

    将0x428 转成2进制 为  按照上面规则  前面有1个0 所以知道ID的长度为2,也就是0x4282为ID值。

    将0x88 转成2进制为 10001000 1为开头 长度就是1,去掉前缀1变成了00001000 ,也就是 size的值为 8.

    DocType 也就是说data的内容是string格式,所以转成askII码 data值就是“matroska” 和后面显示的一致。

    DocType = matroska。

    yingc@yingc:~/download$ hexdump  -n 128 -C V5003[HP@L4.1. 1080P(1840x1000). AAC 1.14M ] Mobile.Gundam.mkv 
    00000000  1a 45 df a3 93 42 82 88  6d 61 74 72 6f 73 6b 61  |.E...B..matroska|
    00000010  42 87 81 01 42 85 81 01  18 53 80 67 01 00 00 01  |B...B....S.g....|
    00000020  36 d7 f2 4a 11 4d 9b 74  d1 4d bb 8c 53 ab 84 15  |6..J.M.t.M..S...|
    00000030  49 a9 66 53 ac 82 10 03  4d bb 8c 53 ab 84 16 54  |I.fS....M..S...T|
    00000040  ae 6b 53 ac 82 10 ce 4d  bb 8f 53 ab 84 11 4d 9b  |.kS....M..S...M.|
    00000050  74 53 ac 85 01 36 d6 d0  d8 4d bb 8f 53 ab 84 1c  |tS...6...M..S...|
    00000060  53 bb 6b 53 ac 85 01 36  d6 04 cf 4d bb 8c 53 ab  |S.kS...6...M..S.|
    00000070  84 10 43 a7 70 53 ac 82  15 ca ec 4f aa 00 00 00  |..C.pS.....O....|
    00000080
    yingc@yingc:~/download$ 
    
    #define EBML_ID_HEADER             0x1A45DFA3
    1090 static int matroska_probe(AVProbeData *p)
    1091 {
    1092     uint64_t total = 0;
    1093     int len_mask = 0x80, size = 1, n = 1, i;
    1094
    1095     /* EBML header? */
    1096     if (AV_RB32(p->buf) != EBML_ID_HEADER)
    1097         return 0;

    aa

  • 相关阅读:
    SC Alibaba20211102 Nacos 微服务框架结构 SerivceImplOrder <OpenFeign> SerivceImplMember 群
    SC Alibaba20211030 Nacos 微服务框架结构 SerivceImplOrder <OpenFeign> SerivceImplMember
    SC Alibaba20211028 Nacos 微服务框架结构 SerivceImplMember
    SC Alibaba20211022 Nacos 负载均衡 rest|feign(ribbon) ----@loadbalancer
    springboot启动多个实例
    SC Alibaba20211019 Nacos 手写LoadBalancer LoadBalancerClient
    SC Alibaba20211018 Nacos discoveryCient-restTemplate调用
    SC Alibaba20211017 Nacos 命令 测试服务、配置功能 postman
    mysql性能测试(SQL_CALC_FOUND_ROWS)
    GIS相关的一些常用操作(持续记录...)
  • 原文地址:https://www.cnblogs.com/jingzhishen/p/3833402.html
Copyright © 2011-2022 走看看