使用 ffmpeg 将 60fps 转换为 29.97fps 而不丢帧

使用 ffmpeg 将 60fps 转换为 29.97fps 而不丢帧

我有 60fps 的素材,需要将其转码为其他格式,并以 ~29.97fps 输出。我不能丢掉任何帧。

我已经尝试过这个命令:

ffmpeg -i input.mp4 -vcodec dnxhd -acodec pcm_s16le -s 1920x1080 -r 30000/1001 -b:v 36M -pix_fmt yuv422p -vsync 0 -f mov output.mov

但它输出的是 60fps!我尝试不使用-r-vsync选项,它产生了 30fps,但视频的长度与输入的长度相同,这意味着帧被丢弃,这是不可接受的。

不管怎样,我看到很多这样的信息:

输出流 0:0 中的非单调 DTS;上一个:282282,当前:282282;更改为 282283。这可能会导致输出文件中的时间戳不正确。

我如何让 ffmpeg 做我想做的事情?

答案1

FFmpeg 在更改帧速率时的默认行为是保留源时序并复制/删除帧以匹配目标帧速率。-vsync 0抑制帧重复/丢失,但必须使用 setpts 过滤器手动进行时序调整。由于您增加了视频时长,因此音频也应该进行相应的修改。

使用

ffmpeg -i in.mp4 -vf "setpts=N/(30000/1001)/TB" -af "atempo=60/(30000/1001)" -s 1920x1080 -pix_fmt yuv422p -r 30000/1001 -c:v dnxhd -b:v 36M -c:a pcm_s16le out.mov

相关内容