我像这样实例化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)
或宽度。当iPhone的摄像头(横向或纵向)始终高度= 1280宽度= 720拍摄视频时,始终返回1280x720。即使是4k视频也是如此。如果加载来自instagram的方形视频或从互联网下载的任何其他视频(不是直接用相机应用程序直接创建),则在分辨率小于720p时会正确打印宽度和高度。但是不同的分辨率,例如。 1008x1792将抛出CVPixelBufferGetHeight(pixelBuffer)= 1280
用相机拍摄的视频...它总是会产生较低的分辨率。我尝试了4k和1080设置(您可以在iOS设置>相机中进行更改)。仍然..即使在1080中,我也会获得1280x720像素的缓冲区。
答案 0 :(得分:1)
我发现我使用的UIPickerController设置为默认将所选视频从库转码为“中”设置。在这种情况下是1280x720
我最终更改了选择器的此属性
picker.videoQuality = .typeHigh
picker.videoExportPreset = AVAssetExportPresetHighestQuality
实际上进行更改的属性是videoExportPreset
,我不知道它做什么的,即使文档指定它是用于录制视频 OR 的,选择一个视频。