diff --git a/bin/ffmpeg.py b/bin/ffmpeg.py index bc97a1c..62d6094 100755 --- a/bin/ffmpeg.py +++ b/bin/ffmpeg.py @@ -4,13 +4,12 @@ Name: FFMPEG Class Author: K4YT3X Date Created: Feb 24, 2018 -Last Modified: February 1, 2019 +Last Modified: February 21, 2019 Description: This class handles all FFMPEG related operations. - -Version 2.0.6 """ +import json import subprocess @@ -22,43 +21,43 @@ class Ffmpeg: and inserting audio tracks to videos. """ - def __init__(self, ffmpeg_path, outfile, ffmpeg_arguments, hardware_acc=False): - self.ffmpeg_path = '{}ffmpeg.exe'.format(ffmpeg_path) - self.outfile = outfile + def __init__(self, ffmpeg_path, ffmpeg_arguments, hardware_acc=False): + self.ffmpeg_path = ffmpeg_path + self.ffmpeg_binary = '\"{}ffmpeg.exe\"'.format(ffmpeg_path) self.hardware_acc = hardware_acc self.ffmpeg_arguments = ffmpeg_arguments - def extract_frames(self, videoin, outpath): + def get_video_info(self, input_video): + """ Gets input video information + + This method reads input video information + using ffprobe in dictionary. + + Arguments: + input_video {string} -- input video file path + + Returns: + dictionary -- JSON text of input video information + """ + json_str = subprocess.check_output('\"{}ffprobe.exe\" -v quiet -print_format json -show_format -show_streams \"{}\"'.format(self.ffmpeg_path, input_video)) + return json.loads(json_str.decode('utf-8')) + + def extract_frames(self, input_video, extracted_frames): """Extract every frame from original videos This method extracts every frame from videoin using ffmpeg Arguments: - videoin {string} -- input video path - outpath {string} -- video output folder + input_video {string} -- input video path + extracted_frames {string} -- video output folder """ - execute = '\"{}\" -i \"{}\" {}\\extracted_%0d.png -y {}'.format( - self.ffmpeg_path, videoin, outpath, ' '.join(self.ffmpeg_arguments)) - print(execute) + execute = '{} -i \"{}\" \"{}\"\\extracted_%0d.png -y {}'.format( + self.ffmpeg_binary, input_video, extracted_frames, ' '.join(self.ffmpeg_arguments)) + print('Executing: {}'.format(execute)) subprocess.call(execute) - def extract_audio(self, videoin, outpath): - """Strips audio tracks from videos - - This method strips audio tracks from videos - into the output folder in aac format. - - Arguments: - videoin {string} -- input video path - outpath {string} -- video output folder - """ - execute = '\"{}\" -i \"{}\" -vn -acodec aac {}\\output-audio.aac -y {}'.format( - self.ffmpeg_path, videoin, outpath, ' '.join(self.ffmpeg_arguments)) - print(execute) - subprocess.call(execute) - - def convert_video(self, framerate, resolution, upscaled): + def convert_video(self, framerate, resolution, upscaled_frames): """Converts images into videos This method converts a set of images into a @@ -67,23 +66,22 @@ class Ffmpeg: Arguments: framerate {float} -- target video framerate resolution {string} -- target video resolution - upscaled {string} -- source images folder + upscaled_frames {string} -- source images folder """ - execute = '\"{}\" -r {} -f image2 -s {} -i {}\\extracted_%d.png -vcodec libx264 -crf 25 -pix_fmt yuv420p {}\\no_audio.mp4 -y {}'.format( - self.ffmpeg_path, framerate, resolution, upscaled, upscaled, ' '.join(self.ffmpeg_arguments)) - print(execute) + execute = '{} -r {} -f image2 -s {} -i \"{}\"\\extracted_%d.png -vcodec libx264 -crf 25 -pix_fmt yuv420p \"{}\"\\no_audio.mp4 -y {}'.format( + self.ffmpeg_binary, framerate, resolution, upscaled_frames, upscaled_frames, ' '.join(self.ffmpeg_arguments)) + print('Executing: {}'.format(execute)) subprocess.call(execute) - def insert_audio_track(self, upscaled): - """Insert audio into video - - Inserts the WAV audio track stripped from - the original video into final video. + def migrate_audio_tracks_subtitles(self, input_video, output_video, upscaled_frames): + """ Migrates audio tracks and subtitles from input video to output video Arguments: - upscaled {string} -- upscaled image folder + input_video {string} -- input video file path + output_video {string} -- output video file path + upscaled_frames {string} -- directory containing upscaled frames """ - execute = '\"{}\" -i {}\\no_audio.mp4 -i {}\\output-audio.aac -shortest -codec copy {} -y {}'.format( - self.ffmpeg_path, upscaled, upscaled, self.outfile, ' '.join(self.ffmpeg_arguments)) - print(execute) + execute = '{} -i \"{}\"\\no_audio.mp4 -i \"{}\" -c:a copy -c:v copy -c:s copy -map 0:v? -map 1:a? -map 1:s? \"{}\" -y {}'.format( + self.ffmpeg_binary, upscaled_frames, input_video, output_video, ' '.join(self.ffmpeg_arguments)) + print('Executing: {}'.format(execute)) subprocess.call(execute)