ffmpegを使用してビデオからオーディオを抽出するにはどうすればよいですか?


227

次のコマンドを試して、ビデオからオーディオを抽出しました。

ffmpeg -i Sample.avi -vn -ar 44100 -ac 2 -ab 192k -f mp3 Sample.mp3

しかし、私は次の出力を取得します

libavutil     50.15. 1 / 50.15. 1
libavcodec    52.72. 2 / 52.72. 2
libavformat   52.64. 2 / 52.64. 2
libavdevice   52. 2. 0 / 52. 2. 0
libavfilter    1.19. 0 /  1.19. 0
libswscale     0.11. 0 /  0.11. 0
libpostproc   51. 2. 0 / 51. 2. 0
SamplE.avi: Invalid data found when processing input

誰か助けてもらえますか?

回答:


406

再エンコードせずにオーディオストリームを抽出するには:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
  • -vn ビデオはありません。
  • -acodec copy すでにそこにあるものと同じオーディオストリームを使用すると言います。

出力を読んでコーデックを確認し、正しいファイル名拡張子を設定します。


54
ffmpegを最初に実行して、オーディオストリームを確認するのではなく、ffprobe input-video.aviを使用します
FlorianB

15
ビデオストリームからオーディオのみを抽出する場合、オーディオの長さはビデオの長さよりも短い場合があります。これが起こらないようにするには、ffmpegへの同じ呼び出しでオーディオとビデオの両方を抽出します。たとえば、「ffmpeg -i vid.avi -map 0:a audio.wav -map 0:v onlyvideo.avi
BlenderBender

2
生のAACをM4Aコンテナーにカプセル化するコマンドを使用して、この回答を拡張することは素晴らしいことです。
Gras Double

8
この正確なケースでは、宛先パスの「.aac」を「.m4a」に置き換えるだけです。ffmpegはあなたの意図を推測できるほどスマートで、結果をM4Aコンテナーにカプセル化します:)
Gras Double

1
FWIWは、私はちょうど入力ビデオファイルを指定するようにすることを、PHPスクリプトを細工しており、それが自動的に出力オーディオファイルの拡張子を決定します。superuser.com/questions/1301901/...
グラダブル

117

AVIから高品質のMP3をエンコードするに、可変ビットレートに-q:aを使用するのが最適です。

ffmpeg -i sample.avi -q:a 0 -map a sample.mp3

ビデオからオーディオの一部抽出する場合は、-ssオプションを使用して開始タイムスタンプを指定し、-tオプションを使用してエンコード期間を指定します。たとえば、45秒間は3分5秒です。

ffmpeg -i sample.avi -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3
  • タイムスタンプはHH:MM:SS.xxx形式または秒単位である必要があります。

  • -tオプションを指定しない場合、最後に移動します。

作業例:

  1. ffmpegのダウンロード
  2. コマンドプロンプトを開く([スタート]> [実行]> [CMD])またはLinux / Macでターミナルを開く
  3. ffmeg.exeがあるディレクトリにcdします。
  4. コマンドを発行して、出力ファイルを待つ(またはエラーのトラブルシューティングを行う)

ここに画像の説明を入力してください


3
-q:a値のガイドは次のとおりです。trac.ffmpeg.org / wiki / Encode / MP3ゼロは最高品質のVBR設定であり、通常、正常なCBR範囲の上部で平均ビットレートが発生します(320 kbit / sは最大、おそらく可逆圧縮がより適切になるポイントを少し超えています)。
Evgeni Sergeev 2016

3
そして、何をし-map aますか?
Iulian Onofrei

警告:これは、不可逆圧縮を使用してオーディオを再エンコードするため、品質がわずかに低下します。オリジナルがすでに圧縮されている場合は、品質が2度低下します。
Davidmh 2018年

このコマンドは、上記のコマンドが機能しない場合に機能します-vn
うーん

12

コマンドラインは正しく、有効なビデオファイルで機能します。mp3で動作する正しいライブラリがインストールされていることを確認し、別のオーディオコーデックでlame oプローブをインストールします。

通常

ffmpeg -formats

または

ffmpeg -codecs

詳細を知るために十分な情報を提供します。


11

ffmpeg -i sample.aviファイルのオーディオ/ビデオ形式情報を提供します。入力ストリームを解析するように適切なライブラリーが構成されていることを確認してください。また、ファイルが破損していないことを確認してください。


今、私は同じコメントを.mkv vedioで試したときに正しい結果を得ました。.aviに対して機能していないので、.aviを変換するためのffmpegコマンドはありますか
user1269669

1
AVIまたはMKVは、多くの異なるオーディオ/ビデオ形式を保持できるコンテナー形式を指します。あなたはAVIオーディオを変換するつもりはありません、あなたはまだ指定していないAVIファイル内のオーディオトラックを変換しようとしています。上記のコマンドを使用して、AVIファイル内のオーディオトラックの種類を確認します。MP3の場合は、LAME lame.sourceforge.netの
smp

6

