228個のmp4ファイル(2.6GB)があり、それらからオーディオを抽出したい(mp3またはogg)。私はそれらをバッチ抽出したい-できればbashで。2006年から2012年までのさまざまな年に録音されたすべてのファイルが同じオーディオコーデックを使用しているかどうかはわかりません。
すべてをループし、ファイル名を選択し、オーディオコーデックを検出し、ffmpegを使用してオーディオを抽出します。
出来ますか?
228個のmp4ファイル(2.6GB)があり、それらからオーディオを抽出したい(mp3またはogg)。私はそれらをバッチ抽出したい-できればbashで。2006年から2012年までのさまざまな年に録音されたすべてのファイルが同じオーディオコーデックを使用しているかどうかはわかりません。
すべてをループし、ファイル名を選択し、オーディオコーデックを検出し、ffmpegを使用してオーディオを抽出します。
出来ますか?
回答:
「それらからオーディオを抽出する(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
する.mp3
mp3エンコード用。
本当にオーディオを抽出したい場合は、を使用してオーディオトラックをファイルに単純に「コピー」できます-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パッケージをインストールして必要なソフトウェアを取得できます。詳細はこちらをご覧ください。
ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'
; 修正済み。
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
ffmpeg
またはffprobe
Ubuntu 14.04以降では利用できません。
ニコラスラウルが述べたように、これは更新が必要です。roadmrが提供したのと同じ行ですが、代わりにavconvを使用しています:
for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done