Swift使用GPUImage发送压缩视频帧

问题描述 投票:1回答:1

我正在编写一个Swift应用程序,通过网络发送iPhone摄像头的视频输入(帧),以便以后可以在macOS应用程序上显示它们。

目前,我正在从一个iPhone摄像头中抓取视频帧。AVCaputreSession,并得到一个 PixelBuffer 来自 captureOutput 方法,因为每一帧都是巨大的(RAW像素),所以我将其转换为 CVPixelBuffer 以至于 CGImageVTCreateCGImageFromCVPixelBuffer 后来到了一个 UIImage 与JPEG压缩(50%)。然后,我通过网络发送该JPEG,并在Mac OS应用程序上显示它。

正如你所看到的,这是很不理想的,在iPhone 11上运行在〜25 FPS。经过一些研究,我想出了 GPU图像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应用中显示出来。有没有更好的方法来实现整个过程?也许我可以使用iPhone的H264硬件编码,而不是将图像转换为JPEG,但似乎并不是那么简单(而且从我读到的资料来看,GPUImage似乎也有类似的功能)。

任何帮助都是非常感激的,先谢谢了!

ios swift cocoa video-streaming gpuimage
1个回答
0
投票

我知道你想在非网络环境下进行这个操作。

你的项目限制是什么。

  1. 最低帧数?
  2. 最小的视频分辨率?
  3. 是否需要传输声音?
  4. 你的网络环境是什么?
  5. 最低iOS和OSX版本?

除了这些,GPUImage并不是一个适合你的解决方案。如果你要传输视频,每时每刻都要对H264或H265(HEVC)进行编码。这样一来,你就可以以一种性能的方式传输视频。

你现在做的解决方案是CMSampleBuffer-> CVPixelBuffer-> JPEG-> 数据转换严重加重处理器的负担。也增加了内存泄漏的风险。

如果你能告诉我一点,我愿意帮助你。我有视频处理的经验。

对不起,我的英语不好。

© www.soinside.com 2019 - 2024. All rights reserved.