Envie rapidamente quadros de vídeo comprimido usando GPUImage

votos
1

Estou escrevendo um aplicativo Swift que envia uma entrada de vídeo da câmera do iPhone (frames) através da rede, para que eu possa exibi-los posteriormente em um aplicativo macOS.

Atualmente, estou capturando quadros de vídeo de um AVCaputreSession, e obtenho um PixelBufferdo captureOutputmétodo. Como cada quadro é enorme (pixels RAW), estou convertendo CVPixelBufferisso em um CGImagecom VTCreateCGImageFromCVPixelBuffere depois em um UIImagecom compressão JPEG (50%). Em seguida, envio esse JPEG pela rede e o exibo no aplicativo Mac OS.

Como você pode ver, isso está longe de ser o ideal e roda a ~25 FPS em um iPhone 11. Depois de alguma pesquisa, eu vim com a Imagem 2 da GPU. Parece que eu consegui obter os dados da câmera e aplicar algo assim (para que a transformação seja feita na GPU):

camera = try Camera(sessionPreset:AVCaptureSessionPreset640x480)
let pictureOutput = PictureOutput()
pictureOutput.encodedImageFormat = .JPEG
pictureOutput.imageAvailableCallback = {image in
    // Send the picture through the network here
}
camera --> pictureOutput

E eu devo ser capaz de transmitir essa imagem e exibi-la no aplicativo macOS. Existe uma maneira melhor de implementar todo este processo? Talvez eu pudesse usar a codificação de hardware H264 do iPhone em vez de converter imagens para JPEG, mas parece que não é tão simples assim (e parece que a GPUImage faz algo assim pelo que eu li).

Qualquer ajuda é apreciada, obrigado de antemão!

Publicado 18/05/2020 em 18:35
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Compreendo que queira fazer esta operação num ambiente não-internet.

Quais são as restrições do seu projeto;

  1. Mínimo de fps?
  2. Resolução mínima de vídeo?
  3. O som deve ser transmitido?
  4. Qual é o seu ambiente de rede?
  5. Versão mínima do iOS e OSX?

Além disso, GPUImage não é uma solução adequada para você. Se você vai transferir vídeos, você tem que codificar H264 ou H265 (HEVC) em cada momento. Desta forma, você pode transmitir vídeo de uma forma de performance.

A solução que você está fazendo agora é CMSampleBuffer-> CVPixelBuffer-> JPEG-> Conversão de dados sobrecarrega seriamente o processador. Também aumenta o risco de vazamento de memória.

Se puder dizer um pouco, eu gostaria de ajudar. Eu tenho experiência com processamento de vídeo.

Desculpe pelo meu inglês.

Respondeu 24/05/2020 em 23:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more