Invio rapido di fotogrammi video compressi utilizzando GPUImage

voti
1

Sto scrivendo un'app Swift che invia un ingresso video (fotogrammi) della fotocamera dell'iPhone attraverso la rete, in modo da poterli poi visualizzare su un'app per Mac OS.

Attualmente, sto prendendo i fotogrammi video da unAVCaputreSession, e ottenere un PixelBufferdal captureOutputmetodo. Dato che ogni fotogramma è enorme (pixel RAW) sto convertendo CVPixelBufferquello in un CGImagecon VTCreateCGImageFromCVPixelBuffere successivamente in un UIImagecon compressione JPEG (50%). Poi invio quel JPEG attraverso la rete e lo visualizzo sull'applicazione Mac OS.

Come si può vedere questo è tutt'altro che ideale e funziona a ~25 FPS su un iPhone 11. Dopo alcune ricerche, mi è venuta in mente la GPU Image 2. Sembra che potrei ottenere i dati dalla fotocamera e applicare qualcosa di simile (in modo che la trasformazione sia fatta in 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 dovrei essere in grado di trasmettere quell'UIImage e visualizzarlo sull'app macOS. C'è un modo migliore per implementare l'intero processo? Forse potrei usare la codifica hardware H264 dell'iPhone invece di convertire le immagini in JPEG, ma sembra che non sia così semplice (e sembra che GPUImage faccia qualcosa del genere da quello che ho letto).

Qualsiasi aiuto è apprezzato, grazie in anticipo!

È pubblicato 18/05/2020 alle 18:35
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Capisco che vogliate fare questa operazione in un ambiente non Internet.

Quali sono i vincoli del vostro progetto;

  1. Fps minimo?
  2. Risoluzione video minima?
  3. Il suono deve essere trasmesso?
  4. Qual è il vostro ambiente di rete?
  5. Versione minima iOS e OSX?

A parte questi, GPUImage non è una soluzione adatta a voi. Se volete trasferire i video, dovete codificare H264 o H265 (HEVC) in ogni momento. In questo modo, è possibile trasmettere video in modo performante.

La soluzione che state facendo ora è CMSampleBuffer-> CVPixelBuffer-> CVPixelBuffer-> JPEG-> La conversione dei dati grava seriamente sul processore. Aumenta anche il rischio di perdite di memoria.

Se riesci a capirci qualcosa, vorrei aiutarti. Ho esperienza con l'elaborazione video.

Scusate il mio inglese.

Risposto il 24/05/2020 a 23:59
fonte dall'utente

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