FFMPEG python 检查字典键是否存在

FFMPEG python check if dictionary key exists

我想检查是否有字典键:"data["streams"][1]["codec_name"]" 以及是否有一个用于打印几个键的值,如果没有则打印“No Audio”。实际上,如果没有音频,则整个数据 ["streams"][1] 都会丢失。现在脚本总是返回无音频,即使音频存在。我做错了什么?

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

当你这样做时

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

你问的是 data 是否有一个名为 data["streams"][1]["codec_name"] 的密钥,但它没有,所以它永远不会出现。此外,您正在尝试在另一个字典中的列表中引用字典键,这样做的 pythonic 方式是:

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

它所做的是尝试访问该变量。如果键 codec_namestreams 不存在,则捕获 KeyError,如果 [1] 不存在,则捕获 IndexError

但是,作为一个 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 语句。