Как "тройник" /dev/video в Linux?
Как можно "подать" на выход устройства /dev/videox, чтобы поток живого видео мог одновременно использоваться двумя программами?
Я хочу отправить живое видео из /dev/video1:input=1:norm=NTSC сразу в две программы (mplayer и mencoder), чтобы получить не замедленное живое представление в то же время, когда mencoder записывает.
Я знаю, как взять только что закодированный вывод из mencoder и воспроизвести его, но это приводит к задержке в несколько кадров (слишком много). Мне сказали, что VLC может сделать это, но также не без существенного отставания.
Лучшее, что я могу сейчас сделать - это заставить mplayer воспроизводить его на экране, и в то же время использовать "avconv -f x11grab", чтобы захватывать видео с дисплея и кодировать его. Это работает (это не добавляет задержки), но захват видео с дисплея идет медленно - у меня получается около 10 кадров в секунду вместо 30.
Должен быть какой-то простой способ "tee" /dev/video1 на два виртуальных устройства, чтобы и mplayer, и mencoder могли читать их одновременно (без того, чтобы одно из них жаловалось, что устройство "занято").
Что это за путь?
1 ответ
Не совсем то, что вы просите, но сделайте это в одной программе: GStreamer
( попробуйgst-launch
). Это делает для видеопотоков, что bash
делает для входных / выходных труб.
Плагин GStreamer camerabin2 может делать то, что вам нужно, без задержки: и воспроизводить поток, и записывать его. Хотя в настоящее время его можно использовать только из клиентского кода, а не из gst-launch
,
GStreamer имеет tee
Фильтруйте, если вам нужно сделать что-то более сложное, например, кодировать и отправлять видеопоток, скажем, по сетевому протоколу RTP.