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 около секунды.
Источник
Потоковое видео средствами ffserver & ffmpeg
Для организации трансляции нам потребуется:
Теория
FFmpeg — это набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровое аудио и видео в различных форматах. Он включает libavcodec, библиотеку кодирования и декодирования аудио и видео и libavformat, библиотеку мультиплексирования и демультиплексирования в медиаконтейнер. Название происходит от названия экспертной группы MPEG и «FF», означающего «fast forward».
ffserver идёт в комплекте с ffmpeg и выполняет роль медиа-сервера — получает видеопоток от ffmpeg, который может быть запущен на другой машине, и раздаёт его счастливым пользователям.
Каждый получаемый поток называется Feed’ом (далее будет просто фид). Таких потоков может быть несколько, так же как и отдаваемых (выходных).
FFmpeg у нас будет захватывать видео с веб-камеры или читать из файла.
Практика
- Port 8090
- BindAddress 0.0.0.0
- MaxClients 100
- MaxBandwidth 20000
- NoDaemon
- # Фид, надо запомнить feed.ffm, он нам потребуется при запуске ffmpeg
- File /tmp/feed.ffm
- FileMaxSize 3M
- # Ранее объявленный фид
- Feed feed.ffm
- Format flv
- VideoCodec flv
- VideoFrameRate 30
- VideoBufferSize 80000
- VideoBitRate 200
- # Качество видео от 1 до 31, 1 == отлично 31 == фи!
- VideoQMin 1
- VideoQMax 5
- # Разрешение, везде должно быть одинаково!
- VideoSize 352×288
- PreRoll 1
- # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
- Noaudio
- # Флешка test.swf для просмотра трансляции
- Feed feed.ffm
- # Будет запускаться в Adobe Flash Player
- Format swf
- VideoCodec flv
- VideoFrameRate 30
- VideoBufferSize 50000
- VideoBitRate 100
- VideoQMin 1
- VideoQMax 5
- # Разрешение, везде должно быть одинаково!
- VideoSize 352×288
- PreRoll 0
- # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
- 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
Запускаешь программу и выбираешь опцию меню «Медиа» → «Передавать…».
Переходим на вкладку «Устройство захвата». В списке «Название видеоустройства» выбираешь подключённую веб-камеру. В списке «Название аудиоустройства» выбираешь микрофон.
В разделе «Параметры» нажимаешь кнопку «Другие», в открывшимся диалоге ставишь галочку «Настройки устройства» и нажимаешь «ОК».
Нажимаешь кнопку «Поток». Откроется мастер настройки вещания. На первом шаге просто жмёшь «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
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]
Что мне надо использовать что бы вещать в сеть?
Источник