解码专有 HEVC/MP4 流
Decoding a proprietary HEVC/MP4 stream
有一次我完全没有想法,希望有一个圣人。
我目前正在尝试解码和使用 IP 摄像机的专有视频流,我觉得我已经很接近了,但就是找不到最后一块拼图。相机设置为 1 FPS、CBR 和 I-Frame 间隔 1 以实现最大一致性。
我目前所做工作的概述:缓冲数据包,寻找 header 相机的专有协议(35 字节),寻找另一个/下一个,将两者之间的所有内容刷新到文件中(为了缘故post,这叫做 "segment"),冲洗,重复。
如果我将流设置为非常低的质量,即比特率非常低的 352*288,我可以在 MPC 中打开并播放生成的文件,绝对没问题(或者用 FFMPEG 转换它,然后播放它在 VLC 中)。
但问题来了:通过越来越多地提高视频质量,在某个点之后,视频开始损坏。当这种情况发生时,也开始发生一件事:找到的最大值 "segment" 上限为 8183 字节(我发现这是一个非常特殊的大小,因为它非常接近 2^13)。因此,我决定研究每当遇到 8176 部分时实际写入的内容,我发现的内容似乎也确实非常奇特 - 许多几乎匹配的字节! (这些字节仅针对帧的 first 8176 段写入)
示例 1:
0000 0001 4001 0c01 ffff 0160 0000 0300 b000 0003 0000 0300 3cac 0900 0000 0142 0101 0160 0000 0300 b000 0003 0000 0300 3ca0 0b08 0485 8dae 4932 fcdc 0404 0402 0000 0001 4401 c0f2 f03c 9000 0000 014e 01e5 04cc cc00 0080 0000 0001 2601 af1b 686f 315f 8bcd 7007
示例 2(几秒钟后):
0000 0001 4001 0c01 ffff 0160 0000 0300 b000 0003 0000 0300 3cac 0900 0000 0142 0101 0160 0000 0300 b000 0003 0000 0300 3ca0 0b08 0485 8dae 4932 fcdc 0404 0402 0000 0001 4401 c0f2 f03c 9000 0000 014e 01e5 049b 9b00 0080 0000 0001 2601 af17 68c3 3d14 cf63 2cab
如您所见,在 8000 0000 0126 01af
之前,它们似乎是某种类型的 header for / by.. something。 编辑: 似乎这部分包含了随后帧的 VPS / SPS / PPS。
似乎分路器根本不知道当前帧比初始的 8176 字节段有更多的数据,看看在一个帧由一个 8176 字节段和一个 ~2000 字节段组成的质量设置下如何视频的上三分之二部分还不错,只有在下端才开始损坏。随着我增加流的比特率,这个 "point of corruption" ofc 越来越高。
你为什么不用合适的相机?!
这个相机其实还不错
然后就使用它的普通 RTSP 流?
问题是我什至开始这样做的原因 - 它仅支持 UDP 上的 RTSP,而此专有协议在 TCP 上运行,如果存在数据包丢失(存在),RTSP 流将开始损坏,这我正在努力避免发生这种情况。
希望这里有人可以帮助我。如果您需要示例文件或任何东西,我很乐意为任何有兴趣尝试帮助我的人提供它们。
谢谢!
编辑: 看来我可能有所作为。我刚刚下载了 Zond 265(一种 HEVC 分析器)的试用版,当打开其中的结果文件时,每一帧都出现 "Unexpected remaining X bytes found" 和 "end_of_subset_one_bit shall be equal to 1" 错误。因此,如果我只取出那些剩余的位并删除它前面的那部分位 - 这两个错误都会消失! (出现了一个新的,解码 CTU #x:异常)图像显然仍然损坏,因为现在缺少信息,但至少它有一些需要解决的问题。仍然不知道下一步是什么。
所以我已经设法解决了我的问题,这就是我所做的。我在一些不可靠的网站上发现了一个 DVR 软件,它支持完全相同的协议并设法通过它访问摄像机。然后我通过它记录了流,以及通过我的软件和 bindiffing 两个结果是给了我最后的点击。事实证明,我从 header 中切掉了太多字节(几乎切入了视频流数据),但并非总是如此。偶尔(并且在第一帧)响应 header 似乎比大多数时候长 8 个字节,这由以 00 00 01 FC 开头的视频流表示。因此,通过将我一直切下的这 8 个字节添加到流中,或者在那种情况下将它们切掉,我得到了一个 non-corrupted 视频流 :)
有一次我完全没有想法,希望有一个圣人。
我目前正在尝试解码和使用 IP 摄像机的专有视频流,我觉得我已经很接近了,但就是找不到最后一块拼图。相机设置为 1 FPS、CBR 和 I-Frame 间隔 1 以实现最大一致性。
我目前所做工作的概述:缓冲数据包,寻找 header 相机的专有协议(35 字节),寻找另一个/下一个,将两者之间的所有内容刷新到文件中(为了缘故post,这叫做 "segment"),冲洗,重复。
如果我将流设置为非常低的质量,即比特率非常低的 352*288,我可以在 MPC 中打开并播放生成的文件,绝对没问题(或者用 FFMPEG 转换它,然后播放它在 VLC 中)。
但问题来了:通过越来越多地提高视频质量,在某个点之后,视频开始损坏。当这种情况发生时,也开始发生一件事:找到的最大值 "segment" 上限为 8183 字节(我发现这是一个非常特殊的大小,因为它非常接近 2^13)。因此,我决定研究每当遇到 8176 部分时实际写入的内容,我发现的内容似乎也确实非常奇特 - 许多几乎匹配的字节! (这些字节仅针对帧的 first 8176 段写入)
示例 1:
0000 0001 4001 0c01 ffff 0160 0000 0300 b000 0003 0000 0300 3cac 0900 0000 0142 0101 0160 0000 0300 b000 0003 0000 0300 3ca0 0b08 0485 8dae 4932 fcdc 0404 0402 0000 0001 4401 c0f2 f03c 9000 0000 014e 01e5 04cc cc00 0080 0000 0001 2601 af1b 686f 315f 8bcd 7007
示例 2(几秒钟后):
0000 0001 4001 0c01 ffff 0160 0000 0300 b000 0003 0000 0300 3cac 0900 0000 0142 0101 0160 0000 0300 b000 0003 0000 0300 3ca0 0b08 0485 8dae 4932 fcdc 0404 0402 0000 0001 4401 c0f2 f03c 9000 0000 014e 01e5 049b 9b00 0080 0000 0001 2601 af17 68c3 3d14 cf63 2cab
如您所见,在 8000 0000 0126 01af
之前,它们似乎是某种类型的 header for / by.. something。 编辑: 似乎这部分包含了随后帧的 VPS / SPS / PPS。
似乎分路器根本不知道当前帧比初始的 8176 字节段有更多的数据,看看在一个帧由一个 8176 字节段和一个 ~2000 字节段组成的质量设置下如何视频的上三分之二部分还不错,只有在下端才开始损坏。随着我增加流的比特率,这个 "point of corruption" ofc 越来越高。
你为什么不用合适的相机?!
这个相机其实还不错
然后就使用它的普通 RTSP 流?
问题是我什至开始这样做的原因 - 它仅支持 UDP 上的 RTSP,而此专有协议在 TCP 上运行,如果存在数据包丢失(存在),RTSP 流将开始损坏,这我正在努力避免发生这种情况。
希望这里有人可以帮助我。如果您需要示例文件或任何东西,我很乐意为任何有兴趣尝试帮助我的人提供它们。
谢谢!
编辑: 看来我可能有所作为。我刚刚下载了 Zond 265(一种 HEVC 分析器)的试用版,当打开其中的结果文件时,每一帧都出现 "Unexpected remaining X bytes found" 和 "end_of_subset_one_bit shall be equal to 1" 错误。因此,如果我只取出那些剩余的位并删除它前面的那部分位 - 这两个错误都会消失! (出现了一个新的,解码 CTU #x:异常)图像显然仍然损坏,因为现在缺少信息,但至少它有一些需要解决的问题。仍然不知道下一步是什么。
所以我已经设法解决了我的问题,这就是我所做的。我在一些不可靠的网站上发现了一个 DVR 软件,它支持完全相同的协议并设法通过它访问摄像机。然后我通过它记录了流,以及通过我的软件和 bindiffing 两个结果是给了我最后的点击。事实证明,我从 header 中切掉了太多字节(几乎切入了视频流数据),但并非总是如此。偶尔(并且在第一帧)响应 header 似乎比大多数时候长 8 个字节,这由以 00 00 01 FC 开头的视频流表示。因此,通过将我一直切下的这 8 个字节添加到流中,或者在那种情况下将它们切掉,我得到了一个 non-corrupted 视频流 :)