- LINUX — Жизнь в консоли ЕСТЬ.
- Главное меню
- Последние статьи
- Счетчики
- FFServer: Трансляция видео с веб-камеры со звуком через браузер.
- Работа с usb видеокамерой в Linux. Часть 1
- Захват видео с USB камер на устройствах под управлением Linux
- Предыстория
- Ограничения
- HW и SW
- Предварительный анализ
- В поисках новых приключений
- Uvc2http
- Неожиданная проблема
- Другие проблемы и нюансы использования
- Результаты
- Использование
- Что дальше
- Set up a Webcam with Linux
- Namespaces
- Page actions
- Contents
- Try it
- Install cheese
- Check the Setup
- Troubleshooting
- SUSE Linux 11.0 and earlier
- Ubuntu
- Other webcams
- Use it
- record video
- video conferencing
- watch it
- Testbed
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 около секунды.
Источник
Работа с usb видеокамерой в Linux. Часть 1
По популярности видеокамера, сегодня, стоит в одном ряду с микрофоном и наушниками. Она используется в различных направлениях, таких как распознавание объектов, дополненная реальность, видеоконференции и множество других. Но что же скрыто под капотом этих сложнейших программ? Как мы получаем картинку с видеокамеры? Этот цикл статей позволит взглянуть на простоту работы с видеокамерой на низком уровне, обработку полученного изображения.
Для начала, немного информации о работе с устройствами в системе Linux. Устройства в nix системах представляют собой файл. С некоторыми файлами-устройств мы можем работать как с обычными файлами. Например:
эта команда выведет на экран весь диск sda.
Есть устройства с которыми нельзя работать напрямую, к ним относится видеокамера.При попытке это сделать мы получим такую реакцию системы:
*Где /dev/video0 это файл-устройство найшей видеокамеры.
Для работы с ней нам понадобится системная функция ioctl детальнее о ней можно ознакомится [1]. Попробуем это применить. Вот код позволяющий считать информации с устройства (альтернатива команде cat для видеоустройств):
В первых строках кода считываются параметры с которой запущено приложение. Если параметров нету то device_name принимает стандартоне значение «/dev/video0».
В блоке «Open Device» происходит открытие устройства системной функцией open (нужно подключить header fcntl.h). Обязательный параметр O_RDWR отвечает за открытие устройства считывания/записи. Если при подключении возникла ошибка, то функция open вернет -1.
Блок «Read Params From Device» — это сердце нашей маленькой программы. Для его использования надо подключить билиотеку возможно прийдется её установить, у каждого дистрибутива свой пакет под эту библиотеку
Системная функция ioctl имеет три параметра:
file_device — дескриптор нашего устройства
VIDIOC_QUERYCAP — функция ядра, которую применяем для нашего устройства.
device_params — область памяти куда будет сброшен результат функции «VIDIOC_QUERYCAP».
device_params это структура состоящая из таких полей:
если возникла ошибка ioctl вернет -1
Блок «Close Device» закрывает дескриптор устройства.
Посмотрим программу в действии.
устройство не определилось ядром либо не подключено уборщица опять ненужные провода дергала.
Подключаем и заново запуск. Получаем такую информацию:
поле capabilities и device capabilities можно расшифровать благодаря константам из файла videodev2.h:
На этом вводная статья заканчивается. В следующих обзорах будут затронуты, такие темы как memory-mapping, виодеформаты изображения, настройка камеры, вывод изображения в текстуру, работа с несколькими камерами.
Источник
Захват видео с USB камер на устройствах под управлением Linux
Предыстория
- Видео в разрешении FullHD (1920Х1080) или HD (1280х720) и нормальная частота кадров (чтобы можно было играть).
- Игрушку я планировал отдать детям, поэтому нужен был автостарт и поддержка подключения/отключения камеры.
В общем хотелось что-то вроде этого:
Ограничения
Я не собирался искать решение, которое работает всегда и везде. Следующие ограничения меня вполне устраивали:
- Хороший WiFi сигнал.
- Ограниченное число подключений, приоритет отдавался случаю, когда есть всего один клиент.
- Камера поддерживает режим MJPG.
HW и SW
Предварительный анализ
Код UVC драйвера оказался готов к добавлению различного рода “специальных” решений, и я легко нашел место, где надо скорректировать размер буфера (функция uvc_fixup_video_ctrl()). Более того, драйвер поддерживает набор quirks, которые позволяют поддерживать камеры с разного рода отклонениями от стандарта UVC. В общем, разработчики драйвера сделали лучшее, что возможно для поддержки зоопарка камер.
Добавив коррекцию размера буфера, я получил стабильную работу в режиме 1280х720 и даже в режиме 1920х1080. Ура! Половина задачи решена!
В поисках новых приключений
Немного порадовавшись первой удаче, я вспомнил, что mjpg-streamer далек от совершенства. Наверняка можно сделать что-то простое, не такое универсальное как mjpg-streamer, но более подходящее для моих условий. Так я решил сделать uvc2http.
В mjpg-streamer мне не понравилось использование нескольких потоков и копирование буферов. Это определило архитектуру решения: 1 поток и никакого копирования. Используя non-blocking IO, это делается достаточно просто: захватываем кадр и без копирования отсылаем его клиенту. Есть небольшая проблема: пока мы отсылаем данные из буфера, мы не можем вернуть буфер обратно в очередь. А пока буфер не в очереди, драйвер не может положить в него новый кадр. Но если размер очереди > 1, то это становится возможным. Число буферов определяет максимальное количество подключений, которое можно гарантированно обслуживать. Т.е., если я хочу гарантированно поддерживать 1 клиента, то 3-х буферов достаточно (в один буфер пишет драйвер, из второго отсылаем данные, третий в запасе, чтобы избежать конкуренции с драйвером за буфер при попытке получить новый кадр).
Uvc2http
Uvc2http состоит из двух компонентов: UvcGrabber и HttpStreamer. Первый отвечает за получение буферов (кадров) из очереди и возврат их обратно в очередь. Второй отвечает за обслуживание клиентов по HTTP. Есть еще немного кода, который связывает эти компоненты. Подробности можно посмотреть в исходниках.
Неожиданная проблема
Все было замечательно: приложение работало и в разрешении 1280х720 выдавало 20+ кадров/сек. Я делал косметические изменения в коде. После очередной порции изменений я замерил частоту кадров. Результат был удручающий — меньше 15 кадров. Я бросился искать, что же привело к деградации. Я потратил, наверное, 2 часа в течение которых частота уменьшалась с каждым замером до значения 7 кадров/сек. В голову лезли разные мысли о деградации из-за долгой работы роутера, из-за его перегрева. Это было что-то непонятное. В какой-то момент я отключил стримминг и увидел, что просто один захват (без стримминга) давал те же 7 кадров. Я даже начал подозревать проблемы с камерой. В общем какая-то чушь. Дело было вечером и камера, повернутая в окно, показывала что-то серое. Дабы сменить мрачное изображение я повернул камеру внутрь комнаты. И, о чудо! Частота кадров увеличилась до 15 и я все понял. Камера автоматически подстраивала время экспозиции и в какой-то момент это время стало больше длительности кадра при заданной частоте. За эти два часа случилось следующее: сначала плавно темнело (это был вечер), а потом я повернул камеру внутрь освещенной комнаты. Направив камеру на люстру я получил 20+ кадров/сек. Ура.
Другие проблемы и нюансы использования
Результаты
Ниже табличка с результатами сравнения mjpg-streamer и uvc2http. Если коротко — есть значительный выигрыш в потреблении памяти и небольшой выигрыш в частоте кадров и загрузке CPU.
1280×720 | 1920×1080 | |||||||||||
VSZ, KB, 1 client | VSZ, KB, 2 clients | CPU, %, 1 client | CPU, %, 2 clients | FPS, f/s, 1 client | FPS, f/s, 2 clients | VSZ, KB, 1 client | VSZ, KB, 2 clients | CPU, %, 1 client | CPU, %, 2 clients | FPS, f/s, 1 client | FPS, f/s, 2 clients | |
Mjpg-streamer | 16860 | 19040 | 26 | 43 | 17.6 | 15 | 25456 | 25812 | 28 | 50 | 13.8 | 10 |
uvc2http | 3960 | 3960 | 26 | 43 | 22 | 19.6 | 7576 | 7576 | 28 | 43 | 15.5 | 12.2 |
Ну и конечно же видео, которое я сделал вместе с детьми:
Фото получившегося танка (получилось что-то вроде цыганской телеги):
Использование
Исходники находятся здесь. Для использования на PC Linux надо всего лишь собрать (при условии что вы не хотите патчить драйвер UVC). Утилита собирается с помощью CMake стандартным способом. Если же надо использовать в OpenWRT, то надо сделать дополнительные шаги:
- Скопировать содержимое директории OpenWrt-15.05 в корень репозитория OpenWRT. Эти файлы только для OpenWRT 15.05. Они описывают новый пакет для OpenWRT и патч для драйвера UVC.
- Если ваша камера также возвращает завышенный размер необходимого буфера, то надо добавить использование quirk UVC_QUIRK_COMPRESSION_RATE для вашей камеры в файле uvc_driver.c. Для этого надо сделать собственный патч для драйвера UVC. Как это сделать, описано здесь wiki.openwrt.org/doc/devel/patches. Вам необходимо добавить описание вашей камеры в массив uvc_ids. В качестве примера можно посмотреть на описание моей камеры:
Что дальше
Решение состоит из двух частей: патч драйвера и другой алгоритм стримминга. Патч драйвера можно было бы включить в новую версию ядра линукса, но это спорное решение, так как оно основано на предположении о минимальном коэффициенте сжатия. Утилита же, на мой взгляд, хорошо подходит для использования на слабых системах (игрушках, домашних системах видеонаблюдения), и ее можно немного улучшить, добавив возможность задавать настройки камеры через параметры.
Алгоритм стримминга можно улучшить так как есть запас по загрузке CPU и по ширине канала (я легко получал с роутера 50+ MBit подключая десяток клиентов). Также можно добавить поддержку звука.
Источник
Set up a Webcam with Linux
Namespaces
Page actions
You want to set up your webcam with Linux, see a video stream from it and learn which applications you can use with it, right? Then this article is for you.
Contents
Try it
First let’s try if it works out of the box, so, connect your webcam (if it’s not inbuilt), open a terminal and start the application cheese:
This should switch on your webcam and you should see what it’s recording.
Ok, you are reading on, so there is still something left, maybe:
- terminal says «command not found», you need to install cheese. Read on at Install Cheese.
- cheese does not show the camera’s content -> read on at Check the Setup.
- you want to #record_a_video with your webcam.
Install cheese
To install cheese, you need to know your distribution. Here is how to find out your distribution.
- for Debian, Raspbian, Ubuntu, Kubuntu, Flubuntu, Xubuntu, GEUbuntu, Edubuntu, .
- for SUSE:
Check the Setup
If cheese starts, but does not find a webcam, you need to dig deeper.
- open a console and list your video4linux devices:
- you will find an output like this:
In this example your webcam device is named /dev/video0. If you have no /dev/video file, read #Troubleshooting. If you have several video4linux devices, for example a tv card your webcam may show up as /dev/video1 or whatever. But the time (in this case Nov 11 09:06) will be the time when you plugged it in.
You can also test your webcam the following ways:
- if you have vlc installed you can start it and choose Media -> Open Capture Device -> Video device name = /dev/video0 -> Play
- if you have mplayer installed you can use the command
Troubleshooting
Troubleshooting heavily depends on the distribution and version you are using. If you have done cabling correctly and a device file /dev/video* does not appear, your kernel probably does not know the hardware. In this case you may have to install the device driver separately because it may not be part of the kernel.
SUSE Linux 11.0 and earlier
This has been tested with SUSE Linux 11.0 x64 but should work with any earlier SUSE version. You will need to log in as user root. To find out what driver you need, open a console and call
If a Logitech Quickcam Messenger is plugged in the answer will be like:
This means you can install and load the webcam driver like this:
Now you should see a video device:
That means you can install and start your webcam-viewer-software. We choose gqcam:
It works. You see a video what from what is going on in front of your webcam.
Ubuntu
This has been tested with Ubuntu 8.10 x32 but should work with any Ubuntu version. Find out the driver activation command of your webcam. For this, first install the software hwinfo. Open a console and type:
Then call hwinfo:
If a Logitech Quickcam Messenger is plugged in the response will be like: 04: USB 00.2: 0000 Unclassified device
Activate the driver:
Now you should be able to see the video device:
You can now test your webcam using the software cheese:
Other webcams
If you have another webcam, try the above nevertheless. If it does not work, exchange the driver gspca against uvcvideo:
and start gqcam again.
Use it
record video
to capture video streams you can use cheese, a nice program with a graphical user interface. It allows you to watch and record your camera output at the same time. It stores in a strange format (.webm), but vlc can play this.
You can also automate video recording so you can capture the camera stream with sitting in front of the computer. To do this you can
- use the software mencoder:
- or use the software streamer, example:
video conferencing
watch it
To watch your camera’s input, use cheese or mplayer:
Or use vlc. You can run vlc as root by the way. To watch your webcam /dev/video0, start vlc and select Media -> Open Capture Device -> Video device name = /dev/video0 -> Play
Testbed
The following webcams have been found working with this tutorial:
- Logitech Quickcam messenger
- Philips Webcam SPC220NC
A general list of working webcams can be found at http://mxhaard.free.fr/spca5xx.html.
The guide has been tested with SUSE Linux 11.4 till 13.2 and Ubuntu.
Источник