Source code for avfilters.reverse
"""Multimedia files reversing utilities."""
import av
[docs]
def reverse(src: str, dst: str) -> None:
"""Reverse a media.
Roughly equivalent to:
.. code-block:: bash
ffmpeg -i src -vf reverse -af areverse dst
Args:
src: The path to the source file.
The file must exist and be a valid media.
dst: The path to the destination file.
Any existing file will be overwritten.
"""
with av.open(src) as input_container, av.open(dst, mode="w") as output_container:
# TODO: check if (1) we can have multiple video streams, (2) if this works with
# audio, and (3) we need to skip subtitle streams
for input_stream in input_container.streams:
output_stream = output_container.add_stream(
input_stream.codec_context.name,
rate=input_stream.base_rate,
)
output_stream.width = input_stream.codec_context.width
output_stream.height = input_stream.codec_context.height
output_stream.pix_fmt = input_stream.codec_context.pix_fmt
graph = av.filter.Graph()
nodes = [
graph.add_buffer(template=input_stream),
graph.add("reverse"),
graph.add("buffersink"),
]
for node_from, node_to in zip(nodes[:-1], nodes[+1:]):
node_from.link_to(node_to)
graph.configure()
frames_count = 0
for frame in input_container.decode(input_stream):
graph.push(frame)
frames_count += 1
graph.push(None) # EOF: https://github.com/PyAV-Org/PyAV/issues/886.
for _ in range(frames_count):
frame = graph.pull()
for packet in output_stream.encode(frame):
output_container.mux(packet)
for packet in output_stream.encode():
output_container.mux(packet)