Имеется вебкамера, одноплатник orange pi (сначала был raspberry pi, но один аппаратный USB на всё приводит к куче проблем) и wifi-свисток. Требуется передавать видео 640х480 30fps на смартфон под управлением ОС Android. Важный момент - минимальная задержка (не больше 200 миллисекунд), пока это физически возможно (потом можно терять кадры). Со стороны одноплатника может быть как стандартное ПО (какой-нибудь ffmpeg), так и самописное, со стороны Android самописное (передача видео не единственная функция), но, конечно же, можно использовать библиотеки.
В какую сторону копать?
Пока сделал свой велосипед - захватываю кадры с камеры с помощью V4L2, жму с помощью libjpeg-turbo, разбиваю на части по несколько сотен байт, шлю по UDP (при этом шлю куски JPEG по мере их появления по мере сжатия). С другого конца принимаю пакеты, собираю JPEG (в каждом пакете передаётся его порядковый номер, полный размер JPEG и смещение - каждый кадр собирается в независимом буфере, как только собирается целый кадр, он отображается, а все несобранные кадры с меньшим порядковым номером отбрасываются и в будущем игнорируются), распаковываю и вывожу через OpenGL.
Между одноплатником и ноутбуком работает отлично и задержка низкая. А вот между одноплатником и смартфоном работает очень нестабильно. Изредка бывает 30fps, но обычно чуть ли не половина кадров теряется. Пробовал как подключать одноплатник и смартфон к готовой точке доступа (и даже подключать одноплатник к точке доступа по кабелю), так и делать точку доступа из одноплатника. Смартфон спокойно играет через Интернет Full HD YouTube, так что ресурсов у него и сети хватает (конечно, YouTube пожат лучше, чем JPEG, но сильно большее разрешение компенсирует и битрейт должен быть не меньше).
Почему JPEG? Потому что я наученный горьким опытом сжатия видео на одноплатников - это единственный известный мне «кодек», который приемлемо грузит ARM-одноплатники. На всё остальное просто не хватает ресурсов на сжатие.
Как измеряю задержку? Навожу вебку на запущенный секундомер, фотографирую всё это хозяйство другим девайсом так, чтобы в кадре одновременно был экран с видео и реальный секундомер. Смотрю на разницу в показаниях на фоточке.
Я не прошу готового решения, только направление.