2

我的情况是,我需要获取位于数据包开头的一大块 MPEG4V1Microsoft MPEG-4 VKI Codec V1数据由某些 DVR 单元发送)。

数据包结构如下所示:

  • 压缩的 MPEG4 数据
  • 长整数 - 事件和绊线的数量。
  • 长整数 - 事件数。
  • 事件 - 事件的顺序。
  • 长整数 - 绊线的数量。
  • 绊线 - 绊线序列。
  • 长整数 - 循环冗余码 (CRC)。

所以没有迹象表明如何知道MPEG4数据在哪里结束(或者在那里?),以及我应该从哪里开始阅读这些附加数据,如“事件和绊线的数量”等等......

我上传了两个数据包,因此您可以看到实际数据的样子: recvData1.txtrecvData2.txt

我尝试使用带有 avcodec_decode_video 函数的 FFmpeg 库来解码这些数据包,并从我的recvData缓冲区的末尾逐字节删除以希望得到任何结果,
但 FFmpeg 总是返回如下错误消息:

“[msmpeg4v1 @ 038865a0] 无效的起始码”、“[msmpeg4v1 @ 038865a0] 标头损坏”。

我不是知道 MPEG4 如何从内部工作的专家,但从错误消息来看,我清楚地看到我在缓冲区开始时丢失了一些用于解码的数据。

所以我不确定我在这里得到了什么部分/类型的 MPEG 数据。
也许它是某种 MPEG 的“帧”数据,带有“结束”指示或其他什么?

我什至将我的recvData缓冲区的开头与我在网上“http://www.trekmania.net/clips/video_clips4.htm”上找到的一些 MPEG4V1 编码的视频文件进行了比较,以检查我的缓冲区的开头是否真的包含MPEG数据..而不是某种DVR供应商特定的东西..

而且我注意到有大约 20 字节的数据(在我的数据包数据的开头,以及在大约 180 字节之后的 .avi 文件中......)看起来像某种标题或其他东西......

请检查此图片:“http://ggodis.gamedev.lt/stackOverflow/recvData.jpg”

也许有人知道这部分 MPEG4V1 数据代表什么?

PS ..我检查了我收到的数据包的 CRC 值,它们是正确的..

4

2 回答 2

2

我成功解码了我的数据包。我的缓冲区开头的数据是“BITMAPINFOHEADER”。这就是我需要知道的。

于 2011-09-14T13:02:27.170 回答
0

你在这里处理两个不同的事情:容器和编解码器。编解码器用于以某种数字形式对数据进行编码/解码(因此编码器解码器→编解码器)。所有变体中的 MPEG4 视频就是这样一个编解码器系列。

您需要注意的另一件事是容器。AVI 是一个容器,但还有许多其他容器。MPEG2-TS、MPEG2-PS、MP4、MKV、MOV(Quicktime)、FLV、Ogg 等等。所有容器格式的共同点是,它们提供了用于存储和/或流式传输编解码器帧/数据包的框架。容器为您提供了在帧/数据包中寻址所需的信息。

容器处理解复用器/多路复用器,简称“复用器”。

请检查此图片:“http://ggodis.gamedev.lt/stackOverflow/recvData.jpg”

严重地?您知道使用十六进制编辑器来查找/操作 RAW 数据流吗?由于对 Unicode 复合代码点或类似的误解,在文本编辑器中打开它们可能会导致各种基本信息丢失。

所以我不确定我在这里得到了什么部分/类型的 MPEG 数据。也许它是某种 MPEG 的“帧”数据,带有“结束”指示或其他什么?

这看起来像是 MP4 容器文件的一部分。MP4 是一种非常微妙的容器格式,它在很大程度上依赖于完整的标题。如果表头损坏,则无法正常播放。

于 2011-09-13T08:32:57.180 回答