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)