Использование рабочего стола в качестве поддельной веб-камеры на 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.

  1. Загрузить,
  2. скомпилируйте это (make а также su -c 'make install'),
  3. загрузить модуль с su -c 'modprobe v4l2loopback',
  4. затем измените одну строку в файле examples/yuv4mpeg_to_v4l2.c исходной папки v4l2loopback из

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    в

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. и делать make в этой папке.

  6. Затем запустите его из 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):

  1. Установите OBS: https://obsproject.com/download
  2. Установите v4l2loopbackмодуль: https://github.com/umlaeute/v4l2loopback#run
  3. Запускаем модуль: v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1 (в котором video_nr означает номер устройства (в этом примере он станет /dev/video10)
  4. Установите obs-v4l2sink: (пакет deb)https://github.com/CatxFish/obs-v4l2sink/releases
  5. Установить libobs-dev (не уверен, нужно ли)
  6. Свяжите библиотеку с правильным каталогом:ln /usr/lib/obs-plugins/v4l2sink.so /usr/lib/x86_64-linux-gnu/obs-plugins/
  7. Затем следуйте: https://github.com/CatxFish/obs-v4l2sink/

ПРИМЕЧАНИЕ: не забудьте использовать указанное вами устройство, например: /dev/video10

Какой дистрибутив вы используете? Я имел успех с WebCamStudio под Arch в сочетании с веб-студией Livestream. Прошло немного времени с тех пор, как я его использовал.

http://www.ws4gl.org/

Что вы пытаетесь сделать именно? 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 пытается прочитать входные данные как можно быстрее. Эта опция замедлит чтение входных данных до собственной частоты кадров входных данных. Это полезно для вывода в реальном времени (например, для прямой трансляции).

Другие вопросы по тегам