AVampleBufferDisplayLayer未显示CMSampleBuffer

时间:2018-03-19 09:39:45

标签: swift avfoundation h.264

我正在开发的项目采用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)
}

谢谢!

1 个答案:

答案 0 :(得分:0)

用户想出了办法,并发布了该解决方案的链接作为对该问题的评论。链接已断开, here is the updated link to solution