basic cpu encode support

This commit is contained in:
2024-11-27 16:47:39 +08:00
parent a8abb92b84
commit 9139727dc6
3 changed files with 136 additions and 23 deletions

View File

@ -12,6 +12,7 @@ class FfmpegTask(object):
self.output_file = output_file
self.mute = True
self.speed = 1
self.frame_rate = 25
self.subtitles = []
self.luts = []
self.audios = []
@ -36,7 +37,7 @@ class FfmpegTask(object):
for i in self.input_file:
if type(i) is str:
continue
elif type(i) is FfmpegTask:
elif isinstance(i, FfmpegTask):
if i.need_run():
yield i
@ -69,7 +70,9 @@ class FfmpegTask(object):
def get_output_file(self):
if self.task_type == 'copy':
return self.input_file
return self.input_file[0]
if self.output_file == '':
self.set_output_file()
return self.output_file
def correct_task_type(self):
@ -109,3 +112,103 @@ class FfmpegTask(object):
def check_audio_track(self):
if len(self.audios) > 0:
self.mute = False
def get_ffmpeg_args(self):
args = ['-y', '-hide_banner']
video_output_str = "[0:v]"
if self.task_type == 'encode':
input_args = []
filter_args = []
output_args = []
video_output_str = "[0:v]"
audio_output_str = "[0:v]"
video_input_count = 0
audio_input_count = 0
for input_file in self.input_file:
input_args.append("-i")
if type(input_file) is str:
input_args.append(input_file)
elif isinstance(input_file, FfmpegTask):
input_args.append(input_file.get_output_file())
for lut in self.luts:
filter_args.append("[0:v]lut3d=file=" + lut + "[0:v]")
for overlay in self.overlays:
input_index = input_args.count("-i")
input_args.append("-i")
input_args.append(overlay)
filter_args.append(f"{video_output_str}[{input_index}:v]scale=rw:rh[v]")
filter_args.append(f"[v][{input_index}:v]overlay=1:eof_action=endall[v]")
video_output_str = "[v]"
output_args.append("-map")
output_args.append(video_output_str)
output_args.append("-r")
output_args.append(f"{self.frame_rate}")
if self.mute:
output_args.append("-an")
else:
input_index = 0
for audio in self.audios:
input_index = input_args.count("-i")
input_args.append("-i")
input_args.append(audio.replace("\\", "/"))
if audio_input_count > 0:
filter_args.append(f"{audio_output_str}[{input_index}:a]amix[a]")
audio_output_str = "[a]"
else:
audio_output_str = f"[{input_index}:a]"
audio_input_count += 1
if audio_input_count == 1:
audio_output_str = f"{input_index}"
output_args.append(f"-map")
output_args.append(audio_output_str)
return args + input_args + ["-filter_complex", ";".join(filter_args)] + output_args + [self.get_output_file()]
elif self.task_type == 'concat':
input_args = []
output_args = []
filter_args = []
video_output_str = "[0:v]"
audio_output_str = "[0:v]"
video_input_count = 0
audio_input_count = 0
for input_file in self.input_file:
input_index = input_args.count("-i")
input_args.append("-i")
if type(input_file) is str:
input_args.append(input_file.replace("\\", "/"))
elif isinstance(input_file, FfmpegTask):
input_args.append(input_file.get_output_file().replace("\\", "/"))
if video_input_count > 0:
filter_args.append(f"{video_output_str}[{input_index}:v]concat=n=2:v=1:a=0[v]")
video_output_str = "[v]"
else:
video_output_str = f"[{input_index}:v]"
video_input_count += 1
output_args.append("-map")
output_args.append(video_output_str)
if self.mute:
output_args.append("-an")
else:
input_index = 0
for audio in self.audios:
input_index = input_args.count("-i")
input_args.append("-i")
input_args.append(audio.replace("\\", "/"))
if audio_input_count > 0:
filter_args.append(f"{audio_output_str}[{input_index}:a]amix[a]")
audio_output_str = "[a]"
else:
audio_output_str = f"[{input_index}:a]"
audio_input_count += 1
if audio_input_count == 1:
audio_output_str = f"{input_index}"
output_args.append(f"-map")
output_args.append(audio_output_str)
return args + input_args + ["-filter_complex", ";".join(filter_args)] + output_args + [self.get_output_file()]
def set_output_file(self, file=None):
if file is None:
if self.output_file == '':
# TODO: Random Filename
self.output_file = "rand.mp4"
else:
self.output_file = file