Source code for draugr.ffmpeg_utilities.merge

import os
import subprocess
from pathlib import Path
from typing import Optional

from apppath import ensure_existence
from draugr.ffmpeg_utilities.extract import AUDIO_FORMAT
from warg import Number, identity

__all__ = ["merge_video"]


def get_frame_format(frames_dir) -> str:
    """

    :param frames_dir:
    :type frames_dir:
    :return:
    :rtype:
    """
    for file_ in os.listdir(frames_dir):
        if os.path.splitext(file_)[-1].lower() in [".jpg", ".png"]:
            return os.path.splitext(file_)[-1].lower()


[docs]def merge_video( frames_dir: Path, merge_audio: bool = True, audio_dir: Optional[Path] = None, merge_dir: Optional[Path] = None, merge_rate: Number = 25, ffmpeg_path: Path = "ffmpeg", ): """ :param frames_dir: :type frames_dir: :param merge_audio: :type merge_audio: :param audio_dir: :type audio_dir: :param merge_dir: :type merge_dir: :param merge_rate: :type merge_rate: :param ffmpeg_path: :type ffmpeg_path: """ postfix = "" # "_00" vid_dir = frames_dir.parent if audio_dir is None: audio_dir = vid_dir / "audio" if merge_dir is None: merge_dir = ensure_existence(vid_dir / "merge", sanitisation_func=identity) temp_out = str(merge_dir / "temp.mp4") subprocess.call( [ str(ffmpeg_path), "-r", str(merge_rate), # "-pattern_type", # "glob", "-i", str(frames_dir / f"%d{get_frame_format(frames_dir)}"), "-y", "-c:v", "libx264", "-vf", "fps=25,format=yuv420p", temp_out, ] ) a = [] shortname = frames_dir.parent.name if merge_audio: sound_dir = audio_dir / ("track" + AUDIO_FORMAT) if sound_dir.exists(): a.extend(["-i", str(sound_dir)]) else: print(f"No audio found in {sound_dir}") subprocess.call( [ str(ffmpeg_path), "-i", temp_out, *a, "-vcodec", "copy", "-acodec", "copy", "-y", str(merge_dir / f"out.mp4"), ] )
if __name__ == "__main__": merge_video( Path.home() / "DataWin" / "DeepFake" / "Frontier" / "Originals" / "thomas_old_high_res" / "frames", ffmpeg_path=Path.home() / "OneDrive - Alexandra Instituttet" / "Applications" / "ffmpeg-5.0-essentials_build" / "bin" / "ffmpeg.exe", )