CVPixelBuffer rotate a video after saving

57 Views Asked by At

I am recording a video using CVPixelBuffer. Recording works well but at the time of saving video rotates.

You can see in below video that recording is in vertical mode but upon saving video gets rotated!

https://drive.google.com/file/d/10hvDu_3LOIaiD-5G4xhG1tZj4jCOxL72/view?usp=sharing

I tried below method to correct orientation of CVPixelBuffer but it stores black a video.

func rotatePixelBuffer(_ pixelBuffer: CVPixelBuffer, degrees: Int) -> CVPixelBuffer? {
        let image = CIImage(cvPixelBuffer: pixelBuffer)
        let rotationTransform = CGAffineTransform(rotationAngle: CGFloat(degrees) * CGFloat.pi / 180)
        let rotatedImage = image.transformed(by: rotationTransform)

        return createPixelBuffer(from: rotatedImage)
    }
    

    func createPixelBuffer(from ciImage: CIImage) -> CVPixelBuffer? {
        let attributes: [String: Any] = [
            kCVPixelBufferCGImageCompatibilityKey as String: true,
            kCVPixelBufferCGBitmapContextCompatibilityKey as String: true
        ]

        var pixelBuffer: CVPixelBuffer?
        let status = CVPixelBufferCreate(
            kCFAllocatorDefault,
            Int(ciImage.extent.size.height),
            Int(ciImage.extent.size.width),
            kCVPixelFormatType_32BGRA,
            attributes as CFDictionary,
            &pixelBuffer
        )

        guard status == kCVReturnSuccess, let unwrappedPixelBuffer = pixelBuffer else {
            return nil
        }

        CVPixelBufferLockBaseAddress(unwrappedPixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
        let context = CIContext()
        context.render(ciImage, to: unwrappedPixelBuffer)

        CVPixelBufferUnlockBaseAddress(unwrappedPixelBuffer, CVPixelBufferLockFlags(rawValue: 0))

        return unwrappedPixelBuffer
    }
1

There are 1 best solutions below

1
Hao Liang On

this create cvpixelbuffer api is CVPixelBufferCreate( CFAllocatorRef CV_NULLABLE allocator, size_t width, size_t height, but you use Int(ciImage.extent.size.height) and Int(ciImage.extent.size.width)?