Envía rápidamente cuadros de vídeo comprimidos con GPUImage

votos
1

Estoy escribiendo una aplicación Swift que envía una entrada de vídeo de la cámara del iPhone (fotogramas) a través de la red, para poder mostrarlos más tarde en una aplicación MacOS.

Actualmente, estoy capturando cuadros de video de un AVCaputreSession, y obtener un PixelBufferdel captureOutputmétodo. Dado que cada cuadro es enorme (píxeles RAW) estoy convirtiendo el CVPixelBufferque a un CGImagecon VTCreateCGImageFromCVPixelBuffery más tarde a un UIImagecon la compresión JPEG (50%). Luego envío ese JPEG a través de la red y lo muestro en la aplicación de Mac OS.

Como pueden ver esto está lejos de ser ideal y funciona a ~25 FPS en un iPhone 11. Después de investigar un poco, se me ocurrió la GPU Image 2. Parece que pude obtener los datos de la cámara y aplicar algo así (para que la transformación se haga en la 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

Y debería ser capaz de transmitir esa imagen y mostrarla en la aplicación MacOS. ¿Hay una mejor manera de implementar todo este proceso? Tal vez podría usar la codificación de hardware H264 del iPhone en lugar de convertir las imágenes a JPEG, pero parece que no es tan sencillo (y parece que GPUImage hace algo así por lo que he leído).

Cualquier ayuda es apreciada, ¡gracias de antemano!

Publicado el 18/05/2020 a las 18:35
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Entiendo que quieres hacer esta operación en un entorno sin Internet.

¿Cuáles son las limitaciones de su proyecto?

  1. ¿Mínimo de fps?
  2. ¿Resolución mínima de vídeo?
  3. ¿Debería transmitirse el sonido?
  4. ¿Cuál es su entorno de red?
  5. ¿Versión mínima de iOS y OSX?

Aparte de éstas, GPUImage no es una solución adecuada para usted. Si vas a transferir videos, tienes que codificar H264 o H265 (HEVC) en todo momento. De esta manera, puedes transmitir el video de una manera de rendimiento.

La solución que está haciendo ahora es CMSampleBuffer-> CVPixelBuffer-> JPEG-> La conversión de datos carga seriamente al procesador. También aumenta el riesgo de fuga de memoria.

Si puedes contar un poco, me gustaría ayudar. Tengo experiencia en el procesamiento de video.

Lo siento por mi inglés.

Respondida el 24/05/2020 a las 23:59
fuente por usuario

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