From e4ab56d6a9bbc84fdc75e9af27f59b91da861387 Mon Sep 17 00:00:00 2001 From: JargeZ Date: Wed, 5 Jan 2022 22:33:23 +0300 Subject: [PATCH] GIF SUPPORT & fix when video without audio --- app/NtscApp.py | 9 +++++++-- app/Renderer.py | 46 +++++++++++++++++++++++++++++++--------------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/app/NtscApp.py b/app/NtscApp.py index c5a9af9..ead1c14 100755 --- a/app/NtscApp.py +++ b/app/NtscApp.py @@ -472,7 +472,8 @@ def open_video(self, path: Path): "height": int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)), "frames_count": int(cap.get(cv2.CAP_PROP_FRAME_COUNT)), "orig_fps": cap.get(cv2.CAP_PROP_FPS), - "path": path + "path": path, + "suffix": path.suffix.lower(), } logger.debug(f"selfinput: {self.input_video}") self.orig_wh = (int(self.input_video["width"]), int(self.input_video["height"])) @@ -502,7 +503,11 @@ def render_image(self): im_buf_arr.tofile(target_file) def render_video(self): - target_file = pick_save_file(self, title='Render video as', suffix='.mp4') + if self.input_video['suffix'] == ".gif": + suffix = self.input_video['suffix'] + else: + suffix = ".mp4" + target_file = pick_save_file(self, title='Render video as', suffix=suffix) if not target_file: return None render_data = { diff --git a/app/Renderer.py b/app/Renderer.py index 71f01a4..f3b5dc8 100755 --- a/app/Renderer.py +++ b/app/Renderer.py @@ -24,7 +24,12 @@ class Renderer(QtCore.QObject): def run(self): self.running = True - tmp_output = self.render_data['target_file'].parent / f'tmp_{self.render_data["target_file"].name}' + if self.render_data["input_video"]["suffix"] == '.gif': + suffix = '.mp4' + else: + suffix = self.render_data["input_video"]["suffix"] + + tmp_output = self.render_data['target_file'].parent / f'tmp_{self.render_data["target_file"].stem}{suffix}' upscale_2x = self.render_data["upscale_2x"] @@ -42,7 +47,7 @@ def run(self): cv2.VideoWriter_fourcc(*'H264') ] video = cv2.VideoWriter() - + open_result = False while not open_result: open_result = video.open( @@ -104,19 +109,30 @@ def run(self): video.write(frame) video.release() - audio_orig = ( - ffmpeg - .input(str(self.render_data["input_video"]["path"].resolve())) - ) - self.sendStatus.emit('Original audio extracted') - video = ffmpeg.input(str(tmp_output.resolve())) - ( - ffmpeg - .output(video.video, audio_orig.audio, str(self.render_data["target_file"].resolve()), - shortest=None, vcodec='copy', acodec='copy') - .overwrite_output() - .run() - ) + + orig_path = str(self.render_data["input_video"]["path"].resolve()) + orig_suffix = self.render_data["input_video"]["suffix"] + result_path = str(self.render_data["target_file"].resolve()) + + # FIXME beautify file render and audio detection + + orig = ffmpeg.input(orig_path) + temp_video_stream = ffmpeg.input(str(tmp_output.resolve())) + # render_streams.append(temp_video_stream.video) + + ff_command = ffmpeg.output(orig.audio, temp_video_stream.video, result_path, + shortest=None, vcodec='copy', acodec='copy') + logger.debug(ff_command) + logger.debug(' '.join(ff_command.compile())) + try: + ff_command.overwrite_output().run() + except ffmpeg.Error as e: + if orig_suffix == '.gif': + ff_command = ffmpeg.output(temp_video_stream.video, result_path, shortest=None) + else: + ff_command = ffmpeg.output(temp_video_stream.video, result_path, shortest=None, vcodec='copy') + ff_command.overwrite_output().run() + self.sendStatus.emit('Audio copy done') tmp_output.unlink() self.renderStateChanged.emit(False)