【问题标题】:Swift send compressed video frames using GPUImageSwift 使用 GPUImage 发送压缩视频帧
【发布时间】:2020-09-04 12:55:44
【问题描述】:

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

目前,我正在从AVCaputreSession 中获取视频帧,并从captureOutput 方法中获取PixelBuffer。 由于每一帧都很大(原始像素),我将CVPixelBuffer 转换为CGImageVTCreateCGImageFromCVPixelBuffer,然后再转换为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 做了类似的事情)。

任何帮助表示赞赏,在此先感谢!

【问题讨论】:

    标签: ios swift cocoa video-streaming gpuimage


    【解决方案1】:

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

    您的项目限制是什么;

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

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

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

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

    对不起我的英语。

    【讨论】:

    • 嗨!感谢您的答复。关于您的问题: 1. 至少 30 fps 2. 至少 1080 3. 如果我可以传输带音频的视频,那就太棒了。或者至少将它与视频分开发送 4. 这是一个本地环境,所以不用担心。假设带宽非常高 5. 我们可以使用两者的最新版本) 似乎是一件不平凡的事情。
    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多