【问题标题】:Find if video file has audio present in it [duplicate]查找视频文件中是否存在音频[重复]
【发布时间】:2014-02-22 04:25:08
【问题描述】:

我正在尝试确定视频中是否存在音频,以便使用 ffmpeg 提取 mp3。当视频不包含音频通道时,ffmpeg 会创建一个空的 mp3 文件,我首先使用它来确定视频中是否存在音频。我确信有更好的方法来识别视频中是否存在音频。 avprobe 会对此有所帮助吗?谁能指出我的资源或可能的解决方案?

编辑:令人惊讶的是,我的服务器上运行最新版本的 ffprobe 的相同命令没有运行。它会抛出一个错误,说

无法识别的选项“select_stream”

未能为选项“select_stream”设置值“a”

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

【问题讨论】:

  • (多年后):如果其他人遇到与编辑时添加的相同错误,请检查您的命令。它说“select_stream”。它应该是“select_streams”

标签: audio video ffmpeg ffprobe avprobe


【解决方案1】:

找到了解决这个问题的方法。这似乎回答了我提出的问题。

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

【讨论】:

  • 如果你确定你的音频永远是你的第二个流,那没关系。
  • 不得不求助于这个只是因为 select_streams 在我的服务器上不起作用。首先,我认为这是因为旧版本的 ffmpeg 等。人。并因此将 ffmpeg + 依赖项更新到最新版本。我仍然遇到同样的问题。知道为什么吗?
  • 不,我一无所知:(我的答案中的命令行在我的机器上运行良好(我使用的是 ffprobe 版本 N-56254-gb7bd688)...
  • 是的,该命令在我的本地机器上也能完美运行。但是,由于某种原因,在我的 Ubuntu 服务器上运行相同的命令会抛出:无法识别的选项“show_streams”无法为选项“show_streams”设置值“-select_streams”,并且我正在运行 ffprobe 版本 1.0.1,构建于 2013 年 1 月 10 日。
  • 如果选择流对您很重要,那么您绝对应该尝试使用较新的版本,否则请保持原样;)
【解决方案2】:

如果是本地路径下的普通视频文件,可以这样来判断视频是否有音频文件。

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

【讨论】:

  • 如果文件没有元数据怎么办?
【解决方案3】:
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

【讨论】:

    【解决方案4】:

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

    命令:

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

    【讨论】:

    • 这似乎不起作用。
    【解决方案5】:

    我会使用 FFprobe(它与 FFMPEG 一起提供):

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

    如果没有音频,它不会输出任何内容。如果有音频流,那么你会得到类似的东西:

    [流]

    索引=0

    codec_name=mp3

    codec_long_name=MP3(MPEG 音频第 3 层)

    profile=未知

    codec_type=音频

    codec_time_base=1/44100

    等

    等等……

    [/STREAM]

    无论您使用何种语言来使此过程自动化,都应该很容易解析。

    【讨论】:

    • 效果很好!很好地解决了我的问题。
    • 这似乎对我不起作用。我得到没有音频的文件的输出。
    • 使用 ffprobe 版本 4.2.2,您可以获得 JSON 输出:ffprobe -i INPUT -show_streams -select_streams a -of json -loglevel error
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2014-06-20
    • 2018-12-28
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多