diff --git a/vid_convert.py b/vid_convert.py index 7ad4056..f3e17e5 100755 --- a/vid_convert.py +++ b/vid_convert.py @@ -49,8 +49,12 @@ def get_infos(file): 'index': a_stream['index'], 'channels': a_stream['channels'], 'channel_layout': a_stream['channel_layout'], - 'language': a_stream['tags']['language'], - 'title': a_stream['tags']['title']} + 'language': a_stream['tags']['language'] + } + try: + a_stream_infos.update({'title': a_stream['tags']['title']}) + except: + a_stream_infos.update({'title': 'No title'}) a_infos.append(a_stream_infos) s_infos = [] for s_stream in full_s_infos['streams']: @@ -63,7 +67,6 @@ def get_infos(file): duration = float(duration['format']['duration']) hdr10_v_cmd = f'ffmpeg -loglevel panic -i {file} -c:v copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_parser -o metadata.json --verify -' hdr10_v_raw = subprocess.getoutput(hdr10_v_cmd) - # logging.debug(hdr10_v_raw) if 'metadata detected' in hdr10_v_raw: hdr10_cmd = f'ffmpeg -loglevel panic -i {file} -c:v copy -vbsf hevc_mp4toannexb -f hevc - | hdr10plus_parser -o /tmp/{file}_hdr10_metadata.json -' v_infos.update({'hdr10': True, 'hdr10_metdata': f'/tmp/{file}_hdr10_metadata.json'}) @@ -153,23 +156,25 @@ def convert_audio(file, track, volume_adj, channels, channel_layout, language, t bitrate = f'{64*channels}k' if channel_layout == "5.1(side)": channel_layout = "5.1" - codec = 'libopus' + codec = 'libfdk_aac -vbr 5' metadatas = f'-metadata language="{language}" -metadata title="{title}"' - command = f'ffmpeg -loglevel error -i {file} -map 0:{track} -map_metadata -1 -vn -sn -c:a {codec} -b:a {bitrate} -mapping_family 1 -filter:a volume={volume_adj},aformat=channel_layouts={channel_layout} {metadatas} -y {file}_audio_{track}_{language}.mka' + command = f'ffmpeg -loglevel error -i {file} -map 0:{track} -map_metadata -1 -vn -sn -c:a {codec} -mapping_family 1 -filter:a volume={volume_adj},aformat=channel_layouts={channel_layout} {metadatas} -y {file}_audio_{track}_{language}.mka' logging.debug(command) result = subprocess.getoutput(command) logging.info(result) -def convert_video(file, infos, start, crop, crf): +def convert_video(file, infos, start, crop, crf, animation): str_start = "{:05d}".format(start) output = f'{file}_video_t{str_start}.mkv' - fmt = infos['video']['pix_fmt'] - if fmt == "yuv420p": - fmt = "yuv420p10le" + fmt = "yuv420p10le" # Always 10-bits track = infos['video']['index'] - codec = 'libx265 -preset slow' + codec = 'libx265 -preset slower -g 1' # -g 1 is for intra encoding hdr = '' + if animation: + tune = "-tune animation" + else: + tune = "" if 'side_data_list' in infos['video'].keys(): try: light_level = f"{infos['video']['side_data_list'][1]['max_content']},{infos['video']['side_data_list'][1]['max_average']}" @@ -205,7 +210,7 @@ def convert_video(file, infos, start, crop, crf): hdr = f'-x265-params hdr-opt=1:repeat-headers=1:colorprim={color_primaries}:transfer={color_transfer}:colormatrix={color_space}:master-display={master_display}:max-cll={light_level}' except: logging.debug("Aucune information HDR") - command = f'ffmpeg -loglevel error -i {file} -map 0:{track} -ss {start} -t 300 -an -sn -c:v {codec} {hdr} -crf {crf} -pix_fmt {fmt} -filter:v {crop} -y {output}' + command = f'ffmpeg -loglevel error -i {file} -map 0:{track} -ss {start} -t 300 -an -sn -c:v {codec} {tune} {hdr} -crf {crf} -pix_fmt {fmt} -filter:v {crop} -y {output}' logging.debug(command) result = subprocess.getoutput(command) logging.info(result) @@ -270,6 +275,7 @@ if __name__ == '__main__': parser.add_argument("-d", "--debug", dest="debug", action="store_true") parser.add_argument("-s", "--stabilise", dest="stab", action="store_true") parser.add_argument("-t", "--starttime", dest="starttime") + parser.add_argument("-a", "--animation", dest="animation", action="store_true") args = parser.parse_args() if args.debug: logging.basicConfig(format='[%(asctime)s]\n%(message)s', level=logging.DEBUG, datefmt='%d/%m/%Y %H:%M:%S') @@ -282,6 +288,10 @@ if __name__ == '__main__': volumes = volume_audio(file, infos) if args.stab: stabilization(file) + if args.animation: + animation = True + else: + animation = False if not args.starttime: for track in infos['subtitles']: extract_subs(file, track['index'], track['language']) @@ -293,6 +303,6 @@ if __name__ == '__main__': vid_part_time = 0 while vid_part_time < infos['duration']: crf = 19 - convert_video(file, infos, vid_part_time, cropsize, crf) + convert_video(file, infos, vid_part_time, cropsize, crf, animation) vid_part_time += 300 create_mkv(file)