我有一个 5 fps 的视频,keyint 为 120,长度为 2.5 小时,我想将其加速 6 倍,使其 fps=30
我使用在本网站某处找到的这个命令完成了此操作。
ffmpeg -i "...local_Record.mkv" -filter:v "fps=30, setpts=PTS/6" "...output1.mkv"
输出出现延迟,播放 3-5 秒后冻结。如果我跳回或前进,它会再播放 3-5 秒,然后再次冻结。在将其上传到 YouTube 后,我发现它没有延迟,但 YouTube 显示其长度为原始的 2.5 小时。它还显示其处理百分比已达到 95%,持续了 12 多个小时(这意味着该视频 100% 存在错误,并且永远不会被处理,因为它有 90 mb 和 20 分钟长,而 YouTube 可以在 10 分钟内处理 5 gb 和一小时长的视频)
然后我尝试用这个命令重新编码我得到的视频
ffmpeg -i "...mkv" -c:v libx264 -crf 18 -preset veryfast -max_muxing_queue_size 1024 output.mp4
这给了我 133 mb 的结果,在 youtube 上也显示为 2.5 小时长,并且永远无法完成处理(可以播放,但不可见,在视频管理器中两个视频都显示已处理 95%)
如何正确地做到这一点,以便视频不会滞后并且 YouTube 可以正确获取其长度?
编辑 - 我找到了问题所在 - 容器中有一些声音,尽管本来不应该有任何声音(我用 obs 录制的,没有启用声音)。因此,在我用 mmg 删除该声音后,mpc 正确打开了它,显示其长度为 26 分钟,youtube 在几分钟内成功处理了它
答案1
顺序应该颠倒,
ffmpeg -i in -filter:v "setpts=PTS/6,fps=30" out
首先使用 fps 过滤器,ffmpeg 将每秒插入 25 个重复帧,以便将 5 fps 转换为 30,然后将其加速 6 倍。按照正确的顺序,ffmpeg 将流压缩为每秒 30 个源帧,然后 fps 过滤器最终所做的就是将流元数据更改为 30 fps。
*假设帧速率源恒定。
另请注意,YT 会重新编码所有视频,因此您编码的 keyint 不会被 YT 保留。
如果你有音频,你也需要加快速度,
ffmpeg -i in -vf "setpts=PTS/6,fps=30" -af "atempo=6" out
请注意,直到最近,atempo 的限制都是 2,因此对于旧版本的 ffmpeg,您可以使用
ffmpeg -i in -vf "setpts=PTS/6,fps=30" -af "atempo=2,atempo=2,atempo=1.5" out