28

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

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

无法识别的选项“select_stream”

无法为选项“select_stream”设置值“a”

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

4

5 回答 5

31

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

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

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

[溪流]

索引=0

编解码器名称=mp3

codec_long_name=MP3(MPEG 音频第 3 层)

个人资料=未知

codec_type=音频

codec_time_base=1/44100

ETC

ETC...

[/溪流]

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

于 2014-01-30T03:12:13.507 回答
8

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

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

于 2017-09-29T07:10:46.513 回答
3

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

ffprobe -i input.mp4 -show_streams 2>&1 | grep 'Stream #0:1'
于 2014-02-04T08:27:19.090 回答
2
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
于 2017-06-10T03:07:58.690 回答
1

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

命令:

ffprobe -v error -of flat=s_ -select_streams 1 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1
于 2017-03-29T15:37:48.783 回答