Быстрая отправка сжатых видео кадров с помощью GPUImage

голоса
1

Я пишу приложение Swift, которое отправляет по сети видеовход (кадры) с камеры iPhone, так что позже я могу отобразить их в приложении для MacOS.

В настоящее время я беру видео кадры изAVCaputreSession, и получаю PixelBufferот captureOutputметода. Так как каждый кадр огромен (RAW пикселей) я преобразовываю CVPixelBufferего в a CGImageс, VTCreateCGImageFromCVPixelBufferа затем в a UIImageс JPEG сжатием (50%). Затем я отправляю, что JPEG по сети и отображать его на Mac OS app.

Как видите, это далеко не идеально и работает на скорости ~25 FPS на iPhone 11. После некоторых исследований я придумал GPU Image 2. Похоже, что я смог получить данные с камеры и применить что-то подобное (чтобы трансформация была выполнена на 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

И я смогу передать этот UIImage и отобразить его в приложении для MacOS. Есть ли лучший способ реализовать весь этот процесс? Может быть, я мог бы использовать аппаратное кодирование H264 для iPhone вместо преобразования изображений в JPEG, но кажется, что это не так просто (и кажется, что GPUImage делает что-то подобное из того, что я прочитал).

Любая помощь приветствуется, заранее спасибо!

Задан 18/05/2020 в 18:35
источник пользователем
На других языках...                            


1 ответов

голоса
0

Я понимаю, что вы хотите выполнять эту операцию в несетевом окружении.

Каковы ограничения вашего проекта;

  1. Минимальный fps?
  2. Минимальное разрешение видео?
  3. Должен ли передаваться звук?
  4. Что такое ваше сетевое окружение?
  5. Минимальная версия для iOS и OSX?

Кроме того, GPUImage не является подходящим решением для Вас. Если вы собираетесь передавать видео, вам необходимо кодировать H264 или H265 (HEVC) в каждый момент времени. Таким образом, вы можете передавать видео с высокой производительностью.

Решение, которое вы сейчас делаете, это CMSampleBuffer-> CVPixelBuffer-> JPEG-> Преобразование данных, которое серьезно нагружает процессор. Это также увеличивает риск утечки памяти.

Если вы можете сказать немного, я бы хотел помочь. У меня есть опыт работы с видео.

Простите за мой английский.

Ответил 24/05/2020 в 23:59
источник пользователем

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