最新の Ubuntu にアップグレードする前に、次のコマンドを使用して avi ファイルから mp3 を抽出しました。
$ for x in *.avi; do ffmpeg -vol 100 -ab 160k -ar 44100 -i "$x" "`basename "$x" .avi`.mp3"; done
これはうまくいきました。しかし、Ubuntu 12.04以降ではオプション sample_rate が見つかりません。このコマンドを実行しようとすると、-ar 44100(または -sample_rate 44100) mp3 は抽出されますが、ほとんどの場合、抽出された mp3 の長さは収まりません。つまり、avi の長さは 5 分しかないのに、長さが 43 分程度になるということです。
ffmpeg と avconv の両方で同じ問題が発生します。これらの問題を解決する方法はありますか?
答え1
代わりにこれを試してください:
ffmpeg -i "$x" -vol 100 -ab 160k -ar 44100 "`basename "$x" .avi`.mp3"
以前はオプションは入力ファイルの前にありましたが、出力ファイル用に設定するようです。
答え2
他の avi ファイルでも試しましたか? ファイルのオーディオ トラックはビデオ トラックよりも長い可能性があります (推測にすぎません)。
-t オプションを試しましたか?
-t duration
Restrict the transcoded/captured video sequence to the duration
specified in seconds. "hh:mm:ss[.xxx]" syntax is also supported.
ffmpeg でオーディオ ビット ストリーム フィルターを設定してみるのもいいかもしれません。私は試したことがありませんが、「remove_extra」フィルターは有望そうです ;)
-absf bitstream_filter
Bitstream filters available are "dump_extra", "remove_extra",
"noise", "mp3comp", "mp3decomp".
ExifTool のようなコマンドを使用してファイルに関する情報を表示し、それに応じてオプションを設定する (出力を解析してスクリプトで自動化する) ことを検討しましたか?
おそらく、オーディオ ファイルをロスレス形式で抽出してから、オーディオ ファイルをトランスコードすることもできますが、それよりも良い方法があるはずです。
解決できたら、ぜひ実行したことを投稿してください。なぜなら、デマルチプレックスする必要がある 1000 個のビデオ ファイルを処理する明白な方法に満足していないからです。私はあなたのスクリプトに似たスクリプトを作成しましたが、スペースを無駄にすることなく、可能な限り最高品質のオーディオ ファイルを取得したいと考えています。私のトランスコーディング オプションは確実に動的であるため、ワンライナーよりも少し洗練されたものが必要です。
答え3
ffmpeg -version は、ffmpeg が Ubuntu 12.04 用にコンパイルされたときに有効にされたビルド オプションを通知します。ライブラリが不足しているか、ビルド時にオプションが有効になっていなかった可能性があります。その場合は、無効になっているオプションを有効にして再コンパイルする必要があります。ffmpeg のデフォルトのサンプル レートは 44100 で、ビット レートは 64k です。
答え4
ppa:jon-severinsson/ffmpeg から ffmpeg の ppa をインストールすると、問題は解決します。