FFMPEG python检查字典键是否存在

时间:2017-02-06 12:03:30

标签: python dictionary audio ffmpeg ffprobe

我想检查是否有字典键:"data["streams"][1]["codec_name"]",如果有一个键可以打印几个键的值,如果不打印"没有音频"。实际上,如果没有音频,则缺少整个数据[" streams"] [1]。现在,即使音频存在,脚本也始终返回No Audio。我做错了什么?

 #!/usr/bin/env python
    import subprocess
    import json

    input_file = raw_input("Please enter the input file path: ")

    returned_data = subprocess.check_output(['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', input_file])
    data = json.loads(returned_data.decode('utf-8'))
    print "==========================Audio============================="
    if 'data["streams"][1]["codec_name"]' in data:
            print "Codec: %s" %(data["streams"][1]["codec_name"])
            print "Sample Rate: %.3f KHz" %(int(data["streams"][1]["sample_rate"])/1000)
            print "Bitrate: %d Kbps" %(int(data["streams"][1]["bit_rate"])/1000)
    else:
            print "NO AUDIO"

1 个答案:

答案 0 :(得分:0)

当你这样做时

if 'data["streams"][1]["codec_name"]' in data:

您问data是否有一个名为data["streams"][1]["codec_name"]的密钥,它不会出现,因此它永远不会出现。另外,你试图在另一个dict中的列表中引用一个dict键,这样做的pythonic方法是:

try:
    codec = data["streams"][1]["codec_name"]
    # print your information here
except (KeyError, IndexError):
    print('no audio')

这样做是为了尝试访问该变量。如果密钥KeyErrorcodec_name不存在,则会抓住streams,如果IndexError不存在,则会抓住[1]

然而,作为一个ffmpeg书呆子,我会建议采用不同的方法。听起来你的目标是在文件有音频时打印音频信息,如果没有音频则打印no audio。我刚给出的示例的问题是,如果音频是媒体文件的第二个流,它将仅适用于您。音频通常出现在视频之后,但有时会出现故障,有时会有多个音频流,所以我建议你循环遍历每个流,检查它是否是音频流,然后是音频,打印信息。这将显示多个音频流,无论其顺序如何:

audio_streams = 0

if 'streams' in data:
    for stream in streams:
        if stream['codec_type'] == 'audio':
            # print your info here (I'm abbreviating)
            print(stream['codec_name'])

if audio_streams == 0:
    print('no audio...')

如果你真的只想要来自1个音频流的数据,我仍然会进行循环,但在打印信息后会发出break语句。