Szybkie wysyłanie skompresowanych klatek wideo za pomocą GPUImage

głosy
1

Piszę aplikację Swift, która wysyła przez sieć wejście wideo (ramki) z kamery iPhone'a, dzięki czemu mogę je później wyświetlić w aplikacji na system MacOS.

Obecnie, chwytam ramki wideo z AVCaputreSession, i uzyskać PixelBufferod captureOutputmetody. Ponieważ każda ramka jest ogromna (piksele RAW) I jestem konwertowania, CVPixelBufferże CGImagez VTCreateCGImageFromCVPixelBufferi później do UIImagez kompresji JPEG (50%). Następnie wysyłam ten JPEG przez sieć i wyświetlam go w aplikacji Mac OS.

Jak widać, jest to dalekie od ideału i działa na ~25 FPS na iPhone 11. Po kilku badaniach, wymyśliłem GPU Image 2. Wydaje się, że mogłem uzyskać dane z aparatu i zastosować coś takiego (tak, że transformacja odbywa się w 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 powinienem być w stanie przesłać ten UIImage i wyświetlić go w aplikacji na MacOS. Czy istnieje lepszy sposób na zaimplementowanie tego całego procesu? Może mógłbym użyć sprzętowego kodowania iPhone'a H264 zamiast konwertować obrazy do JPEG, ale wydaje się, że nie jest to takie proste (i wydaje się, że GPUImage robi coś takiego z tego co przeczytałem).

Każda pomoc jest doceniana, dziękuję z góry!

Utwórz 18/05/2020 o 18:35
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Rozumiem, że chce pan przeprowadzić tę operację w środowisku nieinternetowym.

Jakie są ograniczenia twojego projektu;

  1. Minimum fps?
  2. Minimalna rozdzielczość wideo?
  3. Czy dźwięk powinien być transmitowany?
  4. Jakie jest twoje środowisko sieciowe?
  5. Minimalna wersja iOS i OSX?

Poza tym, GPUImage nie jest odpowiednim rozwiązaniem dla Ciebie. Jeśli zamierzasz przesyłać filmy, musisz w każdej chwili zakodować H264 lub H265 (HEVC). W ten sposób możesz transmitować wideo w sposób wydajny.

Rozwiązanie, które teraz robisz to CMSampleBuffer-> CVPixelBuffer-> JPEG-> Konwersja danych poważnie obciąża procesor. Zwiększa to również ryzyko wycieku pamięci.

Jeśli możesz trochę powiedzieć, chciałbym pomóc. Mam doświadczenie w obróbce wideo.

Przepraszam za mój angielski.

Odpowiedział 24/05/2020 o 23:59
źródło użytkownik

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