mp3オーディオをエンコードするには、ffmpeg.orgに次の例を示します。

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

input.wavビデオのファイル名に置き換えるだけで、ビデオからオーディオを抽出しました。2手段190キロバイト/秒。上記のリンクで他の品質レベルを確認できます。


この例は、オーディオファイルを別の形式に変換するためのものであり、ビデオから抽出するためのものではありません。
イウリアンオノフレイ

@IulianOnofrei、私の回答で説明したように、オーディオファイルをビデオファイルに置き換えることができます。それは私のために働いた。
Suragch

6

これが私が今使ったものです:

ffmpeg -i my.mkv -map 0:3 -vn -b:a 320k my.mp3

オプションの説明:

  • my.mkvはソースビデオファイルです。他の形式も使用できます
  • -map 0:3ビデオファイルから3番目のストリームが必要であることを意味します。そこにあなたのNを入れてください-ビデオファイルはしばしば複数のオーディオストリームを持っています; 省略したり-map 0:a、デフォルトのオーディオストリームを使用することができます。実行ffprobe my.mkvして、ビデオファイルのストリームを確認します。
  • my.mp3はターゲットオーディオファイル名であり、ffmpegは拡張子からMP3が必要だと判断します。私の場合、ソースオーディオストリームはac3 DTSであり、コピーするだけでは不十分でした。
  • 320kは望ましい目標ビットレートです
  • -vnは、ターゲットファイルにビデオが必要ないことを意味します

2

ただの推測:

-ab 192

する必要があります

-ab 192k

それは問題であるように思われるかもしれません、しかし多分ffmpegはそれを修正するのに十分賢いです。


2
有効なコメント、そして私はそれを変更するためにOPの質問を編集しましたが、これは何も変更しません(これにより、警告が生成されます)。
Jean-Philippe Pellet 2014年

2

aviにラップされたオーディオが最初はmp3形式でない場合は-acodec mp3、追加のパラメーターとして指定する必要があります。または、mp3コーデックが何であっても(Linuxシステムではおそらく-acodec libmp3lame)。-f mp3ffmpegのすべてのバージョンがまだそのスイッチをサポートしているわけではありませんが、フォーマットをmp3に「強制」するように指定することで、プラットフォームに依存しない同じ効果を得ることができます。あなたのマイレージは異なる場合があります。


2

変換せずに抽出するには、コンテキストメニューエントリを使用します-Linuxのファイルマネージャーカスタムアクションとして-次を実行します(ビデオに含まれるオーディオタイプを確認した後、オーディオを含むビデオの例ogg):

bash -c 'ffmpeg -i "$0" -map 0:a -c:a copy "${0%%.*}".ogg' %f 

これはffmpegコマンドに基づいていffmpeg -i INPUT -map 0:a -c:a copy OUTPUTます。

私は-map 0:1その中で問題なく使用しましたが、@ LordNeckbeardのコメントで述べたように、「ストリーム0:1は常にオーディオであるとは限りません。-map 0:a代わりに-map 0:1を使用すると、あいまいさを回避できます。」


1
ストリーム0:1が常にオーディオであるとは限りません。の-map 0:a代わりに使用する-map 0:1と、あいまいさを回避できます。
llogan 2018年

@LordNeckbeard〜ありがとうございます。

私は以前mediainfoオーディオトラックを決定し、次のように選択しました。-map 0:a:1ここで、a:1は2番目のオーディオトラックインデックス、thxです。-c:a copyより速くなりました!
Aquarius Power

1

元のビデオファイルのパラメーターを保持しながら、ビデオファイルからオーディオを抽出するより簡単な方法を探している人は、以下を使用できます。

ffmpeg -i <video_file_name.extension> <audio_file_name.extension>

たとえば、次のように実行します。

ffmpeg -i screencap.mov screencap.mp3

ビデオファイルmp3からオーディオファイルを抽出しmovます。


シンプルで機能します。他のすべてのソリューションがなぜそれほど複雑なのですか?+1
スコットビッグス

1
問題は、なぜこれに削除投票があるのか​​ということです。
イウリアンオノフレ

-1

現在使用されているものの-b:a代わりに使用してください。また、入力ファイルのパスが正しいことを確認してください。-ab-ab

ビデオからオーディオを抽出するには、以下のコマンドとその正常な動作を使用しました。

String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-vn", "-ar", "44100", "-ac", "2", "-b:a", "256k", "-f", "mp3", outputFileAbsolutePath};

ここに、

  • -y -確認せずに出力ファイルを上書きします。
  • -i -FFmpegは、指定された任意の数の入力「ファイル」から読み取ります -iオプションでます
  • -vn -ビデオ録画を無効にする
  • -ar -エンコードされている場合、オーディオストリームのサンプリングレートを設定します
  • -ac -オーディオチャンネルの数を設定します。
  • -b:a -オーディオのビットレートを設定する
  • -f - フォーマット

チェックアウトこれを GitHubの上で私の完全なサンプルにFFmpegアンドロイドプロジェクトのために。

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