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