【问题标题】:ffmpeg producing strange NAL suffixes for MPEG-TS with h264ffmpeg 为带有 h​​264 的 MPEG-TS 生成奇怪的 NAL 后缀
【发布时间】: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 中。

标签: ffmpeg h.264 mpeg2-ts


【解决方案1】:

所以我发现了问题。

TL;DR:

pInputFormatContext->flags |= AVFMT_FLAG_KEEP_SIDE_DATA;

就在avformat_open_input之后

解释:

我在调试时发现 AVPacket 在执行时被utils.c:1661 破坏

av_packet_merge_side_data(pkt);

更重要的是,我发现了之前看到的附加数据的子序列:

#define FF_MERGE_MARKER 0x8c4d9d108e25e9feULL

用于av_packet_merge_side_data

Side 在 AVPacket 中的数据类型是 AV_PKT_DATA_MPEGTS_STREAM_ID (78),它只用于 demuxers 和 muxers,而不是编解码器。

我对 av_read_frame 的注释感到困惑,我用它来从文件中读取帧数据:

Return the next frame of a stream.
This function returns what is stored in the file, and does not validate
that what is there are valid frames for the decoder. It will split what is
stored in the file into frames and return one for each call. It will not
omit invalid data between valid frames so as to give the decoder the maximum
information possible for decoding.

我完全不知道为什么我使用的两台 PC 上的流标志不同,但是禁用将边数据合并到数据包的数据中就可以了。

所以我认为这是 ffmpeg 的文档问题,它向我保证“我将返回文件中存储的内容”,而没有提及可以添加一些额外的数据。

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多