使用ffprobe检查纯音频文件

时间:2015-08-28 19:12:33

标签: video ffmpeg ffprobe

是否有一个ffprobe命令我可以运行以查看我拥有的mov文件是纯音频还是包含视频?我有各种各样的mov文件,其中一些是音频配音,其中一些是完整的视频。

4 个答案:

答案 0 :(得分:10)

输出codec_type

ffprobe -loglevel error -show_entries stream=codec_type -of default=nw=1 input.foo

示例结果:

codec_type=video
codec_type=audio

如果您有多个音频或视频流,则输出将显示多个视频或音频条目。

与上述相同,但仅输出值

ffprobe -loglevel error -show_entries stream=codec_type -of default=nw=1=nk=1 input.foo

或:

ffprobe -loglevel error -show_entries stream=codec_type -of csv=p=0 input.foo

示例结果:

video
audio

包含流索引

ffprobe -loglevel error -show_entries stream=index,codec_type -of csv=p=0 input.foo

示例结果:

0,video
1,audio

在这个例子中,视频是第一个流,音频是第二个流,这是常态,但并非总是如此。

如果没有音频

,则不输出任何内容
ffprobe -loglevel error -select_streams a -show_entries stream=codec_type -of csv=p=0 input.foo

输入音频的示例结果:

audio

如果输入有音频,那么就没有输出(空输出),这对于脚本使用非常有用。

其他输出格式

如果您想要不同的输出格式(json,ini,flat,csv,xml),请参阅FFprobe Documentation: Writers

答案 1 :(得分:5)

您可以输出JSON或XML中的流信息:

ffprobe -show_streams -print_format json input.mov

您将获得一系列具有codec_type属性的流,其值为audiovideo等。

答案 2 :(得分:0)

这样做的一个简单方法是检查单词' Video'在输出中。这是一个例子:

>>> cmd = shlex.split('%s -i %s' % (FFPROBE, video_path))
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> output = p.communicate()[1]
>>> 'Video' in output
True

我尝试了几个不同的文件,它似乎适用于我尝试的文件,但我确信这是一个更好的解决方案。

答案 3 :(得分:0)

要以编程方式找出视频文件中是否有音频,请使用avformat_open_input(),如下所示-如果audio_index大于或等于零,则说明视频文件中有音频。

if (avformat_open_input(&pFormatCtx, filename, nullptr, nullptr) != 0) {
    fprintf(stderr, "Couldn't open video file!\n");
    return -1;
}

if (avformat_find_stream_info(pFormatCtx, nullptr) < 0) {
    fprintf(stderr, "Couldn't find stream information!\n");
    return -1;
}

av_dump_format(pFormatCtx, 0, videoState->filename, 0);

for (i = 0; i < pFormatCtx->nb_streams; i++) {

    if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO && video_index < 0)
        video_index = i;

    if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO && audio_index < 0)
        audio_index = i;
}