
ffmpegを使用してmp3ファイルを自動的にリンクするために、次のbashスクリプトを作成しました。
i=0
for f in "${@:2}"
do
filter+="[$i:a:0]"
i=`expr $i + 1`
files+="-i $f "
done
filter+="concat=n=$i:v=0:a=1[outa]"
ffmpeg $files -filter_complex $filter -map '[outa]' "$1.mp3"
ただし、ファイル名にスペースを含むファイルを処理する必要があることがよくありますが、端末にドラッグするとすべてのスペースがエスケープされ、次のコマンド呼び出しが生成されます。
./mergemp3.sh outfilename /path/to/my\ file\ with\ spaces.mp3 /path/to/another\ file\ with\ spaces.mp3
私にとってはこれが正しいようです。しかしffmpegは失敗します
/path/to/my: No such file or directory
明らかに、ffmpegはバックスラッシュで正しくエスケープされたにもかかわらず、ファイル名のスペースを理解していません。ファイル名のリストに関する良い詳細があると思います。どんなアイデアがありますか?
答え1
コマンドラインを作成するときは、明確さと安全性のために配列を使用することをお勧めします。
files=()
i=0
for f in "${@:2}"
do
filter+="[$((i++)):a:0]"
files+=(-i "$f")
done
filter+="concat=n=$i:v=0:a=1[outa]"
ffmpeg "${files[@]}" -filter_complex "$filter" -map '[outa]' "$1.mp3"
答え2
これを試してみてください。これはbash
(私が初めて使用したものに基づいて)すべてのシェルで動作します。回答@Kusalananda経由):
output=$1; shift
i=0
for f in "$@"; do
shift
set -- "$@" -i "$f"
filter="$filter[$i:a:0]"
i=$((i+1))
done
filter="${filter}concat=n=$i:v=0:a=1[outa]"
ffmpeg "$@" -filter_complex $filter -map '[outa]' "$output.mp3"
これはハウジング部分に関するものです。複雑なフィルタが本当に必要かどうかはわかりません。