FFmpeg - “非单调递增的dts”是什么意思?

26

观察 - 第一部分

我在其他地方看到了一个建议,运行以下命令查看我的.mp4文件是否有问题。

ffmpeg -v error  -i ~/Desktop/5_minute_sync_output_15mn.mp4 -f null - 2>error.log
当我运行上述命令时,我看到一堆日志,其中有类似下面所示的内容。

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 15635 >= 15635

经过搜索和阅读了不少资料,我理解这表示解码时间戳不是按顺序排列的。 观察 - 第二部分 但是,使用以下命令检查同一mp4的帧并进行一些后处理后,我发现视频或音频流中的frames_info json中没有任何pkt_dts排序问题。
ffprobe -loglevel panic -of json -show_frames ~/Desktop/5_minute_sync_output_15mn.mp4

这让我对我在观察-第一部分的初步理解产生了怀疑。

这两件事不相关吗? 任何关于此的帮助都将不胜感激。


6
单调递增的意思是严格递增。不能有两个数值相同的数据包或者比之前的数值更低的数据包。这是否适用于ffprobe的输出结果? - aergistal
好的。单调部分讲得通。 当我按照第二个命令在我的第二部分观察中进行ffprobe时,所有pkt_dts值都是严格递增的。不确定为什么。 - Mukund Manikarnike
大家好, 有没有人能帮我理解这些日志? 我看不懂它。 我也在其他文件中经常看到它。 - Mukund Manikarnike
7
我在尝试弄清楚是否应该担心这件事 :( - Freedo
1个回答

5
这条信息不涉及输入文件的有效性,而是由于输出格式不接受非单调的dts。许多输入格式支持非单调dts(grep -r AVFMT_TS_NONSTRICT FFmpeg),因此这不一定是文件的问题。 null格式不需要任何时间戳,如AVFMT_NOTIMESTAMPS所示: https://github.com/FFmpeg/FFmpeg/blob/ce8f77a903e1108bde774d5e0e59d8cd24f18c46/libavformat/nullenc.c#L36 然而,仍会进行dts检查,除非在nullenc.c标志中设置了AVFMT_TS_NONSTRICThttps://github.com/FFmpeg/FFmpeg/blob/ce8f77a903e1108bde774d5e0e59d8cd24f18c46/libavformat/mux.c#L563 这似乎是一个疏忽,检查传递给null格式的时间戳的有效性是没有意义的。其他实际上不编码数据的格式,如哈希格式,也有AVFMT_TS_NONSTRICT标志。

1
看起来有人在2015年被垃圾日志搞得很烦,然后提交了一个补丁到nullenc.c中添加了AVFMT_TS_NONSTRICT标志。我猜它没有被合并。真遗憾。 - Ollie
@ollie 对的,目前检查相等性的方法是错误的,所以我仍然得到了media-video/ffmpeg-6.0-r3:0/58.60.60::gentoo[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f37e418bcc0] 数据流索引:id [1:-2147483648] 中的所有样本持续时间为零,流将默认被丢弃。可以使用 AVStream->discard 或 -discard 来覆盖 ffmpeg 命令。 [hevc @ 0x55ee39edb300] 应用程序在流 0 中向复用器提供了无效的、非单调递增的 dts:10657898 >= 10657898 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接