我编写了自己的RTSP Push Source DirectShow过滤器(CBaseFilter),适用于H264就像一个魅力!但是,当我试图支持MPEG4(MP4V-ES流)时,我偶然发现了一个问题...我的流被解码(使用ffdshow视频解码器滤波器或DivX视频解码器)并完美渲染10秒钟。图片流畅度为15fps,但是10秒后fps急剧下降,只有IVOP被解码,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()?为什么我需要它呢?
因为我猜我确实需要它,因为它阻止我的视频流不能被流利地解码......
我用Google搜索,但没有运气。 任何帮助将不胜感激。感谢名单。方法videoPin->DeliverNewSegment(tStart, tStop, dRate)
参数 dRate 为:
应处理此细分的比率,作为原始比率的百分比。
因此,如果不是1.0
我放置100.0
流正如预期的那样流动,但在某些帧之间有一些延迟。但到目前为止这是最好的!
答案 0 :(得分:1)
我不相信NewSegment会导致您遇到的问题。 NewSegment用于那些您在单个数据包中推送的数据超过开始时间或停止时间的情况,并且它允许解码器仅提供到停止时间。在这种情况下,您可以在流式传输开始时调用NewSegment(0,MAX_LONGLONG,1),它应该没问题。
如果您发现问题,那么您可能应该检查解码器输出的延迟(将时间戳与当前流时间进行比较)。