Использование рабочего стола в качестве поддельной веб-камеры на Linux

48

Я хочу создать прямую трансляцию (окна на) моего рабочего стола Linux с использованием бесплатного потокового сайта, используя захваченное видео в качестве поддельной веб-камеры. Есть много инструментов для этого на окнах. ffmpeg позволяет мне захватывать входные данные в определенном окне, но я не могу найти способ вывести видео на поддельное устройство в стиле веб-камеры, используемое вспышкой.

Кто-нибудь может порекомендовать метод (или программное обеспечение) для этого?

bkconrad
источник
Это было просто невероятно, пока вы не сказали «фальшивое устройство в стиле веб-камеры, используемое вспышкой».
Игнасио Васкес-Абрамс
Я не уверен, что ты имеешь в виду? Под устройством в стиле веб-камеры я подразумевал что-то вроде поддельного файла устройства / dev / videoN или что-то подобное. Я предполагаю, что именно так захваченное видео можно будет использовать по вспышке.
bkconrad
В точку. Это трудно.
Игнасио Васкес-Абрамс

Ответы:

51

Вы можете установить 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 - горизонтальное и вертикальное смещение соответственно.

Виктор Фернандес
источник
5
Ваше изображение может быть зеркальным, я имею в виду горизонтальное отражение в зависимости от вашей сборки ffmpeg . Использовать видеофильтр -vf hflip . Если вы уже используете один vf, поместите его в кавычки и разделяйте запятыми, например -vf 'hflip, scale = 640: 360'.
Марсело Тейшейра Руджери,
3
Я получаю несколько ошибок с этим [x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize, [v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumentиCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Лотос
1
Я получаю те же результаты, что и @Lotus с ffmpeg 3.1.4. Существуют ли какие-либо специальные кодеки или пакеты, требуемые помимо v4l2loopback и ffmpeg?
cguenther
1
@Lotus Мне удалось обойти проблему, когда я использую другое устройство / dev / video. Вы должны убедиться, что используете видеоустройство v4l2 (в моем случае это / dev / video1). Смещение может быть вызвано уже существующим реальным устройством веб-камеры, использующим / dev / video0.
cguenther
2
@Lotus Убедитесь, что команда modprobe (от имени root или с sudo) была выполнена перед запуском браузера Chrome. Проверьте, правильно ли загружен модуль с помощью <code> lsmod | grep v4l2loopback </ code>.
cguenther
7

Используйте 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 вы можете поставить -(что означает stdin). И перед mplayer ваша команда ffmpeg перенаправляет свой вывод на стандартный вывод. Так что-то вроде:

./yuv4mpeg_to_v4l2 < /tmp/pipe &
fmpeg -someOptions ... -o - | mplayer - -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe

Не проверял последний, потому что вы не сказали, как выглядит ваша команда ffmpeg.

Erik
источник
Пожалуйста, помогите: ./yuv4mpeg_to_v4l2 < /dev/video0 &приводит к ./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header. Как заменить /tmp/pipeна /dev/video0?
user123456
3

Какой дистрибутив вы используете? Я имел успех с 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

Майк Митчелл
источник
Ух ты, это очень интересно. Я пытаюсь транслировать в прямом эфире геймплей некоторых игр. Я уже знаю, как записать видеофайл из ffmpeg. Интересно, смогу ли я открыть этот же файл в vlc и каким-то образом транслировать его во время записи. Спасибо за информацию.
bkconrad
Сайт ws4gl.org кажется очень устаревшим, и все ссылки указывают на Wayback Machine. Я полагаю, что последняя версия доступна на sourceforge.net/projects/webcamstudio
Денилсон Са Майя
«WEBCAMSTUDIO НЕ ПОДДЕРЖИВАЕТСЯ»: /
Рафаэль
2

Во-первых, вероятно, visible.in делает то, что вы хотите, без каких-либо хлопот (я не связан): http://appear.in/

Во-вторых, вы можете транслировать на Twitch или другие сервисы, используя OBS, который недавно добавил поддержку linux (!): Https://obsproject.com/

OBS также решает гораздо более сложную проблему, связанную со звуком и звуком, подаваемым системой, во время захвата экрана в Ubuntu (ничего не решается в universeрепозитории, который я нашел до сих пор).

У меня нет никаких удивительных unix-y решений. Но те работали для меня в реальном мире.

bkconrad
источник
OBS Studio на Debian: tracker.debian.org/pkg/obs-studio
myrdd