2

我一直在努力解决 AVSampleBufferDisplayLayer 的动作非常不稳定。当我的直播流中有运动时,它会像素化并半冻结,同时显示多个帧。但是,一旦我添加了以下代码,一切都解决了:

VTDecodeFrameFlags flags = kVTDecodeFrame_EnableAsynchronousDecompression 
| kVTDecodeFrame_EnableTemporalProcessing;
VTDecodeInfoFlags flagOut;
VTDecompressionSessionDecodeFrame(decompressionSession, sampleBuffer, flags,
(void*)CFBridgingRetain(NULL), &flagOut);

请注意,我之前确实创建了解压会话,但实际上我并没有在回调中做任何事情。我仍在调用 enqueueSampleBuffer: 在 AVSampleBufferDisplayLayer 上,这就是视频在屏幕上的显示方式。

您是否必须为 AVSampleBufferDisplayLayer 调用 VTDecompressionSessionDecodeFrame 才能正确显示?我认为 AVSampleBufferDisplayLayerr 会在内部使用 VTDecompressionSessionDecodeFrame。这是因为在 iOS 模拟器上吗?

4

2 回答 2

1

当然你可以一起使用,在这种情况下VTDecompressionSessionDecodeFrame仅用于解码,AVSampleBufferDisplayLayer仅用于显示VTDecompressionSessionDecodeFrame的输出(CVPixelBufferRef,在将其排入AVSampleBufferDisplayLayer之前应将其转换为CMSampleBufferRef)。

于 2016-07-07T09:41:06.610 回答
1

AVSampleBufferDisplayLayer 和 VTDecompressionSession 是两个不同的东西,尽管 AVSampleBufferDisplayLayer 可能在后台使用 VTDecompressionSession(我不知道)。您不要一起使用它们,它是 VTDecompressionSession 低于 AVSampleBufferDisplayLayer 的一个或另一个。您不应该也不应该调用 VTDecompressionSessionDecodeFrame() 来使用 AVSampleDisplayLayer enqueueSampleBuffer()。

根据您的描述,听起来您的 PTS(演示时间戳)存在时间问题。确保正确设置时基。

请参阅此处:设置 AVSampleBufferDisplayLayer 呈现样本缓冲区的速率

此外,请确保您以编码器顺序(它们从编码器中出来的顺序)馈送 AVSampleBufferDisplayLayer 帧,而不是显示顺序。

最后,确保您没有在网络上的某个地方丢弃数据包,尤其是在您使用 UDP 的情况下。

于 2016-02-16T14:53:45.707 回答