我正在开发的项目采用h264编码的比特流并显示视频帧。
解码器 - 它接收原始字节并输出包含视频帧的CMSampleBuffer - 运行良好。它的formatDescription包含期望值,它正确地解释了NALU类型,所有这些。我可能错了,因为这是我第一次使用所有这些,所以如果有人怀疑问题可能在解码器中,我很乐意提供代码。
当我将CMSampleBuffer传递给AVSampleBufferDisplayLayer时出现问题。视频帧不会出现在屏幕上。
这是应该显示视频帧的功能:
func videoFrameReceived(_ frame: CMSampleBuffer) {
videoLayer.enqueue(frame)
DispatchQueue.main.async { [weak self] in
self?.videoLayer.setNeedsDisplay()
}
}
这是我初始化AVSampleBufferDisplayLayer的方式:
if let layer = videoLayer {
layer.frame = CGRect(x: 0, y: 150, width: 640, height: 480)
layer.videoGravity = .resizeAspect
let cmTimebasePointer = UnsafeMutablePointer<CMTimebase?>.allocate(capacity: 1)
let status = CMTimebaseCreateWithMasterClock(kCFAllocatorDefault, CMClockGetHostTimeClock(), cmTimebasePointer)
layer.controlTimebase = cmTimebasePointer.pointee
if let controlTimeBase = layer.controlTimebase, status == noErr {
CMTimebaseSetTime(controlTimeBase, kCMTimeZero)
CMTimebaseSetRate(controlTimeBase, 1.0)
}
self.layer.addSublayer(layer)
}
谢谢!