MKV文件格式学习

  |   0 评论   |   227 浏览

简介

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

参考

评论

发表评论

validate