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",
)