本篇笔记主要记录
AVS2
向MKV
提交过程中的学习内容,主要包含:
MKV
格式介绍MKV
工作方式MKV
修改应用主要参考链接: MKV - Matroska Home page // 各部分标注在相应标题中
1 What's MKV
Matroska aims to become THE standard of multimedia container formats. It was derived from a project called MCF, but differentiates from it significantly because it is based on EBML (Extensible Binary Meta Language), a binary derivative of XML. EBML enables the Matroska Development Team to gain significant advantages in terms of future format extensibility, without breaking file support in old parsers.
-
MKV
是Matroska
格式中的一种后缀,是人们对Matroska
的惯称 -
MKV
即Matroska
是一种基于EBML
语言(XML
的二进制衍生格式,详见 EBML)的音视频封装格式 -
MKV
并不是某种音频或视频格式,而是对多个音视频流的封装存储(详见 封装) -
MKV
是一种面向存储的封装格式(类似.avi
.mov
.mp4
,区别.flv
.ts
) -
MKV
完全开源,项目地址:Matroska-Org/libmatroska -
EBML
项目地址:Matroska-Org/libebml
2 How MKV
2.1 Diagram - 文件结构
注:各段不是必须存在,也不仅限于上述种类,图中比例与实际数据量无关,各段详细结构参见:Detailed Diagram
2.2 Specifications - 规格草案
此处只记录该草案主要内容:
- EBML原理介绍 // 基础数据类型等
- 基础语义元素 // 名称、标志位、参数等
- 附录 // 使用语言、块结构等
具体参数要求详见 Specification Notes 以及 EBML Elements Order Guidelines.
2.3 Codec Specs - 编解码器说明
For each TrackEntry inside matroska, there has to be a CodecID defined. This ID is represent the codec used to encode data in the Track. The codec works with the coded data in the stream, but also with some codec initialisation. There are 2 different kind of codec "initialisation" :
- CodecPrivate in the TrackEntry
- CodecState in the BlockGroup
Each of these elements contain the same kind of data. And these data depend on the codec used.
对于各种codec
,MKV
只需要其提供一个基本的CodecID
用于标识,并允许其根据需要定制初始化部分。
个人理解:MKV
不负责编解码器的细节,它的作用只是向播放器解释流的类型,以及向解码器传递所需的信息。在播放过程中需要的信息都会从标签中找到,即使什么都没有提供也只是降低了性能。
2.4 Video Tags Example - 视频标签
该部分以及 Matroska Test Suite 应该说都是 Matroska 对视频质量提升的一种建议。
Video content usually doesn't have tags in the file. But that doesn't mean it's a good thing. Here are some real-life examples where it makes sense to have tags. As for audio you can have all video parts of a bigger ensemble in the same file or in smaller files.
常规视频中很少包含(现在多了)一些与视频内容有关的“非必要”标签,但实际上这些标签还是很有意义的。MKV
提供了视频标签的支持,并给出了一些范例。(而在 Matroska Test Suite 中主要是对视频自测的一些内容)
3 修改MKV支持AVS2
想要在
MKV
中加入新的codec
支持第一部应该是加入对应的描述,即CodecID
,则首先应该向MKV
标准提交相应的CodecID
申请,提交的地址:Matroska-Org/matroska-specification确定使用的
CodecID
后,在FFmpeg
和VLC
中,分别找到MKV
的编解码器描述符定义位置:ffmpeg/libavformat/matroska.c
和vlc/modules/demux/mkv/matroska_segment_parse.cpp
,在其中加入Mkv_CodecID => Player_CODEC_ID
的对应关系重新编译后测试
ffmpeg
的支持(使用版本为FFmpegAVS2):
./ffmpeg -i test.avs2 -c:v copy test.mkv
重新编译后测试VLC
支持(使用版本为之前自己改的VLC-AVS2
):直接播放 test.mkv
结果还是很不错的,单纯从效果看的话。视频压的很短,目前还缺乏充足的测试(跳转、同步等等)。
但想来想去还是有不少问题:
只加入
CodecID
就能播放新编码了?
当然不,加入codec
体系间的对应关系只是让播放器顺利地找到了我们之前写的解码器。能不能向这个
MKV
添加别的内容?
应该可以,比如这个序列的描述性的Tags
,或者添加用于跳转的Chapters
,以及按需求加入Attachment
。是不是还需要考虑初始化的问题
MKV
是按帧存储的吗,如果是,每一帧是怎么存储的,如果不是,又是怎么打的PTS
ffmpeg
在copy
过程中到底做了什么,他到底向MKV
中写入了什么MKV
的测试序列和标准说明应该如何制作与提交
... ...
还是懂得太少。