【发布时间】:2021-01-24 08:57:13
【问题描述】:
总结
当使用-c copy 选项调用时,Ffmpeg concat demuxer 会改变视频流的开始时间。
复制
给定一个包含start_time=0 和start_pts=0 的视频和音频流的before.mp4。
给定 concat demuxer 输入文件 concat.txt 的内容:
file before.mp4
运行命令ffmpeg -f concat -i concat.txt -c copy concat.mp4
运行命令ffprobe concat.mp4 -show_streams 并观察视频流start_time 和start_pts 现在不为零(在我的测试中,这种变化的幅度很小,在0 -> 0.022969 的范围内)。
这会导致处理后的视频在 Mac 上使用 QuickTime 播放器打开时最初显示一个空白帧,尽管视频的其余部分正常播放。在下面链接的图片中,左边是我们第一次打开before.mp4时看到的;右边是我们第一次打开时看到的concat.mp4:
https://i.stack.imgur.com/lWxgF.jpg
请注意,当使用 concat demuxer 连接多个 mp4 文件时也会出现此问题。为了便于复制,我只使用了上面的一个文件。
我了解此问题可能取决于所使用的编解码器。因此,我在下面包含了before.mp4 的 ffprobe 输出:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'before.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.45.100
Duration: 00:00:06.50, start: 0.000000, bitrate: 998 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1024x768 [SAR 1:1 DAR 4:3], 865 kb/s, 50 fps, 50 tbr, 12800 tbn, 100 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 126 kb/s (default)
Metadata:
handler_name : SoundHandler
我想做的事
使用-c copy(即不重新编码)调用 concat demuxer,而不会对输出视频流开始时间进行意外调整。
我对音频和视频编解码器和容器的了解有限,因此任何关于为什么会出现此问题、是否可以通过 ffmpeg 修复或任何其他解决方法的建议都将不胜感激!
我尝试过的解决方法
start_time 和 start_pts 在处理后的视频在没有任何过滤器的情况下重新编码时重置为 0:ffmpeg -i concat.mp4 concat_reencoded.mp4。
在没有-c copy 选项的情况下调用 concat demuxer 时不会出现此问题。
但是,上述两种情况都是不可取的,因为重新编码会降低视频质量,我想避免这种情况。
如果 before.mp4 在由 concat demuxer 处理之前通过 ffmpeg -i before.mp4 -c copy before.mkv 重新混合到 before.mkv,则不会出现此问题。但是,这会导致 fps 略有变化(例如 30 -> 29.96),我还没有弄清楚如何在不重新编码的情况下避免这种变化。
【问题讨论】:
-
你能提供一个简短的文件来重现这个吗?
-
嗨,吉安,感谢您的回复!我已将此问题报告给 Ffmpeg Bug Tracker(链接:trac.ffmpeg.org/ticket/8925),并已将所有必要的文件附加到票证中,因此您可以从那里下载文件,如果有任何问题,请告诉我:)