Le diagramme de trame du processus mjpg-streamer est le suivant:
Après l'exécution du programme, le processus principal ouvre la bibliothèque de liens dynamiques d'entrée et de sortie correspondante en fonction des canaux d'entrée et de sortie définis par les paramètres entrants et appelle séquentiellement les fonctions suivantes
1. Entrée-entrepôt-sortie (mjpg-streamer.h)
(1) structure globale
stop est le drapeau d'arrêt, lorsqu'il est réglé sur 1, le programme s'arrête;
db et db_update sont respectivement des verrous mutex et des variables de condition, les deux sont utilisés pour la synchronisation des threads, lorsque le canal d'entrée met les données dans l'entrepôt, le canal de sortie est averti de récupérer les données
L'entrepôt correspond au pointeur buf, et la taille de l'entrepôt est de taille.
La sortie correspond à la structure de sortie (plugin de sortie)
outcnt indique qu'il existe plusieurs façons dans le canal de sortie actuel
(2) Fichier mjpg-streamer-r63
Le fichier .so est un plug-in, qui peut être un plug-in d'entrée (avec le mot entrée à l'avant) ou un plug-in de sortie (avec un plug-in de sortie à l'avant).
Lors de l'exécution de mjpg_streamer, spécifiez les canaux d'entrée et de sortie via la ligne de commande mjpg_streamer -i "input_uvc.so -f 10 -r 320 * 240" -o "output_http.so -w www"
Étant donné qu'une caméra USB est utilisée pour collecter des données, le plug-in d'entrée input_uvc.so est sélectionné comme canal d'entrée (comme indiqué ci-dessus, -i spécifie le plug-in utilisé comme canal d'entrée).
Puisque nous voulons utiliser l'affichage de la page Web, nous choisissons le plug-in de sortie output_http.so comme canal de sortie. (Comme le montre la figure ci-dessus, spécifiez le plug-in utilisé comme canal de sortie via l'option -o)
(3) La fonction principale analyse la ligne de commande -i "input_uvc.so -f 10 -r 320 * 240 " pour ouvrir la bibliothèque de liens dynamiques input_uvc.so correspondante
Ouvrez la bibliothèque de liens dynamiques via la fonction dlopen
(4) La fonction principale ouvre la bibliothèque de liens dynamiques out_http.so correspondante en analysant la ligne de commande -o "output_http.so -w www"
2. Le travail effectué par le plugin d'entrée et le plugin de sortie
(1) Plugin d'entrée 1 (fichier input_uvc.c)
structure d'entrée
(2) Plugin d'entrée 2
fonction init
Exécutez principalement la fonction init_videoIn
Paramètres d'entrée largeur largeur, hauteur hauteur, fréquence d'images fps, format de format
Le travail effectué par init_videoIn: ① appeler la fonction init_v4l2 (via une série d'ioctl fournie par V4L2 pour définir la résolution de la caméra, la fréquence d'images et le format de sortie de la caméra, et allouer le tampon, puis mapper vers l'espace d'application videoIn-> mem [i ]); ② Allouer un tampon temporaire videoIn-> tmpbuffer pour recevoir les données de la caméra (la direction du flux de données de la caméra est: videoIn-> mem [i] -----> videoIn-> tmpbuffer -----> globals- > buf (nous appelons entrepôt) ----------> canal de sortie pour extraire les données et les envoyer)
exécuter la fonction
Exécutez principalement la fonction cam_thread dans les paramètres de la fonction thread de création
Travail effectué: appelez la fonction uvcGrab (cette fonction copie une image de données de la copie videoIn-> mem [i] vers videoIn-> tmpbuffer) pour obtenir une image de données
Déterminez le format des données obtenues. Si le format des données d'entrée est au format MJPEG, copiez-le directement dans le buf de la structure globale (c'est-à-dire, placez-le dans l'entrepôt); s'il s'agit du format YUV, vous devez convertir les données au format YUV en données au format MJPEG. Copiez dans le buf de la structure globale (c'est-à-dire, mettez-le dans l'entrepôt global-> buf)
fonction d'arrêt
Faites un peu de nettoyage
(3) Plugin de sortie 1
structure de sortie
(4) Plugin de sortie 2
fonction init
Programmation de socket et utilisation de socket pour simuler le protocole http, faites donc une certaine initialisation de socket, comme le numéro de port
exécuter la fonction
Supprimez les données de l'entrepôt, stockez-les dans un tampon, puis envoyez-les via la fonction d'écriture pour que le téléphone mobile ou d'autres appareils les reçoivent
fonction d'arrêt
Faites un peu de nettoyage
Lien de référence pour cet article:
https://blog.csdn.net/qingkongyeyue/article/details/52400036
https://blog.csdn.net/qingkongyeyue/article/details/52401514
https://blog.csdn.net/qingkongyeyue/article/details/52824165