回答:
単純な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
ファイル名が変数に保存されてavconv
いる*.mp4
場所のような名前のファイルごとに1回実行され${i}
ます。
${i%.mp4}
は、末尾から削除され${i}
た(つまりファイル名)を意味します.mp4
。
bash /path/to/the/script %F
ように- ここに
-map
も、別の出力形式に切り替えたときにビデオが認識される場合があります(その形式にオーディオとビデオの両方を含めることができる場合)。そのままにしておく方が安全です。
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が文字列の末尾にある場合のみです。
%
、見つかった文字列の最初のインスタンスを置換します。また、変数の先頭にある#
場合にのみ文字列を置換するように使用することもできます。したがって、$ {0 / mp4 / m4a}はmp4の最初のインスタンスをm4aに置き換えます(実際に奇妙なファイル名を持っている場合は問題になる可能性があります)。$ {0 /#mp4 / m4a}は、変数の文字列値がmp4で始まる場合にのみmp4をm4aに置き換えます(ここでは使用しませんが、明らかに他の場所で役立つ場合があります)。
複数のファイルが同時に処理されるのを避けるには(リソースが多すぎる可能性があります)、使用しますparallel
。デフォルトでは、一度に1つのジョブのみを実行します。複数のCPUコアを並行して使用する場合はparallel -j 4 ...
、4つのジョブを並行して試してください。またチェックしてくださいman parallel
。
sudo apt-get install parallel
この行はaac
、選択したビデオからオーディオファイルを抽出し、m4a
コンテナに入れます。
parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F
CLIで直接作業する場合%F
は、入力ファイルのリストに置き換えてください。例*.mp4
。
触発され、この答えは、で前の回答この質問に、そしてによりevilsoup「後者のコメント(と言って:」生のAACファイルにメタデータを含めることはできません。あなたは、元のファイルからメタデータを保持したいならば、M4Aを使用します(これはmp4の単なる別名ですが、ファイル拡張子としてaacではなく、オーディオプレーヤーによってかなり広く認識されています。
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