Guest User

ffmpeghdr..py

a guest
Mar 3rd, 2022
806
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.65 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sys
  5. import subprocess
  6. import json
  7.  
  8.  
  9. def main():
  10.     path = sys.argv[1]
  11.     res = subprocess.check_output([
  12.         'ffprobe',
  13.         '-hide_banner',
  14.         '-loglevel',
  15.         'warning',
  16.         '-select_streams',
  17.         'V',
  18.         '-print_format',
  19.         'json',
  20.         '-show_frames',
  21.         '-read_intervals',
  22.         '%+#1',
  23.         '-show_entries',
  24.         'frame=color_space,color_primaries,color_transfer,side_data_list,pix_fmt',
  25.         '-i',
  26.         path,
  27.         ], stderr=subprocess.DEVNULL)
  28.     j = json.loads(res)
  29.  
  30.     color_space = j.get('frames')[0].get('color_space')
  31.     color_primaries = j.get('frames')[0].get('color_primaries')
  32.     color_transfer = j.get('frames')[0].get('color_transfer')
  33.  
  34.     print("color_space: \t\t" + color_space)
  35.     print("color_primaries: \t" + color_primaries)
  36.     print("color_transfer: \t" + color_transfer + '\n')
  37.  
  38.     side_data_list = j.get('frames')[0].get('side_data_list')[0]
  39.  
  40.     red_x = round(eval(side_data_list.get('red_x', '0')), 4)
  41.     red_y = round(eval(side_data_list.get('red_y', '0')), 4)
  42.     green_x = round(eval(side_data_list.get('green_x', '0')), 4)
  43.     green_y = round(eval(side_data_list.get('green_y', '0')), 4)
  44.     blue_x = round(eval(side_data_list.get('blue_x', '0')), 4)
  45.     blue_y = round(eval(side_data_list.get('blue_y', '0')), 4)
  46.     white_point_x = round(eval(side_data_list.get('white_point_x', '0'
  47.                           )), 4)
  48.     white_point_y = round(eval(side_data_list.get('white_point_y', '0'
  49.                           )), 4)
  50.     min_luminance = round(eval(side_data_list.get('min_luminance', '0'
  51.                           )), 4)
  52.     max_luminance = round(eval(side_data_list.get('max_luminance', '0'
  53.                           )), 4)
  54.  
  55.     cll_max_content = 0
  56.     cll_max_average = 0
  57.  
  58.     try:
  59.         side_data_list = j.get('frames')[0].get('side_data_list')[1]
  60.         cll_max_content = \
  61.             round(eval(str(side_data_list.get('max_content', '0'))), 4)
  62.         cll_max_average = \
  63.             round(eval(str(side_data_list.get('max_average', '0'))), 4)
  64.     except:
  65.         pass
  66.  
  67.     # Convert data to x265 format
  68.     # https://x265.readthedocs.io/en/master/cli.html#cmdoption-master-display
  69.  
  70.     x265_red_x = round(red_x / 0.00002)
  71.     x265_red_y = round(red_y / 0.00002)
  72.     x265_green_x = round(green_x / 0.00002)
  73.     x265_green_y = round(green_y / 0.00002)
  74.     x265_blue_x = round(blue_x / 0.00002)
  75.     x265_blue_y = round(blue_y / 0.00002)
  76.     x265_white_point_x = round(white_point_x / 0.00002)
  77.     x265_white_point_y = round(white_point_y / 0.00002)
  78.     x265_min_luminance = round(min_luminance / 0.0001)
  79.     x265_max_luminance = round(max_luminance / 0.0001)
  80.  
  81.     print('x265:\t\tG(' + str(x265_green_x) + ',' + str(x265_green_y) + ')B(' \
  82.         + str(x265_blue_x) + ',' + str(x265_blue_y) + ')R(' + str(x265_red_x) + ',' \
  83.         + str(x265_red_y) + ')WP(' + str(x265_white_point_x) + ',' \
  84.         + str(x265_white_point_y) + ')L(' + str(x265_max_luminance) + ',' \
  85.         + str(x265_min_luminance) + '):max-cll=' + str(cll_max_content) \
  86.         + ',' + str(cll_max_average))
  87.  
  88.     print('svt-av1:\tG(' + str(green_x) + ',' + str(green_y) + ')B(' \
  89.         + str(blue_x) + ',' + str(blue_y) + ')R(' + str(red_x) + ',' \
  90.         + str(red_y) + ')WP(' + str(white_point_x) + ',' \
  91.         + str(white_point_y) + ')L(' + str(max_luminance) + ',' \
  92.         + str(min_luminance) + '):content-light=' \
  93.         + str(cll_max_content) + ',' + str(cll_max_average))
  94.  
  95.     return 0
  96.  
  97.  
  98. if __name__ == '__main__':
  99.     sys.exit(main())  # next section explains the use of sys.exit
Advertisement
Add Comment
Please, Sign In to add comment