Могу ли я использовать Gstreamer API для объединения двух видео? - PullRequest
6 голосов
/ 21 июля 2009

Я хотел бы написать простое CLI-приложение для Linux, которое может брать 2 видеоисточника (1 из выступающего докладчика, 1 с слайдами и без звука) и объединять их.

Я бы хотел, чтобы все выходное видео было двумя оригинальными, рядом. Если это не удастся, моим вторым лучшим вариантом будет видео в стиле «картинка в картинке» с выступающим в небольшом кадре в углу.

Из нескольких часов исследований GStreamer выглядит так: может быть в состоянии сделать это. Кто-нибудь может подтвердить это, прежде чем я потрачу больше времени на его пробование?

Если это невозможно, есть ли другие API, которые я мог бы использовать?

Ответы [ 4 ]

12 голосов
/ 01 ноября 2010

Вот простая (рабочая) установка с использованием gst-launch (установите пакет gstreamer-tools в Ubuntu / Debian):

gst-launch v4l2src device = / dev / video1! видеомасштаб ffmpegcolorspace! video / x-raw-yuv, ширина = 640, высота = 480! Видеобокс border-alpha = 0 осталось = -640! название видеомиксера = микс! ffmpegcolorspace! xvimagesink v4l2src! видеомасштаб ffmpegcolorspace! video / x-raw-yuv, ширина = 640, высота = 480! Видеобокс справа = -640! перемешайте.

Это в основном читает два видео с использованием видео 4 linux 2, одно с устройства по умолчанию, а другое с / dev / video1. Возможно, вы захотите изменить это, если ваши настройки отличаются.

Первая часть (не выделена жирным шрифтом) отвечает за чтение видео с устройства захвата, согласование размера и цветового пространства (videoscale! Ffmpegcolorspace), форсирование определенного формата видео (video / x-raw-yuv, width = 640). , высота = 480), добавление 640 прозрачных пикселей слева (тем самым перемещая изображение вправо) и создание видеомиксера с названием «mix». Наконец, он снова автоматически согласовывает цветовое пространство и отображает результат в окне XVideo.

Вторая часть (жирным шрифтом) читает второй видеопоток (с устройства захвата по умолчанию добавьте device = / dev / videoX , чтобы выбрать другое устройство), затем выполните то же цветовое пространство, согласование размера и выбор формата видео, как для первого потока, затем перемещает видео на 640 пикселей влево и передает результат в элемент с именем mix (наш видеомикшер). Точка в конце обязательна и указывает gstreamer искать существующий элемент с именем «mix» вместо поиска фильтра.

Вы можете заменить v4l2src device = / dev / video1 на filesrc location = video.avi! decodebin для получения входных данных из видеофайла.

Замените xvimagesink на jpegenc! avimux! fileink location = out.avi , чтобы записать результат в видеофайл.

5 голосов
/ 29 июля 2009

Оказывается, gstreamer может объединять два видео, помещая их рядом в выходное видео, используя фильтр видеомиксера.

Базовый конвейер, который принимает два входных файла, масштабирует их до одинакового размера, затем объединяет их и кодирует их в видео theora, может выглядеть так:

filesrc -> decodebin -> ffmpegcolourspace -> videoscale ->  videobox -> videorate
                                                                                  \
filesrc -> decodebin ->  ffmpegcolourspace  ->  videoscale  ->  videorate   ->    videomixer -> ffmpegcolourspace -> theoraenc -> oggmux -> filesink

Способ реализации этого конвейера зависит от языка. Я создал прототип с привязками Ruby, и он работает очень хорошо.

0 голосов
/ 21 июля 2009

MEncoder может делать это в Linux. Вы можете разветвить их код или вызвать двоичный файл.

0 голосов
/ 21 июля 2009

AviSynth приходит мне в голову. Я использовал его много лет назад под Windows, и он довольно хорош в произвольной постобработке. AviSynth v3 должен работать под Linux, но все еще далеко не готов. Хотя есть инструменты для запуска предыдущей версии с Wine.

...