Swift trimite cadre video comprimate folosind GPUImage

voturi
1

Scriu o aplicație Swift care trimite o intrare video a camerei iPhone (cadre) prin rețea, astfel încât să le pot afișa ulterior într-o aplicație macOS.

În prezent, prind cadre video de la un AVCaputreSession , și obțineți un PixelBuffer de la captureOutput metodă. Deoarece fiecare cadru este imens (pixeli RAW), convertesc versiunea CVPixelBuffer asta la un CGImage cu VTCreateCGImageFromCVPixelBuffer iar mai târziu la a UIImage cu compresie JPEG (50%). Apoi trimit acel JPEG prin rețea și îl afișez în aplicația Mac OS.

După cum vedeți, acest lucru este departe de a fi ideal și rulează la ~ 25 FPS pe un iPhone 11. După câteva cercetări, am venit cu GPU Image 2 . Se pare că aș putea obține datele de la aparatul foto și să aplic ceva de genul (astfel încât transformarea se face în 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

Și ar trebui să pot să transmit acea UIImage și să o afișez în aplicația macOS. Există o modalitate mai bună de a implementa acest întreg proces? Poate aș folosi codul hardware H264 al iPhone-ului în loc să convertesc imagini în JPEG, dar se pare că nu este chiar atât de simplu (și se pare că GPUImage face ceva de genul din ceea ce am citit).

Orice ajutor este apreciat, mulțumesc în avans!

Întrebat 18/05/2020 la 18:35
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Am înțeles că doriți să faceți această operațiune într-un mediu non-internet.

Care sunt constrângerile proiectului;

  1. Fps minim?
  2. Rezoluție video minimă?
  3. Sunetul trebuie transmis?
  4. Care este mediul dvs. de rețea?
  5. Versiunea minimă pentru iOS și OSX?

În afară de acestea, GPUImage nu este o soluție potrivită pentru tine. Dacă doriți să transferați videoclipuri, trebuie să codificați H264 sau H265 (HEVC) în fiecare moment. În acest fel, puteți transmite video într-un mod performant.

Soluția pe care o faceți acum este CMSampleBuffer-> CVPixelBuffer-> JPEG-> Conversia datelor încărcă grav procesorul. De asemenea, crește riscul de scurgere a memoriei.

Dacă puteți spune puțin, aș dori să vă ajut. Am experiență în procesarea video.

Scuze pentru engleza mea.

Publicat 24/05/2020 la 23:59
sursa de către utilizator

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