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, для решения задачи, если такая имеется.
Про обработку видео в Python
nnnPS. Предложите технологию, лучше FFMpeg для решения задачи, если такая имеется.
n
PyAV
nЕсть такой замечаетельный проект: . Это питонячие биндинги к libav. Для работы с видео в Python я использую его. АPI PyAV сильно не совпадает с аргументами ffmpeg и ванильного libav, но при этом оно кажется весьма понятным и логичным в контексте Python.
PyAV: Пример
nnimport 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()nnЕще примеры:
n- n
- — создает видео из последовательности переданных изображений; для работы с изображениями использует OpenCV. На самом деле, тут можно обойтись и без OpenCV. n
- — создает видео, в котором цвет кадра меняется в последовательности цветов радуги. n
- — записывает кадры исходного видео, до тех пор пока, их количество видео-кадров не превысит
100. n
Сам я активно использую PyAV в этом проекте: . Возможно, в его коде будет что-то полезное для Вас.
nnPyAV: Установка
nЕсть маленькая проблема в том, что PyAV достаточно . Тем более под Windows. Для сборки из исходников требуются конкретные версии зависимостей (ffmpeg, h264 и пр.) Но есть уже готовые сборки для питонячьего пакетного менеджера . Я не пробовал, но кажется достаточно просто поставить conda на Windows:
- n
- Выбираете нужный вам инсталлятор тут: . Я предполагаю что это будет
Python 2.7 64-bit (exe installer)n - Дальше запускаете и следуете его инструкциям. n
- Далее как описано в в командной строке Windows
conda list .n - После этого вам потребуется поставить нужные пакеты. n
conda install numpynconda install -c danielballan pyavn# или conda install -c soft-matter pyavnnЯ не уверен, что это все заведется под Windows — я не пробовал. Если нет, то на официальном сайте есть инcтрукция как собрать самостоятельно:
n- n
- ; n
+еще есть вот такая заметка . n
Авторы библиотеки весьма отзывчивы, и им можно смело задавать вопросы и писать о проблемах тут: .
nАльтернативы
nИз альтернатив, еще наталкивался на
n- n
- — просто биндинг к
ffmpegиlibav; n - — тоже биндинг к
ffmpeg; n - — еще один биндинг, работает только на Windows; n
- — используют свой обработчик видео без
ffmpeg, выглядит он слишком заморочено; n - — используют свой обработчик видео, пока не осилил, но при беглом осмотре, выглядит удобным; n
- — обработка видео через OpenCV изначально похожа на забивание гвоздей микроскопом; n
- — библиотека для не линейного монтажа видео, но кодировать ей тоже можно. Отчасти тоже забивание гвоздей микроскопом. n
Про Python GStreamer:
n- n
- ; n
- ; n
- . n
Качество альтернатив
n- n
- Avpy у меня почему-то так и не завелся. n
- pyffmpeg тоже сходу не собирается, а перед началом установки приходится править код. n
- ffmpeg-cffi-py не смог найти путей до нужных библиотек. n
- Остальные пока не пробовал. n
Войдите чтобы оставить ответ