我正在使用以下一系列命令来制作视频。是否可以合并所有或部分命令?
首先,我提取视频的一些部分,比如说三个:
ffmpeg -y -ss 1666 -i "in.mkv" -t 10 -codec:v ffvhuff "tmp/2.EC.avi"
ffmpeg -y -ss 1676 -i "in.mkv" -t 941 -codec:v ffvhuff "tmp/3.EC.avi"
ffmpeg -y -ss 2617 -i "in.mkv" -t 10 -codec:v ffvhuff "tmp/4.EC.avi"
然后我改变其中一些的播放速度,假设#3的速度加倍。我还在视频上放置了一个小图像来指示速度已更改:
ffmpeg -y -i tmp/3.EC.avi -i ff64.png \
-filter_complex "[0:v]setpts=0.5*PTS,overlay=x=(main_w-overlay_w-10):10[v];[0:a]atempo=2[a]" \
-codec:v ffvhuff -map "[v]" -map "[a]" "tmp/3.EC.x2.avi"
然后,我将所有这些合并为一个.avi
:
ffmpeg \
-i "tmp/2.EC.avi" -i "tmp/3.EC.x2.avi" -i "tmp/4.EC.avi" \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
-codec:v ffvhuff -map "[v]" -map "[a]" -y \
"tmp/out.avi"
最后,我创建一个.mkv
包含所需参数的文件:
ffmpeg -y \
-i "tmp/out.avi" \
-c:v libx264 -preset slow -crf 18 -c:a aac -b:a 192k -pix_fmt yuv420p \
"out.mkv"
我想用更少的命令执行相同的过程。可以吗?
答案1
非脚本:
ffmpeg \
-ss 666 -to 671 -i "input.mkv" \
-ss 671 -to 762 -i "input.mkv" \
-ss 762 -t 5 -i "input.mkv" \
-i logo.png \
-filter_complex "
[1:v]setpts=PTS/2[v];
[1:a]atempo=2[a];
[v][3]overlay=W-w-10:10[v];
[0:v][0:a][v][a][2:v][2:a]concat=n=3:v=1:a=1
" -c:v h264 -crf 18 -c:a aac -q:a 5 "out.mkv"
答案2
我认为脚本是您最好的选择。
提炼
第一个任务听起来像是有特定的范围,会随着每个项目而变化。你可以编写一个交互式脚本,询问你想要剪切多少个视频,然后询问开始时间和持续时间,但这真的比复制并粘贴原始命令几次更容易吗?勉强。
其余的部分:
#!/bin/bash
#Slow Playback
# Iterate over every .avi file in current directory and ask for playback speed
for file in *.avi
do
if [ -f "$file" ]
then
read -p "Enter a speed value for $file: " speed
echo "Processing $file ..."
ffmpeg -i "$file" -filter:v "setpts=$speed*PTS" "slow_$file"
echo "Done processing $file"
mv "$file" trash/
fi
done
echo "All files processed"
# Merge
# Create an array of inputs from cd
inputs=(*.avi)
# concat the files in array
ffmpeg -i "concat:${inputs[*]}" -codec:v ffvhuff -y "merged.avi"
# Convert to mkv
ffmpeg -y -i "merged.avi" -c:v libx264 -preset slow -crf 18 -c:a aac -b:a 192k -pix_fmt yuv420p "final.mkv"
使该脚本可执行chmod +x my_script.sh
并将其移动到您想要工作的目录。