web-dev-qa-db-ja.com

トランスコードせずにavconvで音声をバッチ抽出

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

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

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

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

13
oshirowanen

単純な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(ファイル名)を意味します。

20

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

5
evilsoup

複数のファイルが同時に処理されるのを避けるには(リソースが多すぎる可能性があります)、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カスタムアクションでこのようなコマンドを使用しますが、

enter image description here

アプリケーションをaacオーディオを含むビデオに制限します。

enter image description here

処理中に端末ウィンドウを開き、最後に閉じるには、コマンドを次のように変更できます。

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"
3
user47206

@ 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
2
dr. Sybren