Фрейм-диаграмма процесса mjpg-streamer выглядит следующим образом:
После запуска программы основной процесс открывает соответствующую библиотеку динамического соединения ввода и вывода в соответствии с каналами ввода и вывода, установленными входящими параметрами, и последовательно вызывает следующие функции
1. Ввод-склад-вывод (mjpg-streamer.h)
(1) глобальная структура
stop - это флаг остановки, при значении 1 программа останавливается;
db и db_update - соответственно блокировка мьютекса и переменная условия, оба используются для синхронизации потоков, когда входной канал помещает данные в хранилище, выходной канал уведомляется о получении данных.
Склад соответствует указателю буфера, а размер склада равен размеру.
Вывод соответствует структуре вывода (плагин вывода)
outcnt указывает, что в текущем выходном канале есть несколько способов
(2) файл mjpg-streamer-r63
Файл .so представляет собой плагин, который может быть плагином ввода (со словом ввода спереди) или плагином вывода (спереди выхода).
При запуске mjpg_streamer укажите каналы ввода и вывода через командную строку mjpg_streamer -i "input_uvc.so -f 10 -r 320 * 240" -o "output_http.so -w www"
Поскольку для сбора данных используется USB-камера, входной плагин input_uvc.so выбирается в качестве входного канала (как показано выше, укажите, какой плагин в качестве входного канала, через -i).
Поскольку мы хотим использовать отображение веб-страницы, мы выбираем выходной плагин output_http.so в качестве выходного канала. (Как показано на рисунке выше, укажите, какой плагин используется в качестве выходного канала через опцию -o)
(3) Основная функция анализирует командную строку -i "input_uvc.so -f 10 -r 320 * 240 ", чтобы открыть соответствующую библиотеку динамических ссылок input_uvc.so
Откройте библиотеку динамических ссылок через функцию dlopen
(4) Основная функция открывает соответствующую динамическую библиотеку out_http.so, анализируя командную строку -o "output_http.so -w www"
2. Работа, проделанная плагином ввода и плагином вывода
(1) Плагин ввода 1 (файл input_uvc.c)
структура ввода
(2) Плагин ввода 2
функция инициализации
В основном выполняем функцию init_videoIn
Входные параметры ширина ширина, высота высота, частота кадров fps, формат
Работа, выполненная init_videoIn: ① вызов функции init_v4l2 (через серию ioctl, предоставленных V4L2, чтобы установить разрешение камеры, частоту кадров и формат вывода камеры, а также выделить буфер и затем отобразить в пространство приложения videoIn-> mem [i ]); ② Выделить временный буфер videoIn-> tmpbuffer для приема данных камеры (направление потока данных камеры: videoIn-> mem [i] -----> videoIn-> tmpbuffer -----> globals- > buf (мы называем склад) ----------> выходной канал для извлечения данных и их отправки)
запустить функцию
В основном выполняйте функцию cam_thread в параметрах функции потока создания
Проделанная работа: вызов функции uvcGrab (эта функция копирует кадр данных из copy videoIn-> mem [i] в videoIn-> tmpbuffer), чтобы получить кадр данных
Определите формат полученных данных.Если формат входных данных - формат MJPEG, скопируйте его непосредственно в буфер глобальной структуры (то есть поместите его в хранилище), если это формат YUV, необходимо преобразовать данные формата YUV в данные формата MJPEG. Скопируйте в буфер глобальной структуры (то есть поместите его в глобальные склады -> буфер)
функция остановки
Сделать некоторые очистки
(3) Выходной плагин 1
структура вывода
(4) Выходной плагин 2
функция инициализации
Программирование сокетов и использование сокетов для имитации протокола http, поэтому сделайте некоторую инициализацию сокетов, например, номер порта
запустить функцию
Удалите данные из хранилища, сохраните их в буфере, а затем отправьте данные через функцию записи на мобильный телефон или другие устройства для получения.
функция остановки
Сделать некоторые очистки
Ссылка на эту статью:
https://blog.csdn.net/qingkongyeyue/article/details/52400036
https://blog.csdn.net/qingkongyeyue/article/details/52401514
https://blog.csdn.net/qingkongyeyue/article/details/52824165