output intermediate video-only file if stream migration fails

This commit is contained in:
k4yt3x 2020-05-09 19:30:24 -04:00
parent 4a6f90a1f0
commit 4c48af4fa4
3 changed files with 37 additions and 10 deletions

View File

@ -522,15 +522,38 @@ class Upscaler:
Avalon.info(_('Converting extracted frames into video')) Avalon.info(_('Converting extracted frames into video'))
# use user defined output size # use user defined output size
self.process_pool.append(fm.convert_video(framerate, f'{self.scale_width}x{self.scale_height}', self.upscaled_frames)) self.process_pool.append(fm.assemble_video(framerate,
f'{self.scale_width}x{self.scale_height}',
self.upscaled_frames))
self._wait() self._wait()
Avalon.info(_('Conversion completed')) Avalon.info(_('Conversion completed'))
try:
# migrate audio tracks and subtitles # migrate audio tracks and subtitles
Avalon.info(_('Migrating audio tracks and subtitles to upscaled video')) Avalon.info(_('Migrating audio tracks and subtitles to upscaled video'))
self.process_pool.append(fm.migrate_audio_tracks_subtitles(self.current_input_video, output_video, self.upscaled_frames)) self.process_pool.append(fm.migrate_streams(self.current_input_video,
output_video,
self.upscaled_frames))
self._wait() self._wait()
# if failed to copy streams
# use file with only video stream
except subprocess.CalledProcessError:
Avalon.error(_('Failed to migrate streams'))
Avalon.warning(_('Trying to output video without additional streams'))
# construct output file path
output_video_path = output_video.parent / f'{output_video.stem}{fm.intermediate_file_name.suffix}'
# if output file already exists, cancel
if output_video_path.exists():
Avalon.error(_('Output video file exists, aborting'))
# otherwise, rename intermediate file to the output file
else:
Avalon.info(_('Writing intermediate file to: {}').format(output_video_path.absolute()))
(self.upscaled_frames / fm.intermediate_file_name).rename(output_video_path)
# destroy temp directories # destroy temp directories
self.cleanup_temp_directories() self.cleanup_temp_directories()

View File

@ -97,6 +97,7 @@ anime4kcpp:
codec: mp4v # Specify the codec for encoding from mp4v(recommended in Windows), dxva(for Windows), avc1(H264, recommended in Linux), vp09(very slow), hevc(not support in Windowds), av01(not support in Windowds) (string [=mp4v]) codec: mp4v # Specify the codec for encoding from mp4v(recommended in Windows), dxva(for Windows), avc1(H264, recommended in Linux), vp09(very slow), hevc(not support in Windowds), av01(not support in Windowds) (string [=mp4v])
ffmpeg: ffmpeg:
ffmpeg_path: '%LOCALAPPDATA%\video2x\ffmpeg-latest-win64-static\bin' ffmpeg_path: '%LOCALAPPDATA%\video2x\ffmpeg-latest-win64-static\bin'
intermediate_file_name: 'intermediate.mkv'
# step 1: extract all frames from original video # step 1: extract all frames from original video
# into temporary directory # into temporary directory
video_to_frames: video_to_frames:

View File

@ -4,7 +4,7 @@
Name: Video2X FFmpeg Controller Name: Video2X FFmpeg Controller
Author: K4YT3X Author: K4YT3X
Date Created: Feb 24, 2018 Date Created: Feb 24, 2018
Last Modified: May 7, 2020 Last Modified: May 9, 2020
Description: This class handles all FFmpeg related operations. Description: This class handles all FFmpeg related operations.
""" """
@ -32,7 +32,10 @@ class Ffmpeg:
self.ffmpeg_path = pathlib.Path(self.ffmpeg_settings['ffmpeg_path']) self.ffmpeg_path = pathlib.Path(self.ffmpeg_settings['ffmpeg_path'])
self.ffmpeg_binary = self.ffmpeg_path / 'ffmpeg' self.ffmpeg_binary = self.ffmpeg_path / 'ffmpeg'
self.ffmpeg_probe_binary = self.ffmpeg_path / 'ffprobe' self.ffmpeg_probe_binary = self.ffmpeg_path / 'ffprobe'
# video metadata
self.image_format = image_format self.image_format = image_format
self.intermediate_file_name = pathlib.Path(self.ffmpeg_settings['intermediate_file_name'])
self.pixel_format = None self.pixel_format = None
def get_pixel_formats(self): def get_pixel_formats(self):
@ -133,7 +136,7 @@ class Ffmpeg:
return(self._execute(execute)) return(self._execute(execute))
def convert_video(self, framerate, resolution, upscaled_frames): def assemble_video(self, framerate, resolution, upscaled_frames):
"""Converts images into videos """Converts images into videos
This method converts a set of images into a video This method converts a set of images into a video
@ -177,12 +180,12 @@ class Ffmpeg:
# specify output file location # specify output file location
execute.extend([ execute.extend([
upscaled_frames / 'no_audio.mp4' upscaled_frames / self.intermediate_file_name
]) ])
return(self._execute(execute)) return(self._execute(execute))
def migrate_audio_tracks_subtitles(self, input_video, output_video, upscaled_frames): def migrate_streams(self, input_video, output_video, upscaled_frames):
""" Migrates audio tracks and subtitles from input video to output video """ Migrates audio tracks and subtitles from input video to output video
Arguments: Arguments:
@ -198,7 +201,7 @@ class Ffmpeg:
execute.extend([ execute.extend([
'-i', '-i',
upscaled_frames / 'no_audio.mp4', upscaled_frames / self.intermediate_file_name,
'-i', '-i',
input_video input_video
]) ])