トランスコーディングなしでavconvでオーディオをバッチ抽出


14

約70のmp4ファイルがあり、さらにトランスコードせずにオーディオファイルを直接抽出したい。すべてのmp4ファイルにはaacオーディオファイルがあります。

次のコマンドを使用して、mp4ファイルの1つからオーディオファイルを抽出できることを理解しています。

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

70のすべてのmp4ファイルからすべてのオーディオファイルを抽出するにはどうすれば70のaacファイルになりますか?

回答:


21

単純な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


2
IIRC、生のaacファイルにはメタデータを含めることはできません。元のファイルのメタデータを保持する場合は、ファイル拡張子としてaacの代わりにm4a(mp4の単なる名前ですが、オーディオプレーヤーによってかなり広く認識されています)を使用します。
evilsoup

-mapオプションとは何ですか?0:0、0:2など、他のストリームではなく0:1ストリームを選択するのはなぜですか?
qed

-mapオプションを削除しましたが、
正常に

:Thunarではカスタムアクションと類似した、スクリプトにし、Thunarではアクションで追加された場合、それが動作中にこのコマンドを使用するbash /path/to/the/script %Fように- ここに

2
@qed:ドロップして-mapも、別の出力形式に切り替えたときにビデオが認識される場合があります(その形式にオーディオとビデオの両方を含めることができる場合)。そのままにしておく方が安全です。
博士。シブレン

5

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が文字列の末尾にある場合のみです。


bashにそのタイプの置換があることは知りませんでした。素晴らしい:)
アンドリューガンナーソン

1
@xiaoを省略すると%、見つかった文字列の最初のインスタンスを置換します。また、変数の先頭にある#場合にのみ文字列を置換するように使用することもできます。したがって、$ {0 / mp4 / m4a}はmp4の最初のインスタンスをm4aに置き換えます(実際に奇妙なファイル名を持っている場合は問題になる可能性があります)。$ {0 /#mp4 / m4a}は、変数の文字列値がmp4で始まる場合にのみmp4をm4aに置き換えます(ここでは使用しませんが、明らかに他の場所で役立つ場合があります)。
evilsoup

3

複数のファイルが同時に処理されるのを避けるには(リソースが多すぎる可能性があります)、使用します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"

2

@ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.