简介
MKV 是开源的多媒体封装格式,是 Matroska 媒体系统中的一种文件格式。
优势
Matroska 媒体格式最大的优势是,通过 EBML 框架,可以支持所有已知的音视频格式,同时支持未来新出现的音视频格式。
EBML Extensible Binary Meta Language 框架,允许在向后兼容性的基础上,增加容器格式的新特征。
常见的扩展名
常见扩展名有:
- mkv(视频,含音频和字幕)
- mka(纯音频)
- mks(纯字幕)
- mk3d(3d 视频,含音频和字幕)
播放器和解码器
常见的播放器,只要安装了 Matroska 解码器,即可以播放 mkv 文件。
特点
- 文件内快速查找
- 高错误恢复率
- 分章节
- 可选字幕
- 可选音频轨
- 模块化的可扩展性
- 基于互联网的流传输
- 类 DVD 的菜单
EBML
Document 由 EBML Element 组成,EBML Element 定义为:
typedef struct { vint ID; // EBML-ID vint size; // size of element char data[size]; // data } EBML_ELEMENT;
其中 vint (Unsigned Integer Values of Variable Length) 是可变长度类型。
MKV 结构
Header
Meta Seek Information
Segment Information
Track
Chapters
Clusters
Cueing Data
Attachment
Tagging
使用工具查看 MKV 结构
安装 mkvtoolnix
,执行
mkvinfo file.mkv
使用测试文件 https://www.sample-videos.com/video/mkv/240/big_buck_bunny_240p_1mb.mkv
,
结果为
+ EBML head |+ EBML version: 1 |+ EBML read version: 1 |+ EBML maximum ID length: 4 |+ EBML maximum size length: 8 |+ Doc type: matroska |+ Doc type version: 2 |+ Doc type read version: 2 + Segment, size 1055662 |+ Seek head (subentries will be skipped) |+ EbmlVoid (size: 148) |+ Segment information | + Timestamp scale: 1000000 | + Multiplexing application: Lavf53.24.2 | + Writing application: Lavf53.24.2 | + Segment UID: 0xd0 0x73 0xe6 0xe9 0x83 0x1c 0x2b 0x98 0x86 0xa0 0x51 0xfd 0x4d 0x28 0x24 0xe6 | + Duration: 9.818s (00:00:09.818) |+ Segment tracks | + A track | + Track number: 1 (track ID for mkvmerge & mkvextract: 0) | + Track UID: 1 | + Lacing flag: 0 | + Language: und | + Default flag: 1 | + Codec ID: V_MPEG4/ISO/AVC | + Track type: video | + Default duration: 40.000ms (25.000 frames/fields per second for a video track) | + Video track | + Pixel width: 320 | + Pixel height: 240 | + Display width: 320 | + Display height: 240 | + Display unit: 3 (aspect ratio) | + CodecPrivate, length 37 (h.264 profile: Main @L2.0) | + A track | + Track number: 2 (track ID for mkvmerge & mkvextract: 1) | + Track UID: 2 | + Lacing flag: 0 | + Language: und | + Default flag: 1 | + Codec ID: A_AAC | + Track type: audio | + Audio track | + Channels: 6 | + Sampling frequency: 48000 | + CodecPrivate, length 2 |+ Tags | + Tag | + Targets | + Simple | + Name: ENCODER | + String: Lavf53.24.2 |+ Cluster
使用 Java 查看 MKV 结构
依赖
<dependency> <groupId>com.github.kokorin</groupId> <artifactId>jebml</artifactId> <version>2.3.1</version> </dependency>
调用
fileStr = "big_buck_bunny_240p_1mb.mkv"; DataSource source = new FileDataSource(fileStr); MatroskaFile file = new MatroskaFile(source); file.readFile(); System.out.println(file.getReport());
结果
MatroskaFile report Infomation Segment Segment Title: null Segment Date: null Muxing App : Lavf53.24.2 Writing App : Lavf53.24.2 Duration : 9.818sec TimecodeScale : 1000000 Track Count: 2 Track 0 TrackNo: 1 TrackUID: 1 TrackType: VIDEO DefaultDuration: 40000000 Name: unnamed Language: und CodecID: V_MPEG4/ISO/AVC CodecPrivate: 37 byte(s) PixelWidth: 320 PixelHeight: 240 DisplayWidth: 320 DisplayHeight: 240 Track 1 TrackNo: 2 TrackUID: 2 TrackType: AUDIO DefaultDuration: 0 Name: unnamed Language: und CodecID: A_AAC CodecPrivate: 2 byte(s) SamplingFrequency: 48000.0 Channels: 6 Tag Count: 1 Tag Entry SimpleTag Name: ENCODER Value: Lavf53.24.2 End report
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于