2017-02-06 137 views
0

我想檢查是否有字典密鑰:"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'**錯誤 –

回答

0

當你做到這一點

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

相關問題