From e110c99a14380837cbfcf8947902cb1bcafff71f Mon Sep 17 00:00:00 2001 From: Zoltan Date: Mon, 29 Jul 2024 19:09:26 +0200 Subject: [PATCH] first commit --- video_converter.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 video_converter.py diff --git a/video_converter.py b/video_converter.py new file mode 100644 index 0000000..c3ecff1 --- /dev/null +++ b/video_converter.py @@ -0,0 +1,62 @@ +from glob import glob +import os +import subprocess + + +base_folder = f'C:{os.sep}Users{os.sep}Zoltan{os.sep}Videos{os.sep}' +save_file = "converted.txt" + +def get_video_length(filename): + result = subprocess.run(["ffprobe", "-v", "error", "-show_entries", + "format=duration", "-of", + "default=noprint_wrappers=1:nokey=1", filename], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + return float(result.stdout) + +def create_temp_file_name(split): + return f'{split[0]}{os.sep}TEMP_{split[1]}' + + + +file_names = glob(f'{base_folder}*{os.sep}*.mp4') + +f = open(save_file, "r+") +converted_files = [line.rstrip(os.linesep) for line in f] +for file_name in file_names: + if(file_name not in converted_files): + split = file_name.rsplit(os.sep,1) + temp_name = create_temp_file_name(split) + print(f'Convert started: {file_name}') + os.system(f'ffmpeg -v quiet -stats -hwaccel cuda -i \"{file_name}\" -preset veryfast -c:v libx264 -crf 18 -c:a copy \"{temp_name}\"') + os.remove(file_name) + os.rename(temp_name,f'{split[0]}{os.sep}{split[1]}') + f.write(file_name+os.linesep) + +clips = glob(f'{base_folder}*.mp4') +for clip in clips: + if(clip not in converted_files): + split = clip.rsplit(os.sep,1) + temp_name = create_temp_file_name(split) + file_stats = os.stat(clip) + duration = get_video_length(clip) + tries = 0 + under_25 = False + while not under_25: + bitrate = ( 24 * 8192.0 ) / ( 1.048576 * duration ) * (1- tries*0.05) + + print(f'Duration: {duration} Bitrate: {bitrate} Tries: {tries+1}') + print(f'Convert started: {clip}') + + os.system(f'ffmpeg -v quiet -stats -i \"{clip}\" -c:v libx264 -preset veryfast -b {bitrate:.0f}k -c:a copy \"{temp_name}\"') + + temp_file_stat = os.stat(temp_name) + print(f'file size stats: {temp_file_stat.st_size}, ------> {(temp_file_stat.st_size / (1024 * 1024))}') + if(25>(temp_file_stat.st_size / (1024 * 1024))): + under_25 = True + os.remove(clip) + os.rename(temp_name,f'{split[0]}{os.sep}{split[1]}') + else: + tries +=1 + os.remove(temp_name) + f.write(clip+os.linesep) \ No newline at end of file