Resumo de gravação de vídeo de aplicativos de áudio e vídeo

Contexto: para gravar em uma videochamada, os requisitos específicos são os seguintes:

(1) Gravação de videochamada, salve-a no formato AVI e carregue-a no servidor, o servidor envia para a parte de mensagem do dispositivo, mas a própria máquina de gerenciamento não armazena a gravação;

(2) Pode monitorar outros equipamentos e suportar gravação de vídeo

Portanto, é necessário que o sistema Android agora suporte dois tipos de gravação: gravação de vídeo e gravação de monitoramento. Existem funções de gravação relacionadas ao desenvolvimento no dispositivo, mas o hardware geral e o desempenho do dispositivo determinam que há um problema com a operação da estrutura anterior. Ao mesmo tempo, o quadro de gravação de chamadas e as pontuações de gravação de monitoramento são diferentes, portanto, ambos os conjuntos de estruturas são necessários para oferecer suporte.

Moldura de câmera Android

Estrutura de aplicativo de estrutura de câmera AndroidInsira a descrição da imagem aqui

O código do aplicativo está no nível da estrutura do aplicativo e usa a API Camera 2 para interagir com o hardware da câmera. Internamente, esses códigos chamam a interface Binder correspondente para acessar o código nativo que interage com a câmera.

AIDL

A interface do Binder associada ao CameraService pode ser encontrada em frameworks / av / camera / aidl / android / hardware. O código gerado chama o código nativo de nível inferior para obter acesso à câmera física e retorna os dados usados ​​para criar o CameraDevice no nível da estrutura e, finalmente, criar o objeto CameraCaptureSession.

Estrutura nativa

Este framework está localizado em frameworks / av / e fornece classes nativas equivalentes às classes CameraDevice e CameraCaptureSession. Consulte também a referência da câmera2 do NDK.

Interface Binder IPC

A interface do binder IPC é usada para implementar a comunicação entre os limites do processo. Várias classes do Binder de câmera que chamam serviços de câmera estão localizadas no diretório frameworks / av / camera / camera / aidl / android / hardware. ICameraService é a interface do serviço de câmera; ICameraDeviceUser é a interface de um dispositivo de câmera específico que foi aberto; ICameraServiceListener e ICameraDeviceCallbacks são retornos de chamada para CameraService e CameraDevice da estrutura do aplicativo, respectivamente.

Serviço de câmera

Localizado em frameworks / av / services / camera / libcameraservice / CameraService. O serviço de câmera em cpp é o código real para interagir com HAL.

COISA

A camada de abstração de hardware define uma interface padrão que é chamada pelo serviço da câmera e que você deve implementar para garantir a operação normal do hardware da câmera.

Se você achar difícil encontrar materiais de aprendizagem para desenvolvimento de áudio e vídeo, você pode adicionar o grupo de comunicação C / C ++ do editor : 960994558 materiais de aprendizagem foram compartilhados no grupo, ansioso para sua participação ~

Insira a descrição da imagem aqui

Parte Webrtc

Insira a descrição da imagem aqui
Cada caminho corresponde a um módulo, e a função de cada módulo é aproximadamente a seguinte:

Componente

Descrição

áudio_comum

Funções gerais de som, principalmente funções abstratas de processamento de som

common_video

Funções gerais de vídeo, principalmente funções abstratas de processamento de imagem

meios de comunicação

Catálogo de conteúdo relacionado à mídia

módulos

Vários módulos, incluindo codecs, neteq, mixagem, controle de taxa de bits, ferramentas, etc.

system_wrapper

Interface de função de biblioteca relacionada ao sistema operacional, a implementação específica é dividida em sistema operacional win, linux, android, mac

audio

O mecanismo de voz, que se parece um pouco com uma camada lógica, lida com todas as informações estatísticas e lógicas de operação relacionadas à voz e gerencia e mantém o canal de áudio

vídeo

Motor de vídeo, lógica de operação relacionada ao vídeo e informações estatísticas, gerenciamento e manutenção do canal de vídeo

Estrutura de gravação em WebRTC :

