Skip to main content

aio-ffmpeg

CI PyPI version Python 3.11+ Typing: Typed License: MIT

Строго типизированная асинхронная обёртка над ffmpeg и ffprobe для Python 3.11+.

Процессы запускаются через asyncio.create_subprocess_exec(). Нет зависимостей времени выполнения — только стандартная библиотека Python.


Сравнение с аналогами

Возможность aio-ffmpeg ffmpeg-python moviepy subprocess
Асинхронность (asyncio) Да Нет Нет Ручная реализация
Зависимости runtime 0 (stdlib) 2 10+ 0
Строгая типизация (mypy --strict) Да Нет Частичная Нет
Парсинг прогресса Да (-progress pipe:1) Нет Tqdm Ручной
Graceful shutdown Да (q\n → SIGINT) Нет Нет Нет
Автоопределение GPU Да (NVENC/AMF/QSV/VideoToolbox) Нет Нет Нет

Возможности

  • Асинхронный запуск процессов: asyncio.create_subprocess_exec(), контроль конкурентности через asyncio.Semaphore.
  • Типизация: frozen dataclass-модели со slots=True, PEP 561 py.typed, mypy --strict.
  • Прогресс: потоковый разбор протокола -progress pipe:1 (кадры, время, битрейт, скорость, процент).
  • Graceful shutdown: отправка q в stdin перед системными сигналами завершения. Предотвращает повреждение заголовков MP4.
  • Три уровня API:
    • FFmpegClient — готовые методы для типовых задач.
    • MediaPipeline — декларативный конвейер цепочек обработки.
    • FFmpegCommand — построитель аргументов CLI с валидацией.
  • FFprobe: типизированный разбор контейнеров, видео/аудио/субтитр-потоков, глав и метаданных.
  • Аппаратное ускорение: автоопределение NVENC, AMF, QSV, D3D11VA, VideoToolbox.
  • Интеграция с async-yt-dlp: конвейер загрузки и постобработки медиафайлов.

Методы FFmpegClient

Метод Назначение
transcode(...) Перекодирование с контролем кодеков, битрейта, разрешения, FPS и фильтров
two_pass_transcode(...) Двухпроходное кодирование с контролем битрейта
extract_audio(...) Извлечение аудиодорожки (-vn) в AAC, MP3, FLAC, OPUS, WAV
trim(...) Обрезка по меткам времени (stream copy или перекодирование)
concat(...) Склейка файлов через demuxer или граф фильтров
convert(...) Смена контейнера (remuxing, stream copy)
scale(...) Масштабирование видео
normalize_audio(...) Двухпроходная нормализация по EBU R128 (фильтр loudnorm)
screenshot(...) Извлечение кадра по временной метке
thumbnails(...) Генерация миниатюр по интервалу, количеству или частоте кадров
create_contact_sheet(...) Раскадровка — сетка миниатюр (tile)
detect_silence(...) Обнаружение тишины и пауз (SilenceInterval)
probe(...) Анализ метаданных файла → типизированный MediaInfo
pipeline(...) Создание MediaPipeline для декларативной обработки

Установка

Требуется Python 3.11+, установленные в системе ffmpeg и ffprobePATH или через аргументы клиента / переменную FFMPEG_PATH).

# Базовая установка (без runtime-зависимостей):
pip install aio-ffmpeg

# С интеграцией с async-yt-dlp:
pip install "aio-ffmpeg[ytdlp]"

Или через uv:

uv add aio-ffmpeg

Быстрый старт

1. Анализ медиафайла

import asyncio
from async_ffmpeg import FFmpegClient


async def main() -> None:
    client = FFmpegClient()
    info = await client.probe("video.mp4")

    print(f"Формат: {info.format.format_long_name}")
    print(f"Длительность: {info.duration} сек")

    if info.primary_video:
        v = info.primary_video
        print(f"Видео: {v.codec_name}, {v.width}x{v.height} @ {v.frame_rate:.2f} fps")

    if info.primary_audio:
        a = info.primary_audio
        print(f"Аудио: {a.codec_name}, {a.sample_rate} Hz, каналов: {a.channels}")


asyncio.run(main())

2. Транскодирование с прогрессом

import asyncio
from async_ffmpeg import FFmpegClient, ProgressInfo


async def main() -> None:
    client = FFmpegClient()

    async def on_progress(p: ProgressInfo) -> None:
        print(f"Прогресс: {p.percent:.1f}% | Скорость: {p.speed} | FPS: {p.fps:.1f}")

    result = await client.transcode(
        input="input.mp4",
        output="output_720p.mp4",
        video_codec="libx264",
        crf=23,
        resolution=(1280, 720),
        audio_codec="aac",
        audio_bitrate="128k",
        on_progress=on_progress,
    )
    print(f"Готово за {result.duration_seconds:.2f} сек")


asyncio.run(main())

3. Декларативный конвейер (MediaPipeline)

import asyncio
from async_ffmpeg import FFmpegClient


async def main() -> None:
    client = FFmpegClient()

    # обрезка → масштабирование → нормализация звука → вывод
    await (
        client.pipeline("input.mp4")
        .trim(start=10, duration=60)
        .scale(1280, 720)
        .normalize_audio(target_lufs=-16.0)
        .output("highlight_720p.mp4")
        .run()
    )


asyncio.run(main())

4. Интеграция с async-yt-dlp

import asyncio
from async_ffmpeg import FFmpegClient
from async_ffmpeg.integration import process_download_result


async def main() -> None:
    client = FFmpegClient()

    # download_result — объект с протоколом DownloadResultProtocol
    post_result = await process_download_result(
        download_result,
        action="extract_audio",
        client=client,
        audio_format="mp3",
        audio_bitrate="320k",
    )
    print(f"Результат: {post_result.output_path}")


asyncio.run(main())

Примеры

В каталоге examples/ — готовые примеры:


Разработка

# Dev-окружение
uv sync --extra dev

# Линтинг
uv run ruff check src/ tests/
uv run ruff format --check src/ tests/

# Типизация
uv run mypy src/

# Тесты
uv run pytest tests/ -v

Лицензия

Распространяется под лицензией MIT.

Release files for aio-ffmpeg 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aio-ffmpeg 0.1.1
File Size Uploaded
aio_ffmpeg-0.1.1.tar.gz 306.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aio-ffmpeg 0.1.1
File Interpreter ABI Platform
aio_ffmpeg-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 381.2 kB

Release files / aio_ffmpeg-0.1.1.tar.gz

Download URL aio_ffmpeg-0.1.1.tar.gz
Size 306.3 kB
Tags Source
SHA-256 checksum
How to use checksums
3a92da5cc4c96413e61952d195b5932f7795a22b7fd0a9365236377f07271804
BLAKE2b-256 checksum
How to use checksums
9b2f6d46ad099170fbb0a4bfc4dd5c5a8d3bf7138d58c1bcf263be6294ce4d3f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / aio_ffmpeg-0.1.1-py3-none-any.whl

Download URL aio_ffmpeg-0.1.1-py3-none-any.whl
Size 74.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
48873f6f70f8d6d52395bef4c6144bc9353a6f844f1359630818ec9baf066134
BLAKE2b-256 checksum
How to use checksums
4bd21917d7f60412272c3b8d28c0ce9888675e416114c1ca1c42ded790738576
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.1.2

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page