Python访问JSON对象中的数据
所以我在脚本中这样做:Python访问JSON对象中的数据,python,json,ffprobe,Python,Json,Ffprobe,所以我在脚本中这样做: import json info = json.loads(get_info()) print info 哪些产出: richard@richard-desktop:~/projects/hello-python$ python main.py { "streams": [ { "index": 0, "codec_name": "mpeg2video", "codec_l
import json
info = json.loads(get_info())
print info
哪些产出:
richard@richard-desktop:~/projects/hello-python$ python main.py
{
"streams": [
{
"index": 0,
"codec_name": "mpeg2video",
"codec_long_name": "MPEG-2 video",
"codec_type": "video",
"codec_time_base": "1001/48000",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"width": 1920,
"height": 1080,
"has_b_frames": 1,
"sample_aspect_ratio": "1:1",
"display_aspect_ratio": "16:9",
"pix_fmt": "yuv422p",
"level": 2,
"timecode": "00:59:59:00",
"id": "0x1e0",
"r_frame_rate": "24000/1001",
"avg_frame_rate": "10000/417",
"time_base": "1/90000",
"start_time": "0.945411"
},
{
"index": 1,
"codec_name": "pcm_dvd",
"codec_long_name": "PCM signed 20|24-bit big-endian",
"codec_type": "audio",
"codec_time_base": "1/48000",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"sample_fmt": "s32",
"sample_rate": "48000",
"channels": 2,
"bits_per_sample": 0,
"id": "0xa0",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_time": "0.945411",
"duration": "600.595000"
}
],
"format": {
"filename": "/home/richard/projects/hello-python/tests/test_1.mpg",
"nb_streams": 2,
"format_name": "mpeg",
"format_long_name": "MPEG-PS format",
"start_time": "0.945411",
"duration": "600.595000",
"size": "4033241092",
"bit_rate": "53723272"
}
}
richard@richard-desktop:~/projects/hello-python$ python main.py
{
如何访问流或格式,然后访问其中的属性?例如,如何从第二个流中获取编解码器\u long\u名称,或者如何从格式中获取持续时间
我试过:
print info[0]
哪些产出:
richard@richard-desktop:~/projects/hello-python$ python main.py
{
"streams": [
{
"index": 0,
"codec_name": "mpeg2video",
"codec_long_name": "MPEG-2 video",
"codec_type": "video",
"codec_time_base": "1001/48000",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"width": 1920,
"height": 1080,
"has_b_frames": 1,
"sample_aspect_ratio": "1:1",
"display_aspect_ratio": "16:9",
"pix_fmt": "yuv422p",
"level": 2,
"timecode": "00:59:59:00",
"id": "0x1e0",
"r_frame_rate": "24000/1001",
"avg_frame_rate": "10000/417",
"time_base": "1/90000",
"start_time": "0.945411"
},
{
"index": 1,
"codec_name": "pcm_dvd",
"codec_long_name": "PCM signed 20|24-bit big-endian",
"codec_type": "audio",
"codec_time_base": "1/48000",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"sample_fmt": "s32",
"sample_rate": "48000",
"channels": 2,
"bits_per_sample": 0,
"id": "0xa0",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_time": "0.945411",
"duration": "600.595000"
}
],
"format": {
"filename": "/home/richard/projects/hello-python/tests/test_1.mpg",
"nb_streams": 2,
"format_name": "mpeg",
"format_long_name": "MPEG-PS format",
"start_time": "0.945411",
"duration": "600.595000",
"size": "4033241092",
"bit_rate": "53723272"
}
}
richard@richard-desktop:~/projects/hello-python$ python main.py
{
如果我打印报告(信息),我会得到:
我获取JSON字符串的方式是运行以下命令:
ffmpeg_command = "ffprobe -v quiet -print_format json -show_format -show_streams %s" % self.absolute_path
return subprocess.check_output(ffmpeg_command, shell=True)
JSON被编码了两次,并且JSON.loads
的结果是一个字符串。python中的字符串是序列,因此第一个字符是{
再次解码项目:
info = json.loads(json.loads(get_info()))
现在,main.py输出应该如下所示:
>>> result = json.loads(output)
>>> print result
{u'streams': [{u'pix_fmt': u'yuv422p', u'index': 0, u'start_time': u'0.945411', u'codec_tag': u'0x0000', u'sample_aspect_ratio': u'1:1', u'level': 2, u'r_frame_rate': u'24000/1001', u'id': u'0x1e0', u'time_base': u'1/90000', u'codec_tag_string': u'[0][0][0][0]', u'codec_type': u'video', u'has_b_frames': 1, u'width': 1920, u'codec_long_name': u'MPEG-2 video', u'display_aspect_ratio': u'16:9', u'codec_name': u'mpeg2video', u'timecode': u'00:59:59:00', u'height': 1080, u'codec_time_base': u'1001/48000', u'avg_frame_rate': u'10000/417'}, {u'index': 1, u'sample_fmt': u's32', u'codec_tag': u'0x0000', u'bits_per_sample': 0, u'r_frame_rate': u'0/0', u'start_time': u'0.945411', u'time_base': u'1/90000', u'codec_tag_string': u'[0][0][0][0]', u'codec_type': u'audio', u'channels': 2, u'duration': u'600.595000', u'codec_long_name': u'PCM signed 20|24-bit big-endian', u'codec_name': u'pcm_dvd', u'id': u'0xa0', u'sample_rate': u'48000', u'codec_time_base': u'1/48000', u'avg_frame_rate': u'0/0'}], u'format': {u'nb_streams': 2, u'start_time': u'0.945411', u'format_long_name': u'MPEG-PS format', u'format_name': u'mpeg', u'filename': u'/home/richard/projects/hello-python/tests/test_1.mpg', u'bit_rate': u'53723272', u'duration': u'600.595000', u'size': u'4033241092'}}
您可以按名称访问流和格式参数:
>>> result['streams']
[{u'pix_fmt': u'yuv422p', u'index': 0, u'start_time': u'0.945411', u'codec_tag': u'0x0000', u'sample_aspect_ratio': u'1:1', u'level': 2, u'r_frame_rate': u'24000/1001', u'id': u'0x1e0', u'time_base': u'1/90000', u'codec_tag_string': u'[0][0][0][0]', u'codec_type': u'video', u'has_b_frames': 1, u'width': 1920, u'codec_long_name': u'MPEG-2 video', u'display_aspect_ratio': u'16:9', u'codec_name': u'mpeg2video', u'timecode': u'00:59:59:00', u'height': 1080, u'codec_time_base': u'1001/48000', u'avg_frame_rate': u'10000/417'}, {u'index': 1, u'sample_fmt': u's32', u'codec_tag': u'0x0000', u'bits_per_sample': 0, u'r_frame_rate': u'0/0', u'start_time': u'0.945411', u'time_base': u'1/90000', u'codec_tag_string': u'[0][0][0][0]', u'codec_type': u'audio', u'channels': 2, u'duration': u'600.595000', u'codec_long_name': u'PCM signed 20|24-bit big-endian', u'codec_name': u'pcm_dvd', u'id': u'0xa0', u'sample_rate': u'48000', u'codec_time_base': u'1/48000', u'avg_frame_rate': u'0/0'}]
专业提示:使用以下命令可以很好地格式化python结构:
>>> from pprint import pprint
>>> print pprint(result)
>>> pprint(result)
{u'format': {u'bit_rate': u'53723272',
u'duration': u'600.595000',
u'filename': u'/home/richard/projects/hello-python/tests/test_1.mpg',
u'format_long_name': u'MPEG-PS format',
u'format_name': u'mpeg',
u'nb_streams': 2,
u'size': u'4033241092',
u'start_time': u'0.945411'},
u'streams': [{u'avg_frame_rate': u'10000/417',
u'codec_long_name': u'MPEG-2 video',
u'codec_name': u'mpeg2video',
u'codec_tag': u'0x0000',
u'codec_tag_string': u'[0][0][0][0]',
u'codec_time_base': u'1001/48000',
u'codec_type': u'video',
u'display_aspect_ratio': u'16:9',
u'has_b_frames': 1,
u'height': 1080,
u'id': u'0x1e0',
u'index': 0,
u'level': 2,
u'pix_fmt': u'yuv422p',
u'r_frame_rate': u'24000/1001',
u'sample_aspect_ratio': u'1:1',
u'start_time': u'0.945411',
u'time_base': u'1/90000',
u'timecode': u'00:59:59:00',
u'width': 1920},
{u'avg_frame_rate': u'0/0',
u'bits_per_sample': 0,
u'channels': 2,
u'codec_long_name': u'PCM signed 20|24-bit big-endian',
u'codec_name': u'pcm_dvd',
u'codec_tag': u'0x0000',
u'codec_tag_string': u'[0][0][0][0]',
u'codec_time_base': u'1/48000',
u'codec_type': u'audio',
u'duration': u'600.595000',
u'id': u'0xa0',
u'index': 1,
u'r_frame_rate': u'0/0',
u'sample_fmt': u's32',
u'sample_rate': u'48000',
u'start_time': u'0.945411',
u'time_base': u'1/90000'}]}
试一试
要从第二个流打印
codec\u long\u name
和duration
,请执行以下操作:
details = subprocess.check_output(["C:/FFmpeg/bin/ffprobe.exe",
"-loglevel", "quiet", "-print_format", "json", "-show_streams",
file_path])
info = json.loads(details)
print info['streams'][1]['codec_long_name'], info['streams'][1]['duration']
在这种情况下,我得到:TypeError:expected string或buffer那么
打印类型(info),repr(info)
(没有双重解码)的结果是什么?如果没有dobule解码,结果是:这毫无意义,这意味着我的答案是正确的。你确定你与我们共享了所有相关的代码吗?我已经添加了打印repr的输出(信息)。