【发布时间】:2016-12-13 17:50:47
【问题描述】:
我正在制作 h264 流分析器,并且在写入和读取使用 MPEG-TS 打包的同一帧时发现了奇怪的 ffmpeg 行为。
我已经在 HEX 中转储了编码和解码帧数据,并发现了这些差异:
在帧的开头添加了 NAL 分隔符:
+ 00
+ 00
+ 00
+ 01
+ 09
+ f0
这在我看来绝对合法。
但奇怪的事情来了:
如果当前数据包不是最后一个,则添加一些后缀(即最后写入的帧中没有此后缀)。并且这个后缀被添加到当前读取帧(即这不是下一帧的前缀)。
+ e0
+ 00
+ 00
+ 00
+ 01
+ ce
+ 8c
+ 4d
+ 9d
+ 10
+ 8e
+ 25
+ e9
+ fe
(完全以 e0 开头添加字节)
我试图理解这可能意味着什么。如果00000001 是 NAL 标头,则后面是 ce 字节,禁止零位等于 1,这是绝对损坏的。
我正在使用来自 ffmpeg github repo 的 fork,最后与 89092fafdde894c6ba4d4f8e3cd1cce0d68bfc22 commit 合并。
ffmpeg 是使用 --disable-everything --enable-encoder=libopenh264 --enable-muxer=mpegts --enable-demuxer=mpegts --enable-protocol=file --enable-parser=h264 --enable-decoder=libopenh264 --enable-shared --disable-static --disable-programs --disable-doc --enable-libopenh264 选项构建的
【问题讨论】:
-
是的,该文件可能有一些损坏。你能把它贴在某个地方我可以确认吗?
-
@szatmary 是的,当然。 Here 它去了。我检查了这个视频我仍然有问题,尽管带有 ffmpeg 的 vlc 可以正常读取它
-
00 00 00 01 ce序列不在您发布的文件中。 -
@ElDorado 我确认了 szatmary 的发现。你能给我们补偿吗?
-
@aergistal 我试图在另一台 PC 上构建项目以提供偏移量并提供更多信息,但再也没有找到这种模式。看起来它是环境相关的错误。可能是我之前工作的那台 PC 上的内存对齐故障。一旦我能够重现错误 - 我会给你更多信息。无论如何,文件中不存在模式,我知道(对不起,如果我没有说清楚)。使用 ffmpeg 读取文件时,它仅存在于 AVPacket 中。