約70のmp4ファイルがあり、さらにトランスコードせずにオーディオファイルを直接抽出したい。すべてのmp4ファイルにはaacオーディオファイルがあります。
次のコマンドを使用して、mp4ファイルの1つからオーディオファイルを抽出できることを理解しています。
avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"
70のすべてのmp4ファイルからすべてのオーディオファイルを抽出するにはどうすれば70のaacファイルになりますか?
単純なforループを使用できます。
for i in *.mp4; do
avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done
または1行で:
for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done
ファイル名が*.mp4
変数に保存されている${i}
のような名前のファイルごとに、avconv
を1回実行します。
${i%.mp4}
は、${i}
が末尾から削除された.mp4
(ファイル名)を意味します。
1つのディレクトリにすべてのファイルがある場合、Xiaoの答えは一般的に最も役立ちます。ただし、異なるディレクトリに散らばっているMP4ファイルがある場合は、このfind
コマンドを使用してすべてを変換できます。
find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;
これは、最後にわずかに異なる形式のbash文字列置換を使用します。「$ {0 /%mp4/m4a}」は、mp4がm4aで置き換えられるようにbashに指示しますが、これはmp4が文字列の末尾にある場合のみです。
複数のファイルが同時に処理されるのを避けるには(リソースが多すぎる可能性があります)、parallel
を使用します。デフォルトでは、一度に1つのジョブのみを実行します。複数のCPUコアを並行して使用する場合は、4つのジョブを並行して実行するparallel -j 4 ...
を試してください。 man parallel
も確認してください。
Sudo apt-get install parallel
この行は、選択したビデオからaac
オーディオファイルを抽出し、m4a
コンテナーに入れます。
parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F
CLIで直接作業する場合、substitute%F
を入力ファイルのリストに置き換えます。例えば。 *.mp4
。
this 回答、 以前の回答 この質問、および evilsoup の後者へのコメント(発言:「生のaacファイルにはメタデータを含めることはできません。元のファイルからメタデータを保持する場合は、aacの代わりにm4a(mp4の単なる名前ですが、オーディオプレーヤーによってかなり広く認識されています)を使用しますファイル拡張子 ')。
Thunarカスタムアクションでこのようなコマンドを使用しますが、
アプリケーションをaac
オーディオを含むビデオに制限します。
処理中に端末ウィンドウを開き、最後に閉じるには、コマンドを次のように変更できます。
gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"
@ Xiao-Long Chenの答えを拡張し、出力ファイルが新しい場合にファイルをスキップするスクリプトに変えました。
#!/bin/bash
for file in *.mp4; do
OUT="${file/.mp4/.m4a}"
if [ "$file" == "$OUT" ]; then
echo "Unable to handle $file" >&2
exit 1
fi
if [ "$OUT" -nt "$file" ]; then
echo "Skipping $file; output file is newer."
continue
fi
echo "Converting \"$file\" -> \"$OUT\""
avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done