Sende raskt komprimerte videorammer ved hjelp av GPUImage

stemmer
1

Jeg skriver en Swift-app som sender en iPhone-kamera videoinngang (rammer) gjennom nettverket, slik at jeg senere kan vise dem på en macOS-app.

For øyeblikket tar jeg tak i videorammer fra en AVCaputreSession , og få en PixelBuffer fra captureOutput metode. Siden hver ramme er enorm (RAW-piksler) konverterer jeg CVPixelBuffer det til a CGImage med VTCreateCGImageFromCVPixelBuffer og senere til a UIImage med JPEG-komprimering (50%). Jeg sender deretter den JPEG gjennom nettverket og viser den på Mac OS-appen.

Som du kan se er dette langt fra ideelt og kjører ved ~ 25 FPS på en iPhone 11. Etter litt research kom jeg frem til GPU Image 2 . Det ser ut til at jeg kunne hente dataene fra kameraet og bruke noe slikt (slik at transformasjonen gjøres i 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

Og jeg burde være i stand til å overføre den UIImage og vise den på macOS-appen. Er det en bedre måte å implementere hele prosessen? Kanskje jeg kunne bruke iPhones H264-maskinvarekoding i stedet for å konvertere bilder til JPEG, men det ser ut til at det ikke er så greit (og det ser ut til at GPUImage gjør noe sånt fra det jeg leste).

All hjelp blir verdsatt, på forhånd takk!

Publisert på 18/05/2020 klokken 18:35
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Jeg forstår at du vil gjøre denne operasjonen i et miljø som ikke er på internett.

Hva er dine prosjektbegrensninger;

  1. Minimum fps?
  2. Minimum videooppløsning?
  3. Bør lyd overføres?
  4. Hva er nettverksmiljøet ditt?
  5. Minimum iOS- og OSX-versjon?

Bortsett fra disse er GPUImage ikke en passende løsning for deg. Hvis du skal overføre videoer, må du kode H264 eller H265 (HEVC) i hvert øyeblikk. På denne måten kan du overføre video på en ytelses måte.

Løsningen du gjør nå er CMSampleBuffer-> CVPixelBuffer-> JPEG-> Datakonvertering belaster prosessoren alvorlig. Det øker også risikoen for minnelekkasje.

Hvis du kan fortelle litt, vil jeg hjelpe. Jeg har erfaring med videobehandling.

Unnskyld for engelsken min.

Svarte 24/05/2020 kl. 23:59
kilden bruker

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