如何合并一系列 ffmpeg 命令?

如何合并一系列 ffmpeg 命令?

我正在使用以下一系列命令来制作视频。是否可以合并所有或部分命令?

首先,我提取视频的一些部分,比如说三个:

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并将其移动到您想要工作的目录。

相关内容