Source code for avfilters.concatenate

"""Multimedia files concatenation utilities."""

import tempfile
from typing import Iterable

import av


[docs] def concatenate(files: Iterable[str], dst: str) -> None: """Concatenate multiple media into a single media. Roughly equivalent to: .. code-block:: bash ffmpeg -f concat -safe 0 -i list.txt -c copy dst Where ``list.txt`` contains the list of files to concatenate. It will be automatically created in a temporary file. Args: files: The files that should be concatenated. All files must have the same streams (same codecs, same time base, etc.) dst: The path to the destination file. Any existing file will be overwritten. """ with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".txt") as f: f.writelines(f"file '{file}'\n" for file in files) list_filename = f.name with av.open( list_filename, format="concat", options={"safe": "0"} ) as input_container, av.open(dst, mode="w") as output_container: # TODO: check if (1) this works with audio and (2) # if we should rather iterate of streams? input_stream = input_container.streams.video[0] output_stream = output_container.add_stream( template=input_stream, ) for packet in input_container.demux(input_stream): if packet.dts is None: continue packet.stream = output_stream output_container.mux(packet)