Avatar ·

Python и FFmpeg: создать видео с аудио за один проход или иначе ускорить процесс

📁 python, numpy, pip

пытаюсь подружить Python и FFmpeg под Windows.

Необходимо из набора изображений и звуковых дорожек (хранятся в памяти программы как numpy array) сделать одно длинное видео.

Смог сделать это в 2 прохода:

  • сначала создаю видео файл без аудио дорожки,
  • потом прибавляю к нему аудио, но хотелось бы оптимальнее и быстрее:

 

ffmpeg -y -f rawvideo -vcodec rawvideo -s 1920x1080 -pix_fmt bgr24 -r 5.00 ^       -i pipe:0 -an -vcodec libx264 -preset medium -pix_fmt yuv420p video.avi

- создаю видео

ffmpeg -y -f s16le -acodec pcm_s16le -ar 44100 -ac 1 ^       -i pipe:0 -i video.avi -c:v h264 -c:a ac3 videoANDaudio.avi

- добавляю аудио.

Можно ли сделать это в 1 проход? Т.е. как то надо передавать видео и аудио одновременно, в 2 потока. Думал о NamedPipe, но не нашел в интернете информацию о том, как его создать в Windows.

PS. Предложите технологию, лучше FFmpeg, для решения задачи, если такая имеется.

Avatar ·

Про обработку видео в Python

n
n

PS. Предложите технологию, лучше FFMpeg для решения задачи, если такая имеется.

n
n

PyAV

n

Есть такой замечаетельный проект: . Это питонячие биндинги к libav. Для работы с видео в Python я использую его. АPI PyAV сильно не совпадает с аргументами ffmpeg и ванильного libav, но при этом оно кажется весьма понятным и логичным в контексте Python.

n

PyAV: Пример

n

n
import avnfrom av.video.frame import VideoFramenfrom av.video.stream import VideoStreamn# В этом списке будем хранить кадры в виде numpy-векторов.narray_list = []n# Откроем контейнер на чтениеninput_container = av.open('input.mp4')n# Применим «инверсное мультиплексирование» =)n# Получим пакеты из потока.ninput_packets = input_container.demux()n# Получии все кадры видео и положим их в `array_list`.nfor packet in input_packets:n    if isinstance(packet.stream, VideoStream):n        # Получим все кадры пакетаn        frames = packet.decode()n        for raw_frame in frames:n            # Переформатируем кадры, к нужному размеру и виду.n            # Это лучше делать средствами pyav (libav)n            #   потому что быстре��.n            frame = raw_frame.reformat(32, 32, 'rgb24')n            # Превратить каждый кадр в numpy-вектор (dtype=int).n            array = frame.to_nd_array()n            # Положим в список numpy-векторов.n            array_list += [array]n# Откроем контейнер на запись.noutput_container = av.open('out.mp4', mode='w', format='mp4')n# Добавим к контейнеру поток c кодеком h264.noutput_stream = output_container.add_stream('h264', rate=25)n# В этом списке будем хранить пакеты выходного потока.noutput_packets = []n# Пройдем по списку векторов и упакуем их в пакеты выходного протока.nfor array in array_list:n    # Построим видео-кадр по вектору.n    frame = VideoFrame.from_ndarray(array, format='rgb24')n    # Запакуем полученный кадр.n    packet = output_stream.encode(frame)n    # Положим в список пакетов.n    output_packets += [packet]n# Применим «прямое мультиплексирование» =)n# Для каждого пакета вызовем мультиплексор.nfor packet in output_packets:n    if packet:n        output_container.mux(packet)noutput_container.close()n
n

Еще примеры:

n
    n
  • — создает видео из последовательности переданных изображений; для работы с изображениями использует OpenCV. На самом деле, тут можно обойтись и без OpenCV.
  • n
  • — создает видео, в котором цвет кадра меняется в последовательности цветов радуги.
  • n
  • — записывает кадры исходного видео, до тех пор пока, их количество видео-кадров не превысит 100.
  • n
n

Сам я активно использую PyAV в этом проекте: . Возможно, в его коде будет что-то полезное для Вас.

n

n

PyAV: Установка

n

Есть маленькая проблема в том, что PyAV достаточно . Тем более под Windows. Для сборки из исходников требуются конкретные версии зависимостей (ffmpeg, h264 и пр.) Но есть уже готовые сборки для питонячьего пакетного менеджера . Я не пробовал, но кажется достаточно просто поставить conda на Windows:

n
    n
  1. Выбираете нужный вам инсталлятор тут: . Я предполагаю что это будет Python 2.7 64-bit (exe installer)
  2. n
  3. Дальше запускаете и следуете его инструкциям.
  4. n
  5. Далее как описано в в командной строке Windows conda list .
  6. n
  7. После этого вам потребуется поставить нужные пакеты.
  8. n
n
conda install numpynconda install -c danielballan pyavn# или conda install -c soft-matter pyavn
n

Я не уверен, что это все заведется под Windows — я не пробовал. Если нет, то на официальном сайте есть инcтрукция как собрать самостоятельно:

n
    n
  • ;
  • n
  • + еще есть вот такая заметка .
  • n
n

Авторы библиотеки весьма отзывчивы, и им можно смело задавать вопросы и писать о проблемах тут: .

n

Альтернативы

n

Из альтернатив, еще наталкивался на

n
    n
  • — просто биндинг к ffmpeg и libav;
  • n
  • — тоже биндинг к ffmpeg;
  • n
  • — еще один биндинг, работает только на Windows;
  • n
  • — используют свой обработчик видео без ffmpeg, выглядит он слишком заморочено;
  • n
  • — используют свой обработчик видео, пока не осилил, но при беглом осмотре, выглядит удобным;
  • n
  • — обработка видео через OpenCV изначально похожа на забивание гвоздей микроскопом;
  • n
  • — библиотека для не линейного монтажа видео, но кодировать ей тоже можно. Отчасти тоже забивание гвоздей микроскопом.
  • n
n

Про Python GStreamer:

n
    n
  • ;
  • n
  • ;
  • n
  • .
  • n
n

Качество альтернатив

n
    n
  • Avpy у меня почему-то так и не завелся.
  • n
  • pyffmpeg тоже сходу не собирается, а перед началом установки приходится править код.
  • n
  • ffmpeg-cffi-py не смог найти путей до нужных библиотек.
  • n
  • Остальные пока не пробовал.
  • n

Войдите чтобы оставить ответ

Блоги