Использование рабочего стола в качестве поддельной веб-камеры на Linux
Я хочу создать прямую трансляцию (окна на) моего рабочего стола Linux с использованием бесплатного потокового сайта, используя захваченное видео в качестве поддельной веб-камеры. Есть много инструментов для этого на окнах. ffmpeg позволяет мне захватывать входные данные в определенном окне, но я не могу найти способ вывести видео на поддельное устройство в стиле веб-камеры, используемое вспышкой.
Кто-нибудь может порекомендовать метод (или программное обеспечение) для этого?
4 ответа
Вы можете установить v4l2loopback. Это модуль ядра, который имитирует веб-камеру. Загрузите это с:
modprobe v4l2loopback
Затем вам нужно отправить видеопоток на устройство / dev / video0 с помощью программы типа ffmpeg. Чтобы захватить рабочий стол и переслать его в / dev / video0 с помощью ffmpeg, вы можете использовать следующую командную строку:
ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0
Измените значение -r с 15 на другое, если вы хотите другую частоту кадров. Разрешение выбирается в параметре -s. Если вы хотите указать смещение от верхнего левого угла экрана, передайте его в параметре -i в форме "-i:0.0+x,y", где x и y - горизонтальное и вертикальное смещение соответственно.
Используйте v4l2loopback с mplayer.
- Загрузить,
- скомпилируйте это (
make
а такжеsu -c 'make install'
), - загрузить модуль с
su -c 'modprobe v4l2loopback'
, затем измените одну строку в файле
examples/yuv4mpeg_to_v4l2.c
исходной папки v4l2loopback изv.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
в
v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
и делать
make
в этой папке.Затем запустите его из
examples
каталог, как это:mkfifo /tmp/pipe # only needed once, as long as you do not delete the file /tmp/pipe ./yuv4mpeg_to_v4l2 < /tmp/pipe & mplayer movie.mp4 -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
где вы замените
movie.mp4
с названием вашего видео файла. И заменить/dev/video0
с вашим устройством обратной связи.
MPlayer может воспроизводить любые веб-потоки, любые видеофайлы, даже со стандартного ввода! Я только что проверил это с файлом из http://www.tagesschau.de/ который является немецким новостным сайтом.
TS=$(wget "http://www.tagesschau.de/multimedia/video/" -q -O - | grep --regexp='http.*\.webm"' | sed -e 's%.*href="%%' -e 's%\.webm".*%\.webm%')
./yuv4mpeg_to_v4l2 < /tmp/pipe &
mplayer $TS -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
Вместо $TS вы можете поставить -
(что означает стандартный ввод). И перед mplayer ваша команда ffmpeg перенаправляет свой вывод на стандартный вывод. Так что-то вроде:
./yuv4mpeg_to_v4l2 < /tmp/pipe &
fmpeg -someOptions ... -o - | mplayer - -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
Не проверял последний, потому что вы не сказали, как выглядит ваша команда ffmpeg.
Без использования ffmpeg у меня сработало вот что (Ubuntu 20.04):
- Установите OBS: https://obsproject.com/download
- Установите
v4l2loopback
модуль: https://github.com/umlaeute/v4l2loopback#run - Запускаем модуль:
v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
(в которомvideo_nr
означает номер устройства (в этом примере он станет /dev/video10) - Установите obs-v4l2sink: (пакет deb)https://github.com/CatxFish/obs-v4l2sink/releases
- Установить
libobs-dev
(не уверен, нужно ли) - Свяжите библиотеку с правильным каталогом:
ln /usr/lib/obs-plugins/v4l2sink.so /usr/lib/x86_64-linux-gnu/obs-plugins/
- Затем следуйте: https://github.com/CatxFish/obs-v4l2sink/
ПРИМЕЧАНИЕ: не забудьте использовать указанное вами устройство, например:
/dev/video10
Какой дистрибутив вы используете? Я имел успех с WebCamStudio под Arch в сочетании с веб-студией Livestream. Прошло немного времени с тех пор, как я его использовал.
Что вы пытаетесь сделать именно? ffmpeg, скомпилированный с x11grab, может записывать рабочий стол. У меня был ограниченный успех, доведя это до Ustream, но опять же прошло много времени, и я думаю, что то, что я делал, больше не работает.
Если вы просто хотите потоковую передачу файла, а не рабочего стола (я думаю, когда вы говорите "Окно", вы имеете в виду "VLC"), я могу указать вам правильное направление для работы с Livestream (возможно, Ustream). Я неуклюже выясняю, как это сделать с помощью экспериментов. Это не фантастика, но работает с Livestream.
Justin.tv также имеет скрипты, которые могут транслироваться из VLC в их сервис.
http://apiwiki.justin.tv/mediawiki/index.php/Linux_Broadcasting_API
Во-первых, вероятно, visible.in делает то, что вы хотите, без каких-либо хлопот (я не связан): http://appear.in/
Во-вторых, вы можете транслировать на Twitch или другие сервисы, используя OBS, который недавно добавил поддержку linux (!): https://obsproject.com/
OBS также решает гораздо более сложную проблему, связанную со звуком и звуком, подаваемым системой, во время захвата экрана в Ubuntu (ничего не решается в universe
репо, которое я нашел до сих пор).
У меня нет никаких удивительных unix-y решений. Но те работали для меня в реальном мире.
Другой способ смоделировать живую камеру в реальном мире - использовать
udp://
. Например:
# (make sure you use the correct screen number, in my case it was :1, not :0)
ffmpeg -re -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -map 0:v -c:v libx264 -f mpegts udp://localhost:50000
Видео получили:
ffmpeg -i udp://localhost:50000 -f mpegts video.ts
Кроме того, если ваша цель - просто имитировать живую камеру (например, для тестирования конвейера компьютерного зрения), вы можете использовать собственную частоту кадров.
-re
вариант, зацикливание
-stream_loop -1
вариант и статический файл:
VIDE0=./static-video.mp4
ffmpeg -re -stream_loop -1 -i $VIDEO -map 0:v -f mpegts udp://localhost:50000
Официальная информация о ffmpeg на
-re
вариант:
-re (ввод) Читать ввод с исходной частотой кадров. В основном используется для имитации устройства захвата или потока ввода в реальном времени (например, при чтении из файла). Не следует использовать с фактическими устройствами захвата или потоками ввода в реальном времени (где это может привести к потере пакетов). По умолчанию ffmpeg пытается прочитать входные данные как можно быстрее. Эта опция замедлит чтение входных данных до собственной частоты кадров входных данных. Это полезно для вывода в реальном времени (например, для прямой трансляции).