我正在编写一个 Swift 应用程序,它通过网络发送 iPhone 摄像头视频输入(帧),以便稍后可以在 macOS 应用程序上显示它们。
目前,我从 AVCaputreSession
抓取视频帧,并从 captureOutput
方法获取 PixelBuffer
。
由于每一帧都很大(RAW像素),我将使用VTCreateCGImageFromCVPixelBuffer
将CVPixelBuffer
转换为CGImage
,然后再将其转换为UIImage
采用 JPEG 压缩 (50%)。然后,我通过网络发送该 JPEG 并将其显示在 Mac OS 应用程序上。
如您所见,这远非理想,在 iPhone 11 上的运行速度约为 25 FPS。经过一番研究,我得出了 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 应用程序上。有没有更好的方法来实现这整个过程?也许我可以使用 iPhone 的 H264 硬件编码而不是将图像转换为 JPEG,但似乎并没有那么简单(从我读到的内容来看,GPUImage 似乎做了类似的事情)。
感谢任何帮助,提前致谢!
最佳答案
我了解到您希望在非互联网环境中执行此操作。
您的项目有哪些限制;
- 最低 fps?
- 最低视频分辨率?
- 应该传输声音吗?
- 您的网络环境是什么?
- 最低 iOS 和 OSX 版本?
除此之外,GPUImage 并不是适合您的解决方案。如果您要传输视频,则必须随时对 H264 或 H265 (HEVC) 进行编码。这样就可以以性能的方式传输视频了。
您现在正在做的解决方案是CMSampleBuffer-> CVPixelBuffer-> JPEG->数据转换严重加重了处理器的负担。它还增加了内存泄漏的风险。
如果你能告诉我一点,我很乐意帮忙。我有视频处理经验。
抱歉我的英语不好。
关于ios - Swift 使用 GPUImage 发送压缩视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61874458/