我正在编写一个Swift应用程序,通过网络发送iPhone摄像头的视频输入(帧),以便以后可以在macOS应用程序上显示它们。
目前,我正在从一个iPhone摄像头中抓取视频帧。AVCaputreSession
,并得到一个 PixelBuffer
来自 captureOutput
方法,因为每一帧都是巨大的(RAW像素),所以我将其转换为 CVPixelBuffer
以至于 CGImage
与 VTCreateCGImageFromCVPixelBuffer
后来到了一个 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似乎也有类似的功能)。
任何帮助都是非常感激的,先谢谢了!
我知道你想在非网络环境下进行这个操作。
你的项目限制是什么。
除了这些,GPUImage并不是一个适合你的解决方案。如果你要传输视频,每时每刻都要对H264或H265(HEVC)进行编码。这样一来,你就可以以一种性能的方式传输视频。
你现在做的解决方案是CMSampleBuffer-> CVPixelBuffer-> JPEG-> 数据转换严重加重处理器的负担。也增加了内存泄漏的风险。
如果你能告诉我一点,我愿意帮助你。我有视频处理的经验。
对不起,我的英语不好。