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 Android
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 ~
Parte Webrtc
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:
Desligue o processo de gravação de áudio: O processo de gravação de
á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:
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.
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:
Desligue o processo de gravação de áudio: O processo de
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.
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.
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): Problemas na WebRTC gravação
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.
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.
Áudio e vídeo estão fora de sincronia
- 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.
- 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.
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. . .