web-dev-qa-db-ja.com

ビデオファイルにオーディオが含まれているかどうかを確認します

Ffmpegを使用してmp3を抽出するために、ビデオにオーディオが含まれているかどうかを調べようとしています。ビデオにオーディオチャネルが含まれていない場合、ffmpegは空のmp3ファイルを作成します。これを使用して、最初にオーディオがビデオに存在するかどうかを確認します。ビデオに音声が含まれているかどうかを識別するためのより良い方法があると確信しています。 avprobeはこれに役立ちますか?誰かが私にリソースまたはおそらく解決策を教えてもらえますか?

編集:驚いたことに、ffprobeの最新ビルドを実行しているサーバーで同じコマンドが実行されません。エラーが発生します

認識されないオプション 'select_stream'

オプション 'select_stream'の値 'a'の設定に失敗しました

これを修正する方法はありますか?

19
Kartos

私はFFprobeを使用します(FFMPEGに付属しています):

ffprobe -i INPUT -show_streams -select_streams a -loglevel error

音声がない場合は何も出力されません。オーディオストリームがある場合は、次のようになります。

[ストリーム]

インデックス= 0

codec_name = mp3

codec_long_name = MP3(MPEGオーディオレイヤー3)

プロファイル=不明

codec_type = audio

codec_time_base = 1/44100

等...

[/ストリーム]

これは、このプロセスを自動化するために使用している言語に関係なく、解析するのに十分簡単なはずです。

21
AJ29

ローカルパスからの通常のビデオファイルの場合は、次のようにして、ビデオにオーディオファイルがあるかどうかを確認できます。

MediaMetadataRetriever を調べる必要があります

METADATA_KEY_HAS_AUDIOを使用すると、ビデオに音声が含まれているかどうかを確認できます。

private boolean isVideoHaveAudioTrack(String path) {
        boolean audioTrack =false;

        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource(path);
        String hasAudioStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
        if(hasAudioStr.equals("yes")){ 
         audioTrack=true; } 
        else{ 
        audioTrack=false; }

        return audioTrack;
    }

ここでパスはビデオファイルのパスです。

PS:それは古い質問なので、私はそれが助けになるかもしれない他の何人かの人々を助けるためにこの答えを書いています。

6
King of Masses

この問題を解決するためのラウンドアバウトを見つけました。これは私が尋ねた質問に答えているようです。

ffprobe -i input.mp4 -show_streams 2>&1 | grep 'Stream #0:1'
2
Kartos
ffprobe -v fatal                         # set log level to fatal
        -of default=nw=1:nk=1            # use default format and hide wrappers and keys
        -show_streams                    # show info about media streams
        -select_streams a                # show only audio streams
        -show_entries stream=codec_type  # show only stream.codec_type entries
        video.mp4                        # input file

メディアファイルには、オーディオストリームが含まれています。

audio
1
0
0
0
0
0
0
0
0
0
0
0
und
SoundHandler

メディアファイルにオーディオストリームが含まれていないと、空の結果に戻ります。

メディア以外のファイルも空の結果を返します。メディア以外のファイルやその他のエラーの場合にエラーメッセージを返したい場合は、代わりに-v errorを使用してください。

ffprobe -v error                         # set log level to error
        -of default=nw=1:nk=1            # use default format and hide wrappers and keys
        -show_streams                    # show info about media streams
        -select_streams a                # show only audio streams
        -show_entries stream=codec_type  # show only stream.codec_type entries
        video.mp4                        # input file

したがって、空の結果の代わりにこれを使用します。

non-media-file.Zip: Invalid data found when processing input
1
mmdemirbas

オーディオがあるかどうかだけを知りたいが、ストリームの詳細を気にしない場合は、次のコマンドを実行できます。これにより、入力ファイルにオーディオストリームの継続時間が抽出されます。応答がnull /空白の場合、入力ファイルには音声が含まれていません。

コマンド:

ffprobe -v error -of flat=s_ -select_streams 1 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1
1
sebastian.roibu