- Работа с usb видеокамерой в Linux. Часть 1
- Не работает микрофон в Linux (РЕШЕНО)
- Как проверить микрофон в Linux
- 1. Установите pulseaudio
- 2. Убедитесь, что громкость микрофона не на нуле
- 3. Выбор правильного профиля для Встроенного аудио
- 4. Конфликт встроенного микрофона и HDMI источника
- 5. Микрофон гарнитуры показан как подключён, хотя это не так. Микрофон не работает, пока не подключена и не отключена гарнитура
- Захват видео с USB камер на устройствах под управлением Linux
- Предыстория
- Ограничения
- HW и SW
- Предварительный анализ
- В поисках новых приключений
- Uvc2http
- Неожиданная проблема
- Другие проблемы и нюансы использования
- Результаты
- Использование
- Что дальше
Работа с 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, виодеформаты изображения, настройка камеры, вывод изображения в текстуру, работа с несколькими камерами.
Источник
Не работает микрофон в Linux (РЕШЕНО)
В этой заметке будут рассмотрены несколько причин, почему не работает микрофон в Linux. Имеются ввиду случаи, когда микрофон не работает сразу во всех приложениях, а не в каком-то определённом.
Как проверить микрофон в Linux
Чтобы проверить микрофон прямо в командной строке без программ с большим количеством опций, запустите команду:
Будет выполнена запись звука в течение 10 секунд. Чтобы воспроизвести полученный файл, выполните следующую команду:
1. Установите pulseaudio
Начните с установки пакета pulseaudio.
PulseAudio — это звуковой сервер общего назначения, предназначенный для работы в качестве промежуточного программного обеспечения между вашими приложениями и аппаратными устройствами с использованием ALSA или OSS. Он также предлагает простую потоковую передачу по сети через локальные устройства, используя Avahi, если он включён. Хотя его основная цель — облегчить настройку звука, его модульная конструкция позволяет более опытным пользователям точно настраивать демон в соответствии с его потребностями.
В Debain, Linux Mint, Kali Linux, Ubuntu и их производных это делается так:
В Arch Linux, BlackArch и их производных это делается следующим образом:
2. Убедитесь, что громкость микрофона не на нуле
Зайдите в настройки звука, переключитесь во вкладку Input и проверьте настройки громкости.
Если там несколько устройств, то проверьте каждое из них.
Если вы не можете найти настройки громкости, запустите команду и перейдите во вкладку «Устройства Ввода»:
Убедитесь, что звук не заглушён
3. Выбор правильного профиля для Встроенного аудио
Откройте регулятор громкости PulseAudio — в меню или командой:
Перейдите во вкладку «Конфигурация» и в качестве «Профиля» выберите «Аналоговый стерео дуплекс»:
Даже если этот профиль уже выбран, попробуйте выбрать другой и вновь переключиться на «Аналоговый стерео дуплекс» — проверьте, решило ли это вашу проблему.
Кстати, если вы пытаетесь заставить работать не встроенный микрофон, а, например, источник звука HDMI, то здесь вы можете найти другие профили, которые переключат на нужный вам микрофон.
4. Конфликт встроенного микрофона и HDMI источника
На компьютере для ввода звука могут быть следующие источники:
- встроенный в ноутбук микрофон
- гарнитура, подключённая через audio jack
- Bluetooth гарнитура
- HDMI вход
- микрофон видеокамеры
- USB микрофон или гарнитура
Некоторые пользователи Linux сталкиваются с тем, что система по умолчанию пытается использовать HDMI источник звука, даже если соответствующий провод не подключён.
Откройте терминал (например, нажав Ctrl+Alt+t) и проверьте, какие у вас используются звуковые кодаки:
Если у вас более чем одна строка (как в выводе выше), то это может быть причиной проблемы, когда звук не записывается или записываются только статические помехи.
Подтвердить можно следующим образом:
- подключите гарнитуру к входу audio jack (например, возьмите наушники с микрофоном от телефона)
- сразу отключите гарнитуру от audio jack
- проверьте работоспособность микрофона — если раньше он не работал, а теперь стал записывать звук, значит данный раздел может решить вашу проблему.
Сделайте резервную копию файла, если он уже существует:
Для исправления достаточно добавить строку в файл /etc/modprobe.d/alsa-base.conf:
со следующим содержимым
Вместо слово МОДЕЛЬ нужно вписать значение, которое вы найдёте для модели вашего ноутбука на странице HD-Audio Codec-Specific Models.
Причём там не обязательно будет точное название модели — просто найдите то, что ближе всего к ней. Например, модель моего ноутбука ASUS GL703GE, самое похожее, что я смог найти, это «asus-g73jw», тогда строка, которую я добавил в файл /etc/modprobe.d/alsa-base.conf, следующая:
Сохраните этот файл и перезагрузитесь — после этого проблема должна исчезнуть.
5. Микрофон гарнитуры показан как подключён, хотя это не так. Микрофон не работает, пока не подключена и не отключена гарнитура
Описание данной проблемы пользователями:
1.
Все работает нормально, за исключением странной проблемы с моим микрофоном, он работает, только если я загружаюсь с наушниками с уже подключённым микрофоном или если я подключаю их после загрузки. В противном случае всё, что я получаю при записи звука, это статичные помехи.
2.
Я никогда раньше не использовал свой внутренний микрофон, но в конце концов я использовал его некоторое время назад для видеоконференций. Микрофон начинает работать после того, как я просто подключаю 3,5-миллиметровую головную гарнитуру, которую я затем отключаю. Тогда я могу использовать свой внутренний микрофон, автоматическое отключение звука также работает, подключив и отключив гарнитуру. После перезагрузки микрофон вновь не работает (микрофон гарнитуры отмечен, как опять подключённый) и всё нужно делать заново.
Рассмотрим, как это можно исправить.
Установите продвинутые инструменты Alsa. В Debain, Linux Mint, Kali Linux, Ubuntu и их производных это делается так:
В Arch Linux, BlackArch и их производных это делается следующим образом:
Для запуска выполните команду:
В «Select a codec» выберите основное устройство для захвата звука, поставьте галочку «Show unconnect pins»:
Поставьте галочку для Pin ID 0x19 и выберите «not connected». Сохраните настройки и проверьте, всё ли работает как следует, убедитесь, что звук микрофона не заглушён в pavucontrol или настройках звука.
Если всё нормально, то нажмите кнопку «Install boot override» — установить переопределение при загрузке, чтобы изменения вступали в силу при включении компьютера.
Источник
Захват видео с 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 подключая десяток клиентов). Также можно добавить поддержку звука.
Источник