Skip to content

Transcoding

You can use python-ffmpeg to transcode an input file into various codecs and formats.

For example, you can change the container of a video file without re-encoding the content as follows:

from ffmpeg import FFmpeg, Progress


def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input("input.mov")
        .output(
            "output.mp4",
            codec="copy",
        )
    )

    @ffmpeg.on("progress")
    def on_progress(progress: Progress):
        print(progress)

    ffmpeg.execute()


if __name__ == "__main__":
    main()
import asyncio

from ffmpeg import Progress
from ffmpeg.asyncio import FFmpeg


async def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input("input.mov")
        .output(
            "output.mp4",
            codec="copy",
        )
    )

    @ffmpeg.on("progress")
    def on_progress(progress: Progress):
        print(progress)

    await ffmpeg.execute()


if __name__ == "__main__":
    asyncio.run(main())

You can also scale down the resolution of the video as follows.

from ffmpeg import FFmpeg, Progress


def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input("input.mov")
        .output(
            "output.mp4",
            {"codec:v": "libx264", "filter:v": "scale=1280:-1"},
            preset="veryslow",
            crf=24,
        )
    )

    @ffmpeg.on("progress")
    def on_progress(progress: Progress):
        print(progress)

    ffmpeg.execute()


if __name__ == "__main__":
    main()
import asyncio

from ffmpeg import Progress
from ffmpeg.asyncio import FFmpeg


async def main():
    ffmpeg = (
        FFmpeg()
        .option("y")
        .input("input.mov")
        .output(
            "output.mp4",
            {"codec:v": "libx264", "filter:v": "scale=1280:-1"},
            vf="scale=1280:-1",
            preset="veryslow",
            crf=24,
        )
    )

    @ffmpeg.on("progress")
    def on_progress(progress: Progress):
        print(progress)

    await ffmpeg.execute()


if __name__ == "__main__":
    asyncio.run(main())