我写了我自己的RTSP推源DirectShow过滤器(CBaseFilter),它像魅力一样适用于H264!但是,当我试图支持MPEG4 (MP4V-ES流)时,我偶然发现了一个问题…我的流被解码(使用ffdshow视频解码器过滤器,或DivX视频解码器),并且完美地呈现了10秒。图片流畅到15 fps,但在10秒后fps急剧下降,只有IVOPs被解码,PVOPs/BVOP被丢弃。即使我收到了它们,并及时将它们发送到解码器。
然后我开始摆弄我的代码,我发现我正确地去除了MPEG4 RTP有效负载,我正确地将媒体样本发送到解码器,并且正确地释放它们,CBaseOutputPin::DecideBufferSize()
也按照它应该做的做了它的工作,我正确地调用IMediaSample::SetTime()
.但是,如果我更改将示例传递给解码器的代码:
hr = videoPin->Deliver(sample);
sample->Release();
使用此代码(请注意第一行)
videoPin->DeliverNewSegment(REFERENCE_TIME(start), REFERENCE_TIME(end), 1.0);
hr = videoPin->Deliver(sample);
sample->Release();
视频10秒及以后流畅(fps停留在15),但图片都是混乱的.就像IVOP并没有像它应该的那样被解码,在场景的静态部分也有一些人工制品。
那么,如何使用CBaseOutputPin::DeliverNewSegment()呢?为什么我需要它?
因为我想我确实需要它,因为它阻止我的视频流不被流畅地解码.
我在谷歌上搜索过,但没有运气。任何帮助都将不胜感激。谢谢。
更新
在方法中,videoPin->DeliverNewSegment(tStart, tStop, dRate)
参数dRate是:
此段应以
速率处理,为原始速率的百分比。
因此,如果我不使用1.0
,而是将100.0
流按预期的方式流动,但是在某些帧之间有一些延迟。但这是迄今为止最好的!
发布于 2011-06-21 17:47:24
我不相信NewSegment会引起你所看到的问题。NewSegment用于您在单个数据包中推送的数据跨越开始时间或停止时间的情况,并且它允许解码器只传递到停止时间。在这种情况下,您可以在流开始时调用NewSegment (0,MAX_LONGLONG,1)一次,应该可以。
如果您看到问题,那么也许您应该检查解码器输出的延迟(比较时间戳和当前流时间)。
G
https://stackoverflow.com/questions/6428729
复制相似问题