我正在录制截屏视频和部分录制的截屏视频,我希望使用ffmpeg等命令行工具加快速度。
我知道可以使用ffmpeg通过类似(source)
之类的命令加速整个视频ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
是否可以仅在视频的某些区域应用加速。例如。从10到15秒再从50到60秒?使用程序slowmoVideo似乎可以实现类似的东西。
答案 0 :(得分:13)
示例:我想加快视频的前4秒。
ffmpeg -i input.mp4 -t 4 slow.mp4
ffmpeg -i input.mp4 -ss 00:00:04 part-2.mp4
ffmpeg -i slow.mp4 -filter:v "setpts=0.5*PTS" part-1.mp4
ffmpeg -f concat -i <(for f in ./part-*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
来自ffmpeg文档的资源:
答案 1 :(得分:1)
对于音频和视频:
总之,这个(仅作为示例)对我来说效果很好(它使得4秒段的斜坡从00:00:12.5开始,同时转码为mp4):
ffmpeg -loglevel error \
-ss 12.5 -t 4.0 \
-i orig.MOV \
-filter_complex \
"[0:v]setpts=8.0*PTS[v];[0:a]asetrate=5512.5,aresample=44100[a]" \
-map "[v]" -map "[a]" \
-r 30 -strict -2 \
out.mp4
我发现组合asetrate=...,aresample=...
的效果优于atempo
,尤其是因为后者仅限于[0.5;2.0]
。另请注意最终-r 30
将帧速率设置为30fps。在我处理的一些视频中,由于一些奇怪的原因,没有它,结果将是一个2400fps的巨大文件!它还确保我的剪辑的所有片段都具有相同的帧速率(见下文)。
其他参数与往常一样:-ss
设置剪辑的开头;因为它在-i
之前,它运行得很快,而且也正确(在原始时间轴中)。 -t
是持续时间,也在原始时间轴中。
背景和详细信息:
好吧,我有一个类似的问题,因为我的好的慢动作视频来自新的iPhone7 +(我编辑了一部分是慢动作)似乎没有被Google相片,iPhoto等识别/理解
稍微搞了一点(由更多SO问题和好ffmpeg docs帮助),我把它归结为下面的bash脚本。它比原始问题多一点,因为我也希望从.MOV
转换为.mp4
,并在开始/结束时缩短一些时间。有了这个,我能够批量剪辑&amp;将来自iPhone的一大堆.MOV
文件处理成我可以上传,分享或播放的剪辑。其中一个命令行示例:
./slo-part.sh IMG_0067.MOV clip_0067.mp4 14.0 23.0 25.5 27.67
便利脚本:
以下是slo-part.sh
脚本:
#!/usr/bin/env bash
# Slow down a portion of a movie clip
_usage="Usage : $0 file_in file_out start start_slo stop_slo stop"
function log {
local msg=$1
local t=$(date +"%Y-%m-%d %H:%M:%S")
echo "$t $msg"
}
function calc {
printf "%g" $(bc<<<"$1")
}
IN=$1
OUT=$2
A=$3
B=$4
C=$5
D=$6
: ${IN:?$_usage}
: ${OUT:?$_usage}
: ${A:?$_usage}
: ${B:?$_usage}
: ${C:?$_usage}
: ${D:?$_usage}
RATE=30
AB=$(calc "$B-$A")
BC=$(calc "$C-$B")
CD=$(calc "$D-$C")
# scratch dir
scratch=tmp.$$
mkdir -p $scratch
if (( $(bc <<< "$AB > 0.0") )); then
log "Extracting part-1: from $A to $B ($AB)"
ffmpeg -loglevel error -ss $A -t $AB -i $IN -r $RATE -strict -2 $scratch/part-1.mp4
fi
if (( $(bc <<< "$BC > 0.0") )); then
log "Extracting part-2: from $B to $C ($BC) and slow it down 8x"
ffmpeg -loglevel error -ss $B -t $BC -i $IN -filter_complex "[0:v]setpts=8.0*PTS[v];[0:a]asetrate=5512.5,aresample=44100[a]" -map "[v]" -map "[a]" -r $RATE -strict -2 $scratch/part-2.mp4
fi
if (( $(bc <<< "$CD > 0.0") )); then
log "Extracting part-3: from $C to $D ($CD)"
ffmpeg -loglevel error -ss $C -t $CD -i $IN -r $RATE -strict -2 $scratch/part-3.mp4
fi
log "Concat all parts, output to $OUT"
ffmpeg -loglevel error -y -f concat -i <(for f in $scratch/part-*.mp4; do echo "file '$PWD/$f'"; done) -c copy $OUT
rm -rf $scratch