我想要达到的效果与我得到的相同(假设速度提高 1.7 倍):
mplayer -af scaletempo -speed 1.7 myvideo.mp4
这个命令正好给了我想要的结果,但我需要以某种方式将结果保存在文件中。
我不想得到的是这个:
mplayer -vf scale -speed 1.7 myvideo.mp4
我需要在文件中完成此操作(文件必须重新编码),因为我必须在 Linux 机器之外播放它。
CLI 是首选,因为我想用脚本来实现。我在 Google 上搜索了很多,找到了很多建议 - ffmpeg、mencoder 和许多奇怪的不可编译工具,但没有一个能给我准确的结果。实际上,这些工具几乎没有一个能起作用(我想它们在很久很久以前曾经起作用过)。
不幸的是,我升级并使用了 Ubuntu 13.04,似乎几乎所有解决方案在这个版本中都不起作用 ;(
答案1
setpts 和 atempo 过滤器
快速动作
ffmpeg -i input -filter_complex "[0:v]setpts=PTS/2[v];[0:a]atempo=2[a]" -map "[v]" -map "[a]" output
慢动作
ffmpeg -i input -filter_complex "[0:v]setpts=PTS/0.5[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output
atempo 值的范围是 0.5-100。
设置点和橡皮筋过滤器
或者,您可以使用橡皮筋filter 而不是 atempo,这样听起来可能会更好,但是你ffmpeg
需要使用 进行编译--enable-librubberband
。你可以参考ffmpeg -filters
看看是否可以使用它。
快速动作
ffmpeg -i input -filter_complex "[0:v]setpts=PTS/2[v];[0:a]rubberband=tempo=2[a]" -map "[v]" -map "[a]" output
慢动作
ffmpeg -i input -filter_complex "[0:v]setpts=PTS/0.5[v];[0:a]rubberband=tempo=0.5[a]" -map "[v]" -map "[a]" output
答案2
尝试这个:
视频:
mkfifo stream.yuv
mplayer -vf scale -speed 1.7 -vo yuv4mpeg source.avi
cat stream.yuv | yuv2lav -o result.avi
或者
ffmpeg -i source.avi -filter "setpts=PTS/1.7" result.avi
声音的:
mplayer -vf scale -speed 1.7 -vo null -ao pcm -ao pcm:file=result.wav source.avi
结果文件:result.avi、result.wav