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

Muk*_*ike 7 dts ffmpeg audio-video-sync ffprobe

观察-第一部分

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

ffmpeg -v error  -i ~/Desktop/5_minute_sync_output_15mn.mp4 -f null - 2>error.log
Run Code Online (Sandbox Code Playgroud)

当我运行上面的命令时,在下面显示的行上看到了很多日志。

应用程序向流0中的复用器提供了无效的,非单调递增的dts:15635> = 15635

通过大量的搜索和阅读,我了解到解码时间戳不是按顺序排列的。

观察-第二部分

但是,使用以下命令和一些后期处理检查相同mp4的帧时,我没有看到pkt_dtsframes_info json中的视频或音频流出现故障。

ffprobe -loglevel panic -of json -show_frames ~/Desktop/5_minute_sync_output_15mn.mp4
Run Code Online (Sandbox Code Playgroud)

这使我怀疑我对“ 观察-一部分-我”的初步理解

这2件事无关吗?任何帮助,将不胜感激。

小智 5


此消息与输入文件的有效性无关,它来自不接受非单调 dts 的输出格式。许多输入格式都支持非单调 dts ( grep -r AVFMT_TS_NONSTRICT FFmpeg),因此不一定是文件的问题。

null格式不需要任何时间戳,如下所示AVFMT_NOTIMESTAMPS

https://github.com/FFmpeg/FFmpeg/blob/ce8f77a903e1108bde774d5e0e59d8cd24f18c46/libavformat/nullenc.c#L36

AVFMT_TS_NONSTRICT但是,除非在标志中设置,否则 dts 检查仍然会发生nullenc.c

https://github.com/FFmpeg/FFmpeg/blob/ce8f77a903e1108bde774d5e0e59d8cd24f18c46/libavformat/mux.c#L563

这似乎是一个疏忽,检查传递给空格式的时间戳的有效性是没有意义的。其他实际上不对数据进行编码的格式(例如哈希格式)也具有该AVFMT_TS_NONSTRICT标志。