如何从编解码器 ID 不匹配(轨道类型错误)的损坏文件中提取视频和音频?

如何从编解码器 ID 不匹配(轨道类型错误)的损坏文件中提取视频和音频?

问题
有很多视频文件只能用自定义播放器播放,我想对其进行逆向工程,以便可以在常见的媒体播放器(如 VLC 或 MPC)上播放视频。

我迄今为止的发现

  • 探测这些文件后发现,它们是 EBML 类型,由Matroska Media 容器

  • 因此我将文件扩展名改为 .mkv,然后使用以下方法进一步检查文件MKVToolNixFFMPEG

  • MKVToolNix探测发现有一个用h.264编码的视频轨道和一个用AC3编码编码的音轨。

  • 但是,通过故意更改“轨道类型”标签,音轨已被“标记”为视频,视频轨道已被“标记”为音频。

MKVToolNix曲目信息截图:

MKVToolNix 曲目信息截图

  • FFMPEG也证实了这一点:

[matroska,webm @ 0x7f966c800a00] 无法在 avformat_find_stream_info 中打开编解码器

[h264 @ 0x7f966c811a00] 编解码器类型或 ID 不匹配
[ac3 @ 0x7f966c812600] 编解码器类型或 ID 不匹配

[matroska,webm @ 0x7f966c800a00] 找不到流 0 (音频:h264 (高),0 个通道) 的编解码器参数:未指定采样率请考虑增加“analyzeduration”和“probesize”选项的值

[matroska,webm @ 0x7f966c800a00] 找不到流 1 的编解码器参数(视频:ac3,无,192 kb/s):未指定大小请考虑增加“analyzeduration”和“probesize”选项的值

(删除)

持续时间:01:46:42.00,开始:0.035000,比特率:2629 kb/s
... 流#0:0(eng):音频:h264(高),0 个通道(默认)

流#0:1(eng):视频:ac3,无,192 kb/s,31.25 fps,31.25 tbr,1k tbn,1k tbc(默认)

疑虑

  1. 是否可以编辑 Matroska 容器并更改媒体轨道的“轨道类型”标签?

  2. 是否可以使用ffmpeg为视频和音轨指定正确的输入编解码器,并提取它们(最好不要重新编码)?

答案1

我无法提交任何 EBML 编辑器或 Matroska Media 容器编辑器来让我轻松更改 Matroska 文件中“轨道类型”的值。

因此只能使用十六进制编辑器直接编辑二进制文件。如果没有 MKVToolNix,这将是一项耗时的任务。MKVToolNix信息工具现在包括在 Matroska 文件中指定数据(标签)位置的巧妙功能!

据其称“曲目类型:音频“位于位置 414 并且”曲目类型: 视频“位于 Matroska 文件中的位置 532。

MKVToolNix信息视图的截图:

MKVToolNix信息视图的屏幕截图

在十六进制编辑器中打开该文件后(试用版Synalyze It! Pro对于 macOS),只需在 MKVToolNixInfo 指向的位置搜索数据即可。截图:

Hex 编辑器的屏幕截图

我们发现位置 414 包含数据83 81 02声音的- 对于标签“轨道类型”) 且位置 532 包含数据83 81 01(视频- 对于标签“轨道类型”)所以我们只需要互换和替换这些数据即可。

相关内容