FFMPEG python检查是否存在字典密钥

问题描述:

我想检查是否有字典密钥:"data["streams"][1]["codec_name"]"以及是否有打印几个键的值,如果不打印“无音频”。实际上,如果没有音频,整个数据[“流”] [1]就会丢失。即使音频存在,脚本始终返回无音频。我做错了什么?FFMPEG python检查是否存在字典密钥

#!/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" 
+0

你正在检查一个字符串是否在'data'中,你应该这样做:if data [“streams”] [1] [“codec_name”] in data:' –

+0

@Chris_Rands如果我照你的建议做: ** TypeError:不可能的类型:'dict'**错误 –

当你做到这一点

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

你问如果data有一个名为data["streams"][1]["codec_name"]关键它不那么它永远不会出现。此外,您尝试另一个字典中的列表中引用的字典键,这样做的Python的方式是:

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

这样做是试图访问该变量。如果codec_namestreams不存在,并且您捕获IndexError如果[1]不存在,则捕获KeyError

但是,作为一个ffmpeg书呆子,我会建议采取不同的方式来做到这一点。这听起来像你的目标是打印音频信息,如果文件有音频,并且打印no audio,如果它没有任何音频。我刚才给出的例子的问题是,如果音频是媒体文件的第二个流,它将仅适用于您。音频通常是在视频之后出现,但有时会出现故障,有时会有多个音频流,所以我建议您循环播放每个流,检查它是否是音频流,然后如果是音频,请打印信息。这将显示不管其顺序超过1个音频流:

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声明打印的信息之后。