Python accessing data in JSON object

前端 未结 3 992
既然无缘
既然无缘 2021-02-13 12:53

so I do this in my script:

import json
info = json.loads(get_info())
print info

Which outputs:

richard@richard-desktop:~/projec         


        
相关标签:
3条回答
  • 2021-02-13 13:52

    The JSON was encoded twice, and the result of json.loads is a string. Strings in python are sequences thus the first character is a {.

    Decode the item again:

    info = json.loads(json.loads(get_info()))
    

    Now your main.py output should look like:

    >>> 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'}}
    

    and you can access the streams and format parameters by name:

    >>> 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'}]
    

    Pro tip: use the pprint module to format python structures nicely:

    >>> 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'}]}
    
    0 讨论(0)
  • 2021-02-13 13:54

    To print codec_long_name and duration from the second stream do the following:

    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']
    
    0 讨论(0)
  • 2021-02-13 13:59

    Try

    from StringIO import StringIO
    io = StringIO(get_info())
    json.load(io)
    
    0 讨论(0)
提交回复
热议问题