2017-02-06 11 views
0

Я хочу проверить, есть ли ключ для словаря: "data["streams"][1]["codec_name"]", и если есть возможность распечатать значения пары ключей, и если не печатать «Нет звука». На самом деле, если нет звука, все данные [«streams»] [1] отсутствуют. Сейчас скрипт всегда возвращает No Audio, даже если звук существует. Что я делаю неправильно?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"] в данных: ' –

+0

@Chris_Rands, если я сделаю то, что вы предложили мне получить : ** ТипError: unhashable type: 'dict' ** error –

ответ

0

Когда вы сделаете это

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

Вы спрашиваете, если data имеет ключ с именем data["streams"][1]["codec_name"] которой он не так будет и не отображаться. Кроме того, вы пытаетесь ссылаться на ключ Dict в списке в другой Словаре, то вещий способ сделать это будет:

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

Что это делает попытку получить доступ к этой переменной. Вы поймаете KeyError, если какой-либо ключ codec_name или streams не существует, и вы поймаете IndexError, если [1] не существует.

Однако, в качестве ffmpeg nerd я бы предложил другой способ сделать это. Похоже, ваша цель - печатать аудиоинформацию, если файл имеет звук, и печатать 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 заявление после того, как вы печатаете информацию.