ios - CMSampleBuffer 在 Swift 3 中从纵向旋转到横向

标签 ios cgaffinetransform cifilter ciimage cmsamplebuffer

我在iOS中处理ReplayKit2,由于某些原因我需要将CMSampleBuffer从纵向旋转为横向,我发现结果不正确。

我想念什么?

这是原始样本缓冲区 enter image description here

这是实际的输出缓冲区 enter image description here

width & height are dimensions of sampleBuffer

func rotation(sampleBuffer: CMSampleBuffer, width: Int, height: Int) -> CMSampleBuffer {

        //create pixelbuffer from the delegate method samplebuffer
        let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!

        CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))

        //create CI image from the buffer
        let image = CIImage(cvImageBuffer: pixelBuffer)

        let extent = CGRect(x: 0, y: 0, width: width, height: height)

        var tx = CGAffineTransform(translationX: extent.midX, y: extent.midY)

        tx = tx.rotated(by: CGFloat(Double.pi / 2))

        tx = tx.translatedBy(x: -extent.midX, y: -extent.midY)

        var transformImage = CIFilter(
            name: "CIAffineTransform",
            withInputParameters: [
                kCIInputImageKey: image,
                kCIInputTransformKey: NSValue.init(cgAffineTransform: tx)])!.outputImage!

        //create empty pixelbuffer
        var newPixelBuffer : CVPixelBuffer? = nil

        CVPixelBufferCreate(kCFAllocatorDefault,
                            width,
                            height,
                            kCVPixelFormatType_32BGRA,
                            nil,
                            &newPixelBuffer)
        //render the context to the new pixelbuffer, context is a global
        //CIContext variable. creating a new one each frame is too CPU intensive
        self.ciContext.render(transformImage, to: newPixelBuffer!)

        //finally, write this to the pixelbufferadaptor

        CVPixelBufferUnlockBaseAddress(pixelBuffer,CVPixelBufferLockFlags(rawValue: 0))

        var videoInfo: CMVideoFormatDescription?

        CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, newPixelBuffer!, &videoInfo)

        var sampleTimingInfo = CMSampleTimingInfo(duration: CMSampleBufferGetDuration(sampleBuffer), presentationTimeStamp: CMSampleBufferGetPresentationTimeStamp(sampleBuffer), decodeTimeStamp: CMSampleBufferGetDecodeTimeStamp(sampleBuffer))

        var newSampleBuffer: CMSampleBuffer?

        CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, newPixelBuffer!, true, nil, nil, videoInfo!, &sampleTimingInfo, &newSampleBuffer)

        return newSampleBuffer!

    }

最佳答案

也许会有用

func rotate(_ sampleBuffer: CMSampleBuffer) -> CVPixelBuffer? {
        guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
            return nil
        }
        var newPixelBuffer: CVPixelBuffer?
        let error = CVPixelBufferCreate(kCFAllocatorDefault,
                                        CVPixelBufferGetHeight(pixelBuffer),
                                        CVPixelBufferGetWidth(pixelBuffer),
                                        kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,
                                        nil,
                                        &newPixelBuffer)
        guard error == kCVReturnSuccess else {
            return nil
        }
        let ciImage = CIImage(cvPixelBuffer: pixelBuffer).oriented(.right)
        let context = CIContext(options: nil)
        context.render(ciImage, to: newPixelBuffer!)
        return newPixelBuffer
    }

关于ios - CMSampleBuffer 在 Swift 3 中从纵向旋转到横向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46380189/

相关文章:

ios - iphone 应用程序如何知道其他应用程序?

ios - 如何获得下个月的第1、2、3、4个工作日(工作日)

objective-c - 如何在旋转的 UIView 中使用 CGRectContainsPoint()

ios - 如何在动画过程中动态访问半径? (在 CGAffineTransform 期间可能)

ios - View 在缩小时像素化

swift - 在 CALayer 上使用自定义 CIFilter 显示 CALayer 没有变化

ios - UITabBarController 在通话或个人热点期间被按下?

iphone - UITableView 查找部分标题的位置?

ios - 格式化数据 CIColorCube

objective-c - 如何获得有意义的 CIAreaHistogram 输出?