是否有一个ffprobe命令我可以运行以查看我拥有的mov文件是纯音频还是包含视频?我有各种各样的mov文件,其中一些是音频配音,其中一些是完整的视频。
答案 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
属性的流,其值为audio
,video
等。
答案 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;
}