O diagrama do quadro do processo mjpg-streamer é o seguinte:
Após a execução do programa, o processo principal abre a biblioteca de vínculo dinâmico de entrada e saída correspondente, de acordo com os canais de entrada e saída definidos pelos parâmetros recebidos, e chama sequencialmente as seguintes funções
1. Entrada-armazém-saída (mjpg-streamer.h)
(1) estrutura global
stop é o sinalizador de parada, quando definido como 1, o programa para de executar;
db e db_update são respectivamente bloqueio mutex e variável de condição, os dois são usados para sincronização de encadeamento, quando o canal de entrada coloca os dados no armazém, o canal de saída é notificado para buscar os dados
O armazém corresponde ao ponteiro do buf e o tamanho do armazém é tamanho.
A saída corresponde à estrutura de saída (plug-in de saída)
outcnt indica que existem várias maneiras no canal de saída atual
(2) arquivo mjpg-streamer-r63
O arquivo .so é um plug-in, que pode ser um plug-in de entrada (com a palavra input na frente) ou um plug-in de saída (com um plug de saída na frente).
Ao executar mjpg_streamer, especifique os canais de entrada e saída através da linha de comando mjpg_streamer -i "input_uvc.so -f 10 -r 320 * 240" -o "output_http.so -w www"
Como uma câmera USB é usada para coletar dados, o plug-in de entrada input_uvc.so é selecionado como o canal de entrada (como mostrado acima, -i especifica qual plug-in é usado como canal de entrada).
Como queremos usar a exibição da página da web, escolhemos o plug-in output_http.so como canal de saída. (Como mostrado na figura acima, especifique qual plug-in é usado como canal de saída através da opção -o)
(3) A função principal analisa a linha de comando -i "input_uvc.so -f 10 -r 320 * 240 " para abrir a biblioteca de links dinâmicos correspondente input_uvc.so
Abra a biblioteca de vínculo dinâmico através da função dlopen
(4) A função principal abre a biblioteca de links dinâmicos out_http.so correspondente, analisando a linha de comandos -o "output_http.so -w www"
2. O trabalho realizado pelo plug-in de entrada e pelo plug-in de saída
(1) Plug-in de entrada 1 (arquivo input_uvc.c)
estrutura de entrada
(2) Plug-in de entrada 2
função init
Execute principalmente a função init_videoIn
Parâmetros de entrada largura largura, altura altura, taxa de quadros fps, formato de formato
O trabalho realizado por init_videoIn: ① chame a função init_v4l2 (através de uma série de ioctl fornecida pelo V4L2 para definir a resolução da câmera, taxa de quadros e formato de saída da câmera, aloque o buffer e mapeie para o espaço de aplicativo videoIn-> mem [i ]); ② Aloque um buffer temporário videoIn-> tmpbuffer para receber dados da câmera (a direção do fluxo de dados da câmera é: videoIn-> mem [i] -----> videoIn-> tmpbuffer -----> globals- > buf (chamamos armazém) ----------> canal de saída para coletar dados e enviá-los)
função de execução
Execute principalmente a função cam_thread nos parâmetros de função do encadeamento de criação
Trabalho realizado: chame a função uvcGrab (essa função copia um quadro de dados da cópia videoIn-> mem [i] para videoIn-> tmpbuffer) para obter um quadro de dados
Determine o formato dos dados obtidos.Se o formato dos dados de entrada for o formato MJPEG, copie-o diretamente para o buf da estrutura global (ou seja, coloque-o no armazém); se for o formato YUV, você deverá converter os dados no formato YUV em dados no formato MJPEG. Copie para o buf da estrutura global (ou seja, coloque-o no armazém globals-> buf)
função de parada
Faça alguma limpeza
(3) Plug-in de saída 1
estrutura de saída
(4) Plug-in de saída 2
função init
Programação de soquete e uso de soquete para simular o protocolo http, assim como algumas inicializações de soquete, como número da porta
função de execução
Remova os dados do armazém, armazene-os em um buffer e envie-os através da função de gravação para o telefone celular ou outros dispositivos receberem
função de parada
Faça alguma limpeza
Link de referência para este artigo:
https://blog.csdn.net/qingkongyeyue/article/details/52400036
https://blog.csdn.net/qingkongyeyue/article/details/52401514
https://blog.csdn.net/qingkongyeyue/article/details/52824165