跳到主要内容

MKV 格式(封装容器)

MKV(Matroska Multimedia Container)是开源社区 2002 年开发的开放标准容器格式,以俄罗斯嵌套娃娃命名。支持无限量音轨、字幕和章节,可封装 H.265/VP9 等先进编码,提供 XML 元数据和错误修复功能,是蓝光备份和动画资源的首选封装格式,但硬件播放器兼容性弱于 MP4。

格式简介

MKV 是一种开放的多媒体容器格式,由 Matroska 项目开发。MKV 格式设计灵活,支持多种视频、音频和字幕格式,是开源社区广泛使用的视频容器格式。

MKV 文件扩展名为 .mkv,MIME 类型为 video/x-matroska。MKV 格式完全开源,无专利限制,被广泛用于视频存储和分发。

技术特点

核心特性

  • 多轨道支持:支持无限数量的视频、音频、字幕轨道
  • 章节支持:支持章节标记和导航
  • 元数据支持:支持丰富的 XML 元数据
  • 错误修复:内置错误修复功能
  • 流式支持:支持流式传输

支持的编解码器

  • 视频编解码器:H.264、H.265/HEVC、VP8、VP9、AV1 等
  • 音频编解码器:AAC、MP3、Opus、Vorbis、FLAC 等
  • 字幕格式:SRT、ASS、SSA、VOBSUB 等

Matroska 格式系列

  • MKV:视频文件(Matroska Video)
  • MKA:音频文件(Matroska Audio)
  • MKS:字幕文件(Matroska Subtitles)

文件结构

MKV 文件使用 EBML(Extensible Binary Meta Language)格式:

[EBML 头]                # EBML 标识和版本
[Segment] # 段容器
- Segment Info # 段信息
- Tracks # 轨道定义
- Video Track # 视频轨道
- Audio Track # 音频轨道
- Subtitle Track # 字幕轨道
- Cluster # 数据簇
- Block # 数据块
- Block Group # 数据块组
- Cues # 索引(可选)
- Attachments # 附件(可选)
- Chapters # 章节(可选)
- Tags # 标签(可选)

关键组件

  • EBML 头:标识文件为 EBML 格式
  • Segment Info:包含段的基本信息
  • Tracks:定义所有轨道
  • Cluster:包含实际的音视频数据
  • Cues:用于快速定位的索引

使用场景

适用场景

  • 蓝光备份:蓝光光盘内容备份
  • 动画资源:动画视频存储(支持多音轨和字幕)
  • 高清视频:4K、HDR 视频存储
  • 多语言内容:需要多音轨和多字幕的内容
  • 开源项目:需要开源格式的项目

优缺点

优点:

  • 完全开源,无专利限制
  • 支持多轨道和章节
  • 支持丰富的元数据
  • 错误修复功能
  • 灵活性高

缺点:

  • 硬件播放器兼容性不如 MP4
  • 某些设备可能不支持
  • 文件结构相对复杂

代码示例

Python 处理 MKV

import ffmpeg

# 获取 MKV 文件信息
probe = ffmpeg.probe('video.mkv')
video_info = next(s for s in probe['streams'] if s['codec_type'] == 'video')
print(f"编码: {video_info['codec_name']}")
print(f"分辨率: {video_info['width']}x{video_info['height']}")

# 提取字幕
ffmpeg.input('video.mkv').output('subtitle.srt', codec='srt').run()

使用 FFmpeg

# 转换 MKV 到 MP4
ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4

# 提取字幕
ffmpeg -i input.mkv -map 0:s:0 output.srt

# 提取音轨
ffmpeg -i input.mkv -map 0:a:0 output.aac

# 合并多个文件到 MKV
ffmpeg -i video.mp4 -i audio.aac -c copy output.mkv

Python 使用 pymkv

from pymkv import MKVFile

# 创建 MKV 文件
mkv = MKVFile()
mkv.add_track('video.mp4')
mkv.add_track('audio.aac')
mkv.add_track('subtitle.srt')
mkv.mux('output.mkv')

相关工具

  • 播放器
    • VLC Media Player:跨平台播放器
    • MPC-HC:Windows 播放器
    • Kodi:媒体中心
  • 编辑工具
    • MKVToolNix:MKV 编辑和合并工具
    • FFmpeg:命令行视频处理工具
  • 编程库
    • Python: pymkvffmpeg-python
    • C/C++: libmatroskalibavformat(FFmpeg)

相关链接

参考