我像这样实例化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/