Processo de gravação de áudio

O processo de gravação de áudio pode ser dividido em três subprocessos, a saber: iniciar o processo de gravação de áudio / processo de gravação de áudio em andamento / encerrar o processo de gravação de áudio.


Ligar / desligar o processo de gravação de áudio webrtc fornece duas interfaces, ave_VoE_StartRecording e ave_VoE_StopRecording, para a camada Java ligar / desligar a gravação de áudio.

Ligue o processo de gravação de áudio: Insira a descrição da imagem aqui
Desligue o processo de gravação de áudio: O processo de gravação de
Insira a descrição da imagem aqui
áudio em andamento

O processo de gravação de áudio em andamento é o núcleo de toda a gravação. Seu núcleo é o objeto TransmitMixer, que pode obter os dados de áudio de cada canal e microfone local, mixá-los uniformemente e depois gravá-los no arquivo por meio do identificador de arquivo. Ao contrário do processo de gravação de vídeo, este processo é unificado e pertence ao mesmo segmento da coleta de dados de áudio. Processo de coleta, mixagem e gravação de arquivos de áudio:
Insira a descrição da imagem aqui
processo de coleta de imagens

O processo de captura de imagem em webrtc é iniciado em VideoCaptureAndroid, e a imagem capturada é retornada para a classe ViECapture em webrtc para processamento, incluindo fusão, codificação e envio.
Insira a descrição da imagem aqui
Processo de gravação de vídeo

O processo de gravação de vídeo pode ser dividido em três subprocessos, a saber: iniciar o processo de gravação de vídeo / processo de gravação de vídeo em andamento / encerrar o processo de gravação de vídeo.

Ligar / desligar o processo de gravação de vídeo

webrtc fornece duas interfaces, ave_ViE_StartRecording e ave_ViE_StopRecording, para a camada Java ligar / desligar a gravação de vídeo.

Ligue o processo de gravação de vídeo: Insira a descrição da imagem aqui
Desligue o processo de gravação de áudio: O processo de
Insira a descrição da imagem aqui
gravação de vídeo em andamento é o núcleo de toda a gravação. Seu núcleo é o objeto Capturer e o thread de gravação. O objeto Capturer pode obter os dados de imagem de cada um canal e a câmera local e, em seguida, unifique-os. Misture e adicione ao buffer. O thread de gravação digere o Buffer por meio do Timer, codifica os dados da imagem e os grava no arquivo por meio do identificador de arquivo. Diferente do processo de gravação de áudio, durante o processo de gravação, a aquisição e mixagem de imagem e a aquisição e mixagem de som são processadas em seus respectivos threads, e a codificação de imagem e gravação de arquivo são processadas no thread criado quando a gravação é iniciada. Um total de 3 threads estão envolvidos.
Insira a descrição da imagem aqui
Processo de coleta e mixagem de som 3.2 O processo de gravação de áudio mencionado no processo de gravação de áudio é basicamente o mesmo. A única diferença é que os dados de áudio mixados são gravados diretamente no arquivo na gravação de áudio, enquanto na gravação de vídeo é Write os dados de áudio misturados para o Buffer da fila de áudio, que é usado para gravar o arquivo junto com os dados de vídeo em um thread de gravação separado.

Insira a descrição da imagem aqui
Processo de codificação de imagem e gravação de arquivo

Codificação de imagem e processo de escrita de arquivo (usando AviRecorder :: Process como a análise de objeto): Insira a descrição da imagem aquiProblemas na WebRTC gravação Insira a descrição da imagem aqui
Gravação preso problemas

Áudio e vídeo são dois segmentos diferentes durante a gravação. Ao mesmo tempo, o vídeo é decodificado de acordo com os dados recebidos e misturado com os dados locais, então codificado e então gravado no arquivo de dados. Portanto, a sobrecarga de desempenho é aumentada. A maior parte do tempo é gasta em mixagem e codificação. A CPU ocupa uma quantidade relativamente grande. Ao mesmo tempo, muitos outros quadros de dados de vídeo serão perdidos. Portanto, o vídeo gravado parece ficar muito preso, mas o som está normal.
Insira a descrição da imagem aqui
Problema de FrameRate

