Linux stream web camera

LINUX — Жизнь в консоли ЕСТЬ.

Главное меню

Последние статьи

Счетчики

FFServer: Трансляция видео с веб-камеры со звуком через браузер.

ffmpeg — набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровые аудио- и видеозаписи в различных форматах. В состав этого пакета входит ffserver — http потоковый сервер для видео и радиовещания.

Принцип трансляции такой: ffmpeg захватывает поток с камеры и отправляет его ffserver-у, ffserver конвертит его превращая в swf, который можно просмотреть в браузере, введя адрес компьютера, на котором ffserver запущен. Использовалась простая usb-камера logitech c170.

apt-get install ffmpeg

Замечание: Я ставил на ubuntu, если у вас debian то нужно ставить из исходников для поддержки H.264 (один из стандартов сжатия видео), из репозитория debian не прокатит.

Конфиг находится в /etc/ffserver.conf

# Порт, на котором будет работать ffserver
Port 4444
# Адрес, на котором будет работать ffserver.
# Если указать 0.0.0.0 то будут использованы все доступные адреса
BindAddress 0.0.0.0
# Максимальное количество обслуживаемых соединений
MaxHTTPConnections 10
# Максимальное количество клиентов
MaxClients 10
# Максимальная используемая полоса (в килобитах)
MaxBandwidth 5000
# Файл журнала. Формат подобен формату лога apache
CustomLog /var/log/ffserver-access.log
# Описываем источник

# Временный файл для хранения промежуточных данных
File /tmp/webcam.ffm
# Максимальный размер файла с промежуточными данными
FileMaxSize 1M
# Команда запуска ffmpeg для захвата видео с камеры и отправки ffserver-у.
# Адрес для отправки данных (localhost) автоматически будет добавлен в конец этой строки.
# (подробнее см. ниже).
Launch ffmpeg -s 640×480 -f video4linux2 -i /dev/video0 -f alsa -i hw:1
# С каких адресов может обращаться источник. Если закоментировано — с любых.
# ACL allow 127.0.0.1

# Описываем поток. SWF-файл с FLV-потоком внутри.

# Источник потока
Feed webcam.ffm
# Используемый формат
Format swf
# Используемый кодек
VideoCodec flv
# Частота кадров
VideoFrameRate 4
# Размер буфера
# VideoBufferSize 100
# Битрейт
# VideoBitRate 200
# Минимальное и максимальное качество (1-лучшее, 31-худшее)
VideoQMin 1
VideoQMax 8
# Размер видео. Дожно совпадать с размером видео на источнике
VideoSize 640×480
# Время ожидания перед началом отправки данных клиенту (в секундах)
PreRoll 0
# Если не нужно транслировать звук
# NoAudio

# При обращении к индексной странице ffserver будем отображать текущий статус сервера

Format status

Некоторые параметры у меня закоментированы, оставил для возможности поэкспериментировать читающим эту статью.

Теперь подробнее о строке:

Launch ffmpeg -s 640×480 -f video4linux2 -i /dev/video0 -f alsa -i hw:1

-s 640×480 — разрешение камеры
-f video4linux2 — интерфейс захвата видео в линукс. Еще можно попробовать video4linux если не прокатит video4linux2.
-i /dev/video0 — путь к камере
-f alsa интерфейс для захвата аудио
-i hw:1 — микрофон. Номер можно посмотреть командой:

arecord -l

ffserver

ffserver -d

для вывода информации в процессе отладки.

Заходим через браузер, например если с того же компьютера: http://127.0.0.1:4444/ , попадаем на информационную страницу ffserver-а, где есть ссылка на просмотр видео.

Желательно использование мощного процессора, ffserver занимает одно ядро полностью, на intel atom задержка показа видео составляла около 2-ух секунд, на dual core около секунды.

Читайте также:  Dism windows 10 язык

Источник

Потоковое видео средствами ffserver & ffmpeg

Для организации трансляции нам потребуется:

Теория

FFmpeg — это набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровое аудио и видео в различных форматах. Он включает libavcodec, библиотеку кодирования и декодирования аудио и видео и libavformat, библиотеку мультиплексирования и демультиплексирования в медиаконтейнер. Название происходит от названия экспертной группы MPEG и «FF», означающего «fast forward».

ffserver идёт в комплекте с ffmpeg и выполняет роль медиа-сервера — получает видеопоток от ffmpeg, который может быть запущен на другой машине, и раздаёт его счастливым пользователям.
Каждый получаемый поток называется Feed’ом (далее будет просто фид). Таких потоков может быть несколько, так же как и отдаваемых (выходных).
FFmpeg у нас будет захватывать видео с веб-камеры или читать из файла.

Практика

  1. Port 8090
  2. BindAddress 0.0.0.0
  3. MaxClients 100
  4. MaxBandwidth 20000
  5. NoDaemon
  6. # Фид, надо запомнить feed.ffm, он нам потребуется при запуске ffmpeg
  7. File /tmp/feed.ffm
  8. FileMaxSize 3M
  9. # Ранее объявленный фид
  10. Feed feed.ffm
  11. Format flv
  12. VideoCodec flv
  13. VideoFrameRate 30
  14. VideoBufferSize 80000
  15. VideoBitRate 200
  16. # Качество видео от 1 до 31, 1 == отлично 31 == фи!
  17. VideoQMin 1
  18. VideoQMax 5
  19. # Разрешение, везде должно быть одинаково!
  20. VideoSize 352×288
  21. PreRoll 1
  22. # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
  23. Noaudio
  24. # Флешка test.swf для просмотра трансляции
  25. Feed feed.ffm
  26. # Будет запускаться в Adobe Flash Player
  27. Format swf
  28. VideoCodec flv
  29. VideoFrameRate 30
  30. VideoBufferSize 50000
  31. VideoBitRate 100
  32. VideoQMin 1
  33. VideoQMax 5
  34. # Разрешение, везде должно быть одинаково!
  35. VideoSize 352×288
  36. PreRoll 0
  37. # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
  38. Noaudio

Пускаем ffserver:
$ ffserver

Пускаем ffmpeg:
$ ffmpeg -s 352×288 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm
-s разрешение, указанное в конфиге ffserver, -r количество кадров/секунду, -f формат, -i путь к камере (или к видео-файлу), http://localhost:PORT/FEED это адрес, где ffserver будет ждать наш поток

PS: если выдаст ошибку, то можно попробовать формат v4l (-f video4linux)

Открываем в браузере http://localhost:8090/test.swf и широко улыбаемся:)

Для отправки видео поменяем параметр -i на путь к файлу, уберём -f (ffmpeg сам определит формат файла):
$ ffmpeg -s 352×288 -r 30 -i

Источник

Трансляция с USB камеры в сеть

Есть linux устройство к которому подключена USB UVC камера. Надо организовать вещание с нее в сеть. Подошел бы mjpg streamer, но нет возможности его установить.
Есть gstreamer1.0, ffmpeg (без сервера) и v4l2-ctl
Пока только смог выжать
v4l2-ctl —stream-mmap=4 —stream-from-host=http://localhost:8080
Светодиод на камере загорается. В терминале видно что идет снятие картинки

VLC как плагин только для приема с сервера.

Нет, для трансляции видео в сеть.

VLC только как плеер может брать видео с расшаренных папок в домашней сети и проигрывать.

А в чём проблема использовать ffserver? У ffmpeg есть же static-build если нельзя поставить пакетом: https://www.ffmpeg.org/download.html

Запускаешь программу и выбираешь опцию меню «Медиа» → «Передавать…».

Переходим на вкладку «Устройство захвата». В списке «Название видеоустройства» выбираешь подключённую веб-камеру. В списке «Название аудиоустройства» выбираешь микрофон.

Читайте также:  Windows xpe usb wim iso образ для загрузки с usb накопителя

В разделе «Параметры» нажимаешь кнопку «Другие», в открывшимся диалоге ставишь галочку «Настройки устройства» и нажимаешь «ОК».

Нажимаешь кнопку «Поток». Откроется мастер настройки вещания. На первом шаге просто жмёшь «Next >».

На втором шаге в выпадающем списке «Новое назначение» выбираешь «HTTP» и нажимаешь на кнопку «Добавить».

Откроется диалог для настройки порта и URI, оставляешь всё по умолчанию.

Есть linux устройство
—stream-from-host=http://localhost:8080
но не через браузер ни через VLC картинку получить не могу

Дай угадаю: браузер и vlc на другом устройстве?

Разумеется. Иначе зачем бы мне было вещать в сеть.
Я же привел аналогию с mjpg streamer
надо организовать именно то что делает mjpg streamer, но только с помощью gstreamer1.0, ffmpeg (без сервера) и v4l2-ctl

Ну пока знаний достаточно только для установки готовых пакетов. И сервера ffmpeg среди них нет.

Там ОЧЕНЬ сильно кастрированный VLC

Разумеется. Иначе зачем бы мне было вещать в сеть.

Так и вещай в сеть, а не на localhost.
ЗЫ ржунимагу
Почитай для начала

да и гуглится довольно много — gstreamer streaming server

Ну пока знаний достаточно только для установки готовых пакетов

А что за железяка такая?

Ну так я же использовал параметр from
-stream-from-host=

Спутниковый ресивер Dreambox

Ты сейчас так беспонтово тролишь или тупишь?!

Хе-хе.. А ffserver совсем грохнули:

Warning: ffserver has been removed on 2018-01-06. If you still need it checkout commit 2ca65fc or use the 3.4 release branch. Or try an alternative such as ​mkvserver_mk2.

да, например, в репах армбиан нет mjpg_streamer, но вообще, он же собирается достаточно просто.

Input/Output options: -I, —get-input query the video input [VIDIOC_G_INPUT] -i, —set-input= set the video input to [VIDIOC_S_INPUT] -N, —list-outputs display video outputs [VIDIOC_ENUMOUTPUT] -n, —list-inputs display video inputs [VIDIOC_ENUMINPUT] -O, —get-output query the video output [VIDIOC_G_OUTPUT] -o, —set-output= set the video output to [VIDIOC_S_OUTPUT] —set-audio-output= set the audio output to [VIDIOC_S_AUDOUT] —get-audio-input query the audio input [VIDIOC_G_AUDIO] —set-audio-input= set the audio input to [VIDIOC_S_AUDIO] —get-audio-output query the audio output [VIDIOC_G_AUDOUT] —set-audio-output= set the audio output to [VIDIOC_S_AUDOUT] —list-audio-outputs display audio outputs [VIDIOC_ENUMAUDOUT] —list-audio-inputs display audio inputs [VIDIOC_ENUMAUDIO]

Video Output Formats options: —list-formats-out display supported video output formats [VIDIOC_ENUM_FMT] —list-fields-out list supported fields for the current output format —get-fmt-video-out query the video output format [VIDIOC_G_FMT] —set-fmt-video-out —try-fmt-video-out=width= ,height= ,pixelformat=

,field= ,colorspace= , xfer= ,ycbcr= ,quantization= ,premul-alpha,bytesperline= set/try the video output format [VIDIOC_S/TRY_FMT] pixelformat is either the format index as reported by —list-formats-out, or the fourcc value as a string. premul-alpha sets V4L2_PIX_FMT_FLAG_PREMUL_ALPHA. The bytesperline option can be used multiple times, once for each plane. can be one of the following field layouts: any, none, top, bottom, interlaced, seq_tb, seq_bt, alternate, interlaced_tb, interlaced_bt can be one of the following colorspaces: smpte170m, smpte240m, rec709, 470m, 470bg, jpeg, srgb, adobergb, bt2020, dcip3 can be one of the following transfer functions: default, 709, srgb, adobergb, smpte240m, smpte2084, dcip3, none can be one of the following Y’CbCr encodings: default, 601, 709, xv601, xv709, bt2020, bt2020c, smpte240m can be one of the following quantization methods: default, full-range, lim-range

Читайте также:  Нужен windows файл подкачки или нет

Video Streaming options: —stream-count= stream buffers. The default is to keep streaming forever. This count does not include the number of initial skipped buffers as is passed by —stream-skip. —stream-skip= skip the first buffers. The default is 0. —stream-sleep= sleep for 1 second every buffers. If is 0, then sleep forever right after streaming starts. The default is -1 (never sleep). —stream-to= stream to this file. The default is to discard the data. If is ‘-‘, then the data is written to stdout and the —silent option is turned on automatically. —stream-to-host= stream to this host. The default port is 8362. —stream-poll use non-blocking mode and select() to stream. —stream-mmap= capture video using mmap() [VIDIOC_(D)QBUF] count: the number of buffers to allocate. The default is 3. —stream-user= capture video using user pointers [VIDIOC_(D)QBUF] count: the number of buffers to allocate. The default is 3. —stream-dmabuf capture video using dmabuf [VIDIOC_(D)QBUF] Requires a corresponding —stream-out-mmap option. —stream-from= stream from this file. The default is to generate a pattern. If is ‘-‘, then the data is read from stdin. —stream-from-host= stream from this host. The default port is 8362. —stream-loop loop when the end of the file we are streaming from is reached. The default is to stop. —stream-out-pattern= choose output test pattern. The default is 0. —stream-out-square show a square in the middle of the output test pattern. —stream-out-border show a border around the pillar/letterboxed video. —stream-out-sav insert an SAV code in every line. —stream-out-eav insert an EAV code in every line. —stream-out-pixel-aspect= can be one of: square, ntsc, pal —stream-out-video-aspect= can be one of: 4×3, 14×9, 16×9, anamorphic —stream-out-alpha= value to use for the alpha component, range 0-255. The default is 0. —stream-out-alpha-red-only only use the —stream-out-alpha value for the red colors, for all others use 0. —stream-out-rgb-lim-range Encode RGB values as limited 106 instead of full range. —stream-out-hor-speed= choose speed for horizontal movement. The default is 0, and the range is [-3. 3]. —stream-out-vert-speed= choose speed for vertical movement. The default is 0, and the range is [-3. 3]. —stream-out-perc-fill=

percentage of the frame to actually fill. The default is 100%. —stream-out-mmap= output video using mmap() [VIDIOC_(D)QBUF] count: the number of buffers to allocate. The default is 4. —stream-out-user= output video using user pointers [VIDIOC_(D)QBUF] count: the number of buffers to allocate. The default is 4. —stream-out-dmabuf output video using dmabuf [VIDIOC_(D)QBUF] Requires a corresponding —stream-mmap option. —list-patterns list available patterns for use with —stream-pattern. —list-buffers list all video buffers [VIDIOC_QUERYBUF] —list-buffers-out list all video output buffers [VIDIOC_QUERYBUF] —list-buffers-vbi list all VBI buffers [VIDIOC_QUERYBUF] —list-buffers-vbi-out list all VBI output buffers [VIDIOC_QUERYBUF] —list-buffers-sliced-vbi list all sliced VBI buffers [VIDIOC_QUERYBUF] —list-buffers-sliced-vbi-out list all sliced VBI output buffers [VIDIOC_QUERYBUF] —list-buffers-sdr list all SDR RX buffers [VIDIOC_QUERYBUF] —list-buffers-sdr-out list all SDR TX buffers [VIDIOC_QUERYBUF]

Что мне надо использовать что бы вещать в сеть?

Источник

Оцените статью