圧縮なしでffmpegを使用してmp4ファイルからオーディオをバッチ抽出するにはどうすればよいですか(自動オーディオコーデック検出)?


19

228個のmp4ファイル(2.6GB)があり、それらからオーディオを抽出したい(mp3またはogg)。私はそれらをバッチ抽出したい-できればbashで。2006年から2012年までのさまざまな年に録音されたすべてのファイルが同じオーディオコーデックを使用しているかどうかはわかりません。

すべてをループし、ファイル名を選択し、オーディオコーデックを検出し、ffmpegを使用してオーディオを抽出します。

出来ますか?


これはスクリプトに関する質問であり、Ubuntuとは関係ありません。ここで話題になっているわけではありませんが、SOまたはunix.SEをお勧めします。
マヘシュ

ありがとう。次回は、より適切な場所でそのような質問をしようとします。
wryrych

回答:


28

「それらからオーディオを抽出する(mp3またはogg)」と言います。しかし、mp4ファイルのオーディオがそれらのいずれでもない場合はどうでしょうか?とにかくトランスコードする必要があります。それでは、オーディオ形式の検出をffmpegに任せてみませんか?

1つのファイルを変換するには:

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

多くのファイルを変換するには:

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

もちろん、オーディオエンコード用の任意のffmpegパラメーターを選択して、ビットレートなどを設定できます。

使用-acodec libmp3lameしてから拡張子を変更.oggする.mp3mp3エンコード用。

本当にオーディオを抽出したい場合は、を使用してオーディオトラックをファイルに単純に「コピー」できます-acodec copy。もちろん、主な違いは、トランスコーディングが遅く、CPUに負荷がかかることです。一方、ファイル間でバイトを移動するだけなので、コピーは非常に高速です。オーディオトラックだけをコピーする方法は次のとおりです(mp3形式であると想定)。

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

この場合、オーディオファイルの形式コンテナの内容と一致している必要があることに注意してください(つまり、オーディオがAAC形式である場合、言う必要がありますaudiofile.aac)。ffprobeコマンドを使用して、使用しているコーデックを確認できます。これにより、いくつかの情報が提供される場合があります。

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

オーディオコーデックを自動的に解析し、それに応じてオーディオファイルに名前を付ける可能な方法は次のとおりです。

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

注:出力ファイルはoutput、最初に作成するサブディレクトリに作成されます(必要な場合)。mp3およびvorbis以外のコーデックの場合、オーディオをoggに変換します。Ubuntu 14.04には標準リポジトリにはffmpegがありませんが、ppa:mc3man / trusty-mediaリポジトリを追加し、ffmpegパッケージをインストールして必要なソフトウェアを取得できます。詳細はこちらをご覧ください。


間違った。私はmp3またはoggが欲しかったのですが、お気づきのようにオーディオコーデックが異なっていました-この例ではaacです。とにかくそれらをトランスコードする必要があります。手伝ってくれてありがとうございます!
wryrych

自動マジックの例は、ffprobeサブステートメントで$ fileを引用しなかったため、スペースを含むファイル名で壊れています。変更先:* mp4 * aviのファイル。ffmpeg -i "$ file" -vn -acodec copy "$ file"を実行します。ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; 修正済み。
アンドリュービールズ

+1ですが、この回答では更新を使用できるようです:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
ニコラスラウル14

ffmpegまたはffprobeUbuntu 14.04以降では利用できません。
ヤルノ

1
実際の@jarno ffmpeg 15.04にUbuntuのに戻って、そしてそれはのLibavのもみ殻のように見えるavconvavprobeされてきた15.10で削除
-llogan

1

ニコラスラウルが述べたように、これは更新が必要です。roadmrが提供したのと同じ行ですが、代わりにavconvを使用しています:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done


これは今では時代遅れです。FFmpegが復活し、Libavはなくなりました。
-llogan

まったく正しい。ffmpegが死ぬと思っている人がいたら、これを読んでください:en.wikipedia.org/wiki/Libav#Confusion
Scooby-2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.