在修复损坏的 GoPro 文件的过程中,我正在编写一个基于 MPEG4 解析库的解码器,但我现在必须深入挖掘 h265 流,而且我很难找到第一个 NAL 单元的起始位置。
我读到,mdat 框当然以它的标头(大小和“mdat”)开始,后面跟着 NAL 单元,并且每个 NAL 单元都以 32 位编码的大小开始。 但是,在测试文件中,mdat 框的开头如下:
01 6c 49 56 6d 64 61 74 47 50 52 4f 6c 02 00 00
48 44 38 2e 30 31 2e 30 32 2e 35 31 2e 30 30 43
33 33 34 31 33 32 36 37 37 38 31 35 34 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f1
82 0c 83 79 06 7e 42 45 b3 a8 f0 62 6f cc 2e 43
33 33 33 31 33 35 31 36 39 38 35 30 38 00 48 45
52 4f 38 20 42 6c 61 63 6b 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 0c 1e 00 ce
我将开始解码为:
01 6c 49 56 => size 0x01634956: OK
6d 64 61 74 => 'mdat': OK
47 50 52 4f 6c => 'GPRO1' ??? That cannot be not a size or NAL unit header.
在上面后面的接下来的字节中,我可以找到其他 ascii 字符串,例如相机的序列号、型号名称、固件版本可能等,然后是诸如 HIGH 和 AUTO 之类的单词,以及许多组 00 字节,它们显然是不是压缩视频的一部分。 据我所知,真正的“随机”(或者更确切地说“不可预测”)字节仅在 mdat 框开始后的 850 字节左右开始。
知道这个标头是什么以及如何确定实际 NAL 单元的开始位置吗?
“mdat”几乎可以包含任何内容。
所以这有点像把汉堡变回牛。
我会拿起 GoPro 并使用相同的设置进行新的录制。 相同的视频分辨率、比特率和音频质量。 从新的录制中 - 您可以了解摄像机如何交错视频、音频和元数据。我猜测相机将使用某种固定的模式。 正确的 MP4 文件将包含视频流的基本元数据,这些元数据可能在损坏的文件中不可用。因此,您需要从新录制的文件中复制此元数据。 我将使用新录制的视频并使用 ffmpeg 将 H.265 流复制到基本流中。现在您有了要使用的目标格式。 您将获得一个模板,显示您要插入 AUD、PPS、SPS 等。
这应该使您能够重建视频流。 这不是一个超级简单的任务,需要了解 MPEG-4 容器和 H.265 流语法。