我像这样实例化AVPlayerItemVideoOutput:

let videoOutput = AVPlayerItemVideoOutput(pixelBufferAttributes: [String(kCVPixelBufferPixelFormatTypeKey): NSNumber(value: kCVPixelFormatType_32BGRA)])

并像这样检索pixelBuffers:
@objc func displayLinkDidRefresh(link: CADisplayLink) {
        let itemTime = videoOutput.itemTime(forHostTime: CACurrentMediaTime())

        if videoOutput.hasNewPixelBuffer(forItemTime: itemTime) {
            if let pixelBuffer = videoOutput.copyPixelBuffer(forItemTime: itemTime, itemTimeForDisplay: nil) {

            }
        }
    }

但是由于某种原因CVPixelBufferGetHeight(pixelBuffer)或Width。当iPhone的摄像头(横向或纵向)始终高度= 1280宽度= 720拍摄视频时,始终返回1280x720。即使是4k视频也是如此。如果我从instagram加载方形视频或从互联网下载的任何其他视频(不是直接用相机应用程序直接创建)加载,则当分辨率小于720p时,宽度和高度会正确打印。但是不同的分辨率,例如。 1008x1792将抛出CVPixelBufferGetHeight(pixelBuffer)= 1280

用相机拍摄的视频...它总是会产生较低的分辨率。我尝试了4k和1080设置(您可以在iOS设置>相机中进行更改)。仍然..即使在1080中,我也会获得1280x720像素的缓冲区。

最佳答案

我发现我正在使用的UIPickerController设置为默认将所选视频从库转码为“中”设置。在这种情况下是1280x720

我最终更改了选择器的此属性

picker.videoQuality = .typeHigh
picker.videoExportPreset =  AVAssetExportPresetHighestQuality

尽管实际上进行更改的属性是videoExportPreset,但我不知道它的作用,即使文档指定了它是录制视频还是选择视频时使用的。

关于ios - AVPlayerItemVideoOutput copyPixelBuffer始终返回1280x720,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53716000/

10-10 14:43