我有 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