查找视频文件中是否包含音频

时间:2014-01-30 02:39:39

标签: audio video ffmpeg ffprobe avprobe

我正在试图弄清楚视频中是否有音频,以便使用ffmpeg提取mp3。当视频不包含音频通道时,ffmpeg会创建一个空的mp3文件,我用它来判断视频中是否存在音频。我确信有更好的方法来识别视频中是否存在音频。 avprobe会帮忙吗?任何人都可以指出我的资源或解决方案吗?

编辑:令人惊讶的是,运行最新版本的ffprobe的服务器上的相同命令无法运行。它抛出错误说

无法识别的选项'select_stream'

无法为选项'select_stream'设置值'a'

有任何想法如何纠正这个问题?

5 个答案:

答案 0 :(得分:20)

我会使用FFprobe(它随FFMPEG一起发布):

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

如果没有音频,它什么也没输。如果有音频流,那么你会得到类似的东西:

  

[STREAM]

     

索引= 0

     

codec_name = MP3

     

codec_long_name = MP3(MPEG音频第3层)

     

轮廓=未知

     

codec_type =音频

     

codec_time_base =四万四千一分之一

     

     

等...

     

[/ STREAM]

这应该很容易解析,无论您使用哪种语言来使这个过程自动化。

答案 1 :(得分:5)

如果是来自本地路径的普通视频文件,您可以执行以下操作来查找视频是否包含音频文件。

您需要查看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:由于这是一个老问题,我写这个答案是为了帮助其他人,对他们有所帮助。

答案 2 :(得分:2)

找到一轮即将解决这个问题。这似乎回答了我提出的问题。

ffprobe -i input.mp4 -show_streams 2>&1 | grep 'Stream #0:1'

答案 3 :(得分:1)

如果您只想知道是否有音频并且不关心流细节,可以运行以下命令,该命令将提取输入文件中音频流的持续时间。如果响应为null / whitespace,则输入文件中没有音频。

命令:

{{1}}

答案 4 :(得分:1)

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