Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Debian \ Android: Трансляция веб камеры

#android #linux #debian


Здравствуйте, есть мини компьютер cubieboard 1 и цель: транслировать с него веб камеру
(которая подключена к нему через USB).  

Варианты моих решений:  


Ставим Debian, устанавливаем ffmpeg и транслируем  
Ставим Android, устанавливаем любое приложения для трансляции (я использовал IP Webcam)  


Я думал что первый вариант будет лучше, так как:


ОС без графической оболочки - меньше кушает
Нету всяких приложений которые бы тоже кушали ресурсы


А оказалось всё на оборот, на android трансляция работала почти идеально (задержка
около 0.2с.) с хорошим разрешением.  

А на Debian при разрешении 320X240 были ужасные падения FPS + задержка около 2с и
ЦП загружен на 100%. А при разрешении 640X480 она вообще не работала. 

Возможно чего-то я недопонимаю, но как так возможно?
    


Ответы

Ответ 1



Аппаратный кодек - ответ на ваш вопрос. Возьмите камеру с аппаратным mjpeg и mjpeg-streamer. Роутер с 200МГц процессором вещал камеру Логитеч и был загружен при этом на 7-10%. В тоже время в ARM проццесорах есть свой кодек, которым пользуется Андроид. Дебиан не может задействовать эти возможности по нескольким причинам: лицензионная чистота, отсутствие программиста который напишет этот модуль и упакует для Убунты (потому в репозитории Дебиана врятли возьмут).

Ответ 2



Задержки, они же лаги, могут происходить по многим причинам. В Вашем случае это проблеме с перекодированием. Устройство слабенькое, в риалтайме сложно управится. ffmpeg может немножко кешировать (ну как минимум на один кадр будет отставать - картинку нужно в буфер поместить, потом отправить) собственно сама сеть. Тут без коментариев. проигрыватель. Плееры также любят кешировать, потому что данные в сети не идут часто равномерным потоком и небольшая пауза вносит задержку. Потом либо нужно ускорять воспроизведение, либо придерживать задержку (которая будет накапливаться). Небольшой буфер решает проблему. Теперь перейдем к командам. ffmpeg -f v4l2 -r 25 -s 640x480 -i /dev/video0 -fflags nobuffer -c:v copy -f sdl - Тут нужно немножко уточнить. -f v4l2 -r 25 -s 640x480 -i /dev/video0 - тут все просто, выбрали формат, источник и кол-во кадров в секунду. Это выбирается по личным предпочтениям и возможностям камеры. -fflags nobuffer - говорит ffmpeg не буферизировать. Может помочь немножко убрать задержку. -c:v copy - это важная строка. Она говорит "не пытайся перекодировать видео. Просто копируй. -f sdl - - это не будет работать, если нет gui. Эта опция говорит "выводи на экран". Она хороша для тестов, но не для реальной работы. Так как хочется минимум задержек, можно попробовать использовать udp (тогда нужна где то такая конструкция -f mpegts udp://127.0.0.1:8080) или другие удобные протоколы.

Ответ 3



Попробуйте mjeg_streamer вместо ffmpeg. На нем проще подобрать подходящий fps и разрешение экрана. Ну и камера dns 1302w - не самый лучший выбор для таких задач. Вполне возможно, что в android где-то чтение с дешевых китайских видеокамер реализовано лучше Не помешало бы сравнить версии ядер.

Комментариев нет:

Отправить комментарий