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

46785
bkconrad

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

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

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

4 ответа на вопрос

43
Víctor Fernández

You can install v4l2loopback. It is a kernel module that simulates a webcam. Load it with:

modprobe v4l2loopback 

Then you need to send the video stream to the device /dev/video0 using a program like ffmpeg. In order to capture the desktop and forward it to /dev/video0 with ffmpeg, you can use the following command line:

ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0 

Change the value of -r from 15 to something else if you want a different frame rate. The resolution is chosen in the -s parameter. If you want to specify an offset from the upper-left corner of the screen, pass it in the -i parameter in the form "-i :0.0+x,y", where x and y are the horizontal and vertical offset respectively.

Ваше изображение может быть зеркальным, я имею в виду ** горизонтальное отражение ** в зависимости от вашего ffmpeg ** build **. Использовать видеофильтр ** - vf hflip **. Если вы уже используете один vf, поместите их в кавычки и разделяйте запятыми, например -vf 'hflip, scale = 640: 360'. Marcelo Teixeira Ruggeri 8 лет назад 5
Хотя использование памяти и процессора кажется очень маленьким, этот метод переводит мой компьютер в режим слагов. Есть идеи почему? nicooga 8 лет назад 0
Я получаю несколько ошибок с этим `[x11grab @ 0x24013c0] Stream # 0: недостаточно кадров для оценки скорости; рассмотрите возможность увеличения probesize`, `[v4l2 @ 0x2409520] ioctl (VIDIOC_G_FMT): неверный аргумент` и` не удалось записать заголовок для выходного файла # 0 (неверные параметры кодека?): неверный аргумент ` Lotus 7 лет назад 2
Я получаю те же результаты, что и @Lotus с ffmpeg 3.1.4. Существуют ли какие-либо специальные кодеки или пакеты, требуемые помимо v4l2loopback и ffmpeg? cguenther 7 лет назад 0
@Lotus Мне удалось обойти проблему, когда я использую другое устройство / dev / video. Вы должны убедиться, что используете видеоустройство v4l2 (в моем случае это / dev / video1). Смещение может быть вызвано уже существующим реальным устройством веб-камеры, использующим / dev / video0. cguenther 7 лет назад 1
@cguenther Так что теперь это начинается, и у меня нет ошибки. Спасибо! Однако он не дает мне устройства, которое я могу выбрать в Google Chrome, и не выдает выходной файл. Lotus 7 лет назад 0
@Lotus Перед запуском браузера Chrome убедитесь, что команда modprobe (с правами root или sudo) была выполнена. Проверьте, правильно ли загружен модуль lsmod | grep v4l2loopback. cguenther 7 лет назад 1
Еще один полезный совет: если вы застряли с приложением, которое не позволяет менять источники видео, просто `sudo mv / dev / video0 / dev / video10 && sudo mv / dev / video1 / dev / video0` где` / dev / video1` - это ваша петля v412. Jonny Asmar 6 лет назад 0
6
erik

Используйте 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.

Помогите: `./yuv4mpeg_to_v4l2 </ dev / video0 &` приводит к `./yuv4mpeg_to_v4l2 :: пропущенный заголовок YUV4MPEG2`. Как заменить `/ tmp / pipe` на` / dev / video0`? user123456 7 лет назад 0
3
Mike Mitchell

Какой дистрибутив вы используете? Я имел успех с 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 12 лет назад 0
Сайт http://www.ws4gl.org/ кажется очень устаревшим, и все ссылки указывают на Wayback Machine. Я полагаю, последняя версия доступна по адресу https://sourceforge.net/projects/webcamstudio/ Denilson Sá Maia 8 лет назад 0
"WEBCAMSTUDIO НЕ ПОДДЕРЖИВАЕТСЯ": / Raphael 7 лет назад 0
2
bkconrad

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

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

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

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

Похожие вопросы