Schnelles Senden komprimierter Video-Frames mit GPUImage

stimmen
1

Ich schreibe eine Swift-App, die die Videoeingabe (Einzelbilder) einer iPhone-Kamera über das Netzwerk sendet, so dass ich sie später in einer MacOS-App anzeigen kann.

Zurzeit ziehe ich Videobilder von einem AVCaputreSession, und erhalte ein PixelBuffervon der captureOutputMethode. Da jedes Bild riesig ist (RAW-Pixel), konvertiere ich das CVPixelBufferin ein CGImagemit VTCreateCGImageFromCVPixelBufferund später in ein UIImagemit JPEG-Komprimierung (50%). Dann sende ich dieses JPEG über das Netzwerk und zeige es in der Mac OS-Anwendung an.

Wie Sie sehen können, ist dies alles andere als ideal und läuft mit ~25 FPS auf einem iPhone 11. Nach einigen Recherchen bin ich auf GPU Image 2 gekommen. Es sieht so aus, als könnte ich die Daten von der Kamera holen und so etwas wie dieses anwenden (so dass die Umwandlung in GPU erfolgt):

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

Und ich sollte in der Lage sein, dieses UIImage zu übertragen und in der MacOS-App anzuzeigen. Gibt es einen besseren Weg, diesen ganzen Prozess zu implementieren? Vielleicht könnte ich die H264-Hardware-Kodierung des iPhones verwenden, anstatt Bilder in JPEG umzuwandeln, aber es scheint nicht so einfach zu sein (und es scheint, dass GPUImage so etwas macht, von dem was ich gelesen habe).

Jede Hilfe ist willkommen, danke im Voraus!

Veröffentlicht am 18/05/2020 um 18:35
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Ich verstehe, dass Sie diese Operation in einer Nicht-Internet-Umgebung durchführen wollen.

Welches sind die Einschränkungen Ihres Projekts?

  1. Minimale fps?
  2. Wie hoch ist die minimale Videoauflösung?
  3. Soll Ton übertragen werden?
  4. Wie sieht Ihre Netzwerkumgebung aus?
  5. Minimale iOS- und OSX-Version?

Abgesehen davon ist GPUImage keine geeignete Lösung für Sie. Wenn Sie Videos übertragen wollen, müssen Sie in jedem Moment H264 oder H265 (HEVC) kodieren. Auf diese Weise können Sie Videos auf performante Weise übertragen.

Die Lösung, die Sie jetzt suchen, ist CMSampleBuffer-> CVPixelBuffer-> JPEG-> Datenkonvertierung, die den Prozessor ernsthaft belastet. Sie erhöht auch das Risiko von Speicherlecks.

Wenn Sie ein bisschen erzählen können, würde ich gerne helfen. Ich habe Erfahrung mit der Videoverarbeitung.

Entschuldigung für mein Englisch.

Beantwortet am 24/05/2020 um 23:59
quelle vom benutzer

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