ios - Swift 使用 GPUImage 发送压缩视频帧

标签 ios swift cocoa video-streaming gpuimage

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

目前,我从 AVCaputreSession 抓取视频帧,并从 captureOutput 方法获取 PixelBuffer。 由于每一帧都很大(RAW像素),我将使用VTCreateCGImageFromCVPixelBufferCVPixelBuffer转换为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 似乎做了类似的事情)。

感谢任何帮助,提前致谢!

最佳答案

我了解到您希望在非互联网环境中执行此操作。

您的项目有哪些限制;

  1. 最低 fps?
  2. 最低视频分辨率?
  3. 应该传输声音吗?
  4. 您的网络环境是什么?
  5. 最低 iOS 和 OSX 版本?

除此之外,GPUImage 并不是适合您的解决方案。如果您要传输视频,则必须随时对 H264 或 H265 (HEVC) 进行编码。这样就可以以性能的方式传输视频了。

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

如果你能告诉我一点,我很乐意帮忙。我有视频处理经验。

抱歉我的英语不好。

关于ios - Swift 使用 GPUImage 发送压缩视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61874458/

相关文章:

ios - UIView.mask 设置颜色

ios - NSURL 无法在 Web View 中加载 -9824

objective-c - 获取 NSWindow 的所有 View 和 subview

ios - PDFview 在单页文档中滚动到页面底部

objective-c - OS X 中的 NSDataWritingFileProtectionComplete

ios - Xcode setNavigationBarHidden 向上移动 View

ios - 如何在传递给另一个类的 WKWebView 上使用 didFinish 导航

ios - 使用 Swift 创建一个带 N 项的类型化数组

swift - 我怎样才能在 cocoa (OS X) 中以编程方式自定义工具提示?

SwiftUI ForEach "Unable to infer complex closure return type; add explicit type to disambiguate"