Para arquivos AVI, na implementação do código WebRTC, o cabeçalho AVI é o primeiro a gerar o conteúdo do arquivo de cabeçalho e, em seguida, gravar os dados de áudio e vídeo quadro a quadro. Portanto, a taxa de quadros e outros dados de vídeo relacionados no momento são gravados diretamente de acordo com o valor padrão. A lacuna de desempenho relativa do equipamento é bastante grande, então os dados gravados neste momento não são os parâmetros de vídeo reais, o que faz com que a reprodução do vídeo congele. Insira a descrição da imagem aqui
Áudio e vídeo estão fora de sincronia

  1. A quantidade de dados de áudio e vídeo é inconsistente;

A coleta de áudio e vídeo e os threads de gravação de arquivo são independentes, enquanto os dados de coleta de áudio e os dados recebidos são relativamente estáveis, e a gravação de arquivo também é relativamente estável.Basicamente, o arquivo é gravado em um quadro de 10ms. No entanto, os dados de vídeo são relativamente grandes e a taxa é instável ao receber, o que facilmente faz com que o tempo de processamento de um quadro de dados em diferentes threads seja incerto, e é fácil perder alguns dados.

  1. A estabilidade da rede leva a uma taxa de recepção de vídeo instável;

Solução em Webrtc

Aumentar cache

Aumente o mecanismo de cache de vídeo para salvar ao máximo todos os quadros de vídeo recebidos. Insira a descrição da imagem aqui
Remova o código

Como a codificação da imagem leva muito tempo e o cliente não precisa do vídeo local, a etapa de codificação é eliminada de todo o processo.

Estatísticas de taxa de quadros

O vídeo está fora de sincronia. Durante uma chamada, a taxa de quadros muda dinamicamente. De acordo com o método anterior de escrever um valor fixo, ele pode não corresponder a todas as situações completamente, resultando na assincronização de áudio e vídeo. Ao mesmo tempo, o valor inicial o valor estatístico também é impreciso.

l Nova solução: calcular a taxa de quadros de acordo com a duração do áudio e o número de quadros do vídeo;

l Plano preferido: comece a gravar e termine a gravação para registrar os pontos de tempo separadamente e, em seguida, use a diferença de tempo e o número de quadros para calcular a taxa de quadros;

Ambos têm erros, mas a solução preferida será mais próxima da taxa de quadros real.

Nova discussão de tecnologia

(1) Perda de quadro e estratégia de compensação de quadro:

Ou seja, a taxa de quadros de entrada é 25, a taxa de quadros de saída é 30. Ou 30 a 25, etc. A taxa de quadros é de pequena a grande, ou de grande a pequena, e a taxa de quadros de saída é uma taxa de quadros fixa. Nesse caso, envolve a eliminação de quadros ou o processamento de compensação de quadros. Por exemplo, se você inserir 25 e produzir 30, precisará criar 5 quadros. Se você inserir 30 e produzir 25, precisará descartar 5 quadros. A chave do problema é quais quadros devem ser eliminados e quais quadros devem ser preenchidos. Geralmente pensamos que se 30-> 25, 5 quadros são perdidos, então podemos perder um quadro a cada 6 quadros, exatamente 30 quadros podem perder 5 quadros.

(2) Personalização do formato de gravação:

Agora, a exigência do cliente é que o vídeo seja gravado em AVI e o áudio no formato WAV, e diferentes opções de formato podem ser adicionadas, e vários formatos podem ser gravados em WebRTC. Isso requer o suporte total de WebRTC, incluindo codificação e decodificação de formato específico e operações de arquivo de formato específico.

(3) Pacote SDK de gravação:

Encapsule a função de gravação em um SDK simples, que é conveniente para fornecer clientes para desenvolvimento secundário.

Outros, todos são bem-vindos para adicionar. . .

Acho que você gosta

Origin blog.csdn.net/weixin_52622200/article/details/114104772
Recomendado
Clasificación