analyse du framework mjpg-streamer

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

A publié 42 articles originaux · Comme 10 · Visiteurs 10 000+

Je suppose que tu aimes

Origine blog.csdn.net/qq_37659294/article/details/104279995
conseillé
Classement