def extract_video(input_file, output_dir, output_ext=None, fps=None): input_file_path = Path(input_file) output_path = Path(output_dir) if not output_path.exists(): output_path.mkdir(exist_ok=True) if input_file_path.suffix == '.*': input_file_path = Path_utils.get_first_file_by_stem( input_file_path.parent, input_file_path.stem) else: if not input_file_path.exists(): input_file_path = None if input_file_path is None: io.log_err("input_file not found.") return if fps is None: fps = io.input_int( "Enter FPS ( ?:help skip:fullfps ) : ", 0, help_message= "How many frames of every second of the video will be extracted.") if output_ext is None: output_ext = io.input_str( "Output image format? ( jpg png ?:help skip:png ) : ", "png", ["png", "jpg"], help_message= "png is lossless, but extraction is x10 slower for HDD, requires x10 more disk space than jpg." ) for filename in Path_utils.get_image_paths(output_path, ['.' + output_ext]): Path(filename).unlink() job = ffmpeg.input(str(input_file_path)) kwargs = {'pix_fmt': 'rgb24'} if fps != 0: kwargs.update({'r': str(fps)}) if output_ext == 'jpg': kwargs.update({'q:v': '2'}) #highest quality for jpg job = job.output(str(output_path / ('%5d.' + output_ext)), **kwargs) try: job = job.run() except: io.log_err("ffmpeg fail, job commandline:" + str(job.compile()))
def extract_video(input_file, output_dir, output_ext=None, fps=None): input_file_path = Path(input_file) output_path = Path(output_dir) if not output_path.exists(): output_path.mkdir(exist_ok=True) if input_file_path.suffix == '.*': input_file_path = Path_utils.get_first_file_by_stem( input_file_path.parent, input_file_path.stem) else: if not input_file_path.exists(): input_file_path = None if input_file_path is None: io.log_err("input_file not found.") return if fps is None: fps = io.input_int("输入帧率[FPS] ( ?:帮助 跳过:默认帧率 ) : ", 0, help_message="FPS是指每秒多少张图片,一般视频为24,推荐输入12") if output_ext is None: output_ext = io.input_str( "输出格式? ( jpg还是png ?:帮助 默认为png ) : ", "png", ["png", "jpg"], help_message="png 为无损格式, 但是比JPG慢10倍, 空间也比JPG大十倍,建议使用JPG格式.") for filename in Path_utils.get_image_paths(output_path, ['.' + output_ext]): Path(filename).unlink() job = ffmpeg.input(str(input_file_path)) kwargs = {'pix_fmt': 'rgb24'} if fps != 0: kwargs.update({'r': str(fps)}) if output_ext == 'jpg': kwargs.update({'q:v': '2'}) #highest quality for jpg job = job.output(str(output_path / ('%5d.' + output_ext)), **kwargs) try: job = job.run() except: io.log_err("ffmpeg 调用失败, 错误提示:" + str(job.compile()))
def extract_video(input_file, output_dir, output_ext=None, fps=None): input_file_path = Path(input_file) output_path = Path(output_dir) if not output_path.exists(): output_path.mkdir(exist_ok=True) if input_file_path.suffix == '.*': input_file_path = Path_utils.get_first_file_by_stem( input_file_path.parent, input_file_path.stem) else: if not input_file_path.exists(): input_file_path = None if input_file_path is None: io.log_err("input_file not found.") return if output_ext is None: output_ext = io.input_str( "Output image format (extension)? ( default:png ) : ", "png") if fps is None: fps = io.input_int( "Enter FPS ( ?:help skip:fullfps ) : ", 0, help_message= "How many frames of every second of the video will be extracted.") for filename in Path_utils.get_image_paths(output_path, ['.' + output_ext]): Path(filename).unlink() job = ffmpeg.input(str(input_file_path)) kwargs = {} if fps != 0: kwargs.update({'r': str(fps)}) job = job.output(str(output_path / ('%5d.' + output_ext)), **kwargs) try: job = job.run() except: io.log_err("ffmpeg fail, job commandline:" + str(job.compile()))
def extract_video(input_file, output_dir, output_ext=None, fps=None): input_file_path = Path(input_file) output_path = Path(output_dir) if not output_path.exists(): output_path.mkdir(exist_ok=True) if input_file_path.suffix == ".*": input_file_path = Path_utils.get_first_file_by_stem( input_file_path.parent, input_file_path.stem) else: if not input_file_path.exists(): input_file_path = None if input_file_path is None: logger.error("input_file not found.") return if fps is None: fps = 0 if output_ext is None: output_ext = "png" for filename in Path_utils.get_image_paths(output_path, ["." + output_ext]): Path(filename).unlink() job = ffmpeg.input(str(input_file_path)) kwargs = {"pix_fmt": "rgb24"} if fps != 0: kwargs.update({"r": str(fps)}) if output_ext == "jpg": kwargs.update({"q:v": "2"}) # highest quality for jpg job = job.output(str(output_path / ("%5d." + output_ext)), **kwargs) try: job = job.run() except: logger.error("ffmpeg fail, job commandline:" + str(job.compile()))
def video_from_sequence( input_dir, output_file, reference_file=None, ext=None, fps=None, bitrate=None, lossless=None ): input_path = Path(input_dir) output_file_path = Path(output_file) reference_file_path = Path(reference_file) if reference_file is not None else None if not input_path.exists(): io.log_err("input_dir not found.") return if not output_file_path.parent.exists(): output_file_path.parent.mkdir(parents=True, exist_ok=True) return out_ext = output_file_path.suffix if ext is None: ext = io.input_str ("Input image format (extension)? ( default:png ) : ", "png") if lossless is None: lossless = io.input_bool ("Use lossless codec ? ( default:no ) : ", False) video_id = None audio_id = None ref_in_a = None if reference_file_path is not None: if reference_file_path.suffix == '.*': reference_file_path = Path_utils.get_first_file_by_stem (reference_file_path.parent, reference_file_path.stem) else: if not reference_file_path.exists(): reference_file_path = None if reference_file_path is None: io.log_err("reference_file not found.") return #probing reference file probe = ffmpeg.probe (str(reference_file_path)) #getting first video and audio streams id with fps for stream in probe['streams']: if video_id is None and stream['codec_type'] == 'video': video_id = stream['index'] fps = stream['r_frame_rate'] if audio_id is None and stream['codec_type'] == 'audio': audio_id = stream['index'] if audio_id is not None: #has audio track ref_in_a = ffmpeg.input (str(reference_file_path))[str(audio_id)] if fps is None: #if fps not specified and not overwritten by reference-file fps = max (1, io.input_int ("FPS ? (default:25) : ", 25) ) if not lossless and bitrate is None: bitrate = max (1, io.input_int ("Bitrate of output file in MB/s ? (default:16) : ", 16) ) i_in = ffmpeg.input(str (input_path / ('%5d.'+ext)), r=fps) output_args = [i_in] if ref_in_a is not None: output_args += [ref_in_a] output_args += [str (output_file_path)] output_kwargs = {} if lossless: output_kwargs.update ({"c:v": "png" }) else: output_kwargs.update ({"c:v": "libx264", "b:v": "%dM" %(bitrate), "pix_fmt": "yuv420p", }) output_kwargs.update ({"c:a": "aac", "b:a": "192k", "ar" : "48000", "strict": "experimental" }) job = ( ffmpeg.output(*output_args, **output_kwargs).overwrite_output() ) try: job = job.run() except: io.log_err ("ffmpeg fail, job commandline:" + str(job.compile()) )
def video_from_sequence( input_dir, output_file, reference_file=None, ext=None, fps=None, bitrate=None, lossless=None, ): input_path = Path(input_dir) output_file_path = Path(output_file) reference_file_path = Path( reference_file) if reference_file is not None else None if not input_path.exists(): logger.error("input_dir not found.") return if not output_file_path.parent.exists(): output_file_path.parent.mkdir(parents=True, exist_ok=True) return out_ext = output_file_path.suffix if ext is None: ext = "png" if lossless is None: lossless = False video_id = None audio_id = None ref_in_a = None if reference_file_path is not None: if reference_file_path.suffix == ".*": reference_file_path = Path_utils.get_first_file_by_stem( reference_file_path.parent, reference_file_path.stem) else: if not reference_file_path.exists(): reference_file_path = None if reference_file_path is None: logger.error("reference_file not found.") return # probing reference file probe = ffmpeg.probe(str(reference_file_path)) # getting first video and audio streams id with fps for stream in probe["streams"]: if video_id is None and stream["codec_type"] == "video": video_id = stream["index"] fps = stream["r_frame_rate"] if audio_id is None and stream["codec_type"] == "audio": audio_id = stream["index"] if audio_id is not None: # has audio track ref_in_a = ffmpeg.input(str(reference_file_path))[str(audio_id)] if fps is None: # if fps not specified and not overwritten by reference-file fps = 25 if not lossless and bitrate is None: bitrate = 16 input_image_paths = Path_utils.get_image_paths(input_path) i_in = ffmpeg.input("pipe:", format="image2pipe", r=fps) output_args = [i_in] if ref_in_a is not None: output_args += [ref_in_a] output_args += [str(output_file_path)] output_kwargs = {} if lossless: output_kwargs.update({"c:v": "png"}) else: output_kwargs.update({ "c:v": "libx264", "b:v": "%dM" % (bitrate), "pix_fmt": "yuv420p" }) output_kwargs.update({"c:a": "aac", "b:a": "192k", "ar": "48000"}) job = ffmpeg.output(*output_args, **output_kwargs).overwrite_output() try: job_run = job.run_async(pipe_stdin=True) for image_path in input_image_paths: with open(image_path, "rb") as f: image_bytes = f.read() job_run.stdin.write(image_bytes) job_run.stdin.close() job_run.wait() except: logger.error("ffmpeg fail, job commandline:" + str(job.compile()))