C++ 将MPEG4视频样本推送到解码器-如何使用CBaseOutputPin::DeliverNewSegment()?
我编写了自己的RTSP推送源代码DirectShow过滤器(CBaseFilter),该过滤器非常适合H264!但是,当我试图支持MPEG4(MP4V-ES流)时,我偶然发现了一个问题。。。我的流被解码(使用ffdshow视频解码器过滤器或DivX视频解码器),并在整整10秒钟内完美呈现。图片以15fps的速度流畅,但10秒后fps急剧下降,只有IVOPs被解码,PVOPs/BVOPs被丢弃。。。即使我收到了它们,并按时将它们发送给解码器 然后我开始摆弄我的代码,我发现我正确地卸下了MPEG4 RTP有效负载的包装,我正确地将媒体样本发送到解码器,并正确地释放它们,而且C++ 将MPEG4视频样本推送到解码器-如何使用CBaseOutputPin::DeliverNewSegment()?,c++,filter,directshow,rtsp,mpeg-4,C++,Filter,Directshow,Rtsp,Mpeg 4,我编写了自己的RTSP推送源代码DirectShow过滤器(CBaseFilter),该过滤器非常适合H264!但是,当我试图支持MPEG4(MP4V-ES流)时,我偶然发现了一个问题。。。我的流被解码(使用ffdshow视频解码器过滤器或DivX视频解码器),并在整整10秒钟内完美呈现。图片以15fps的速度流畅,但10秒后fps急剧下降,只有IVOPs被解码,PVOPs/BVOPs被丢弃。。。即使我收到了它们,并按时将它们发送给解码器 然后我开始摆弄我的代码,我发现我正确地卸下了MPEG4
CBaseOutputPin::DecideBufferSize()
做了它应该做的工作,我正确地调用了imediSample::SetTime()
。。。但是,如果我更改了向解码器发送样本的代码:
hr = videoPin->Deliver(sample);
sample->Release();
使用此代码(请注意第一行):
视频在10秒后流畅(fps保持在15),但画面却乱七八糟。。。IVOP并没有像它应该的那样被解码,在场景的静态部分有一些人工制品
那么,如何使用CBaseOutputPin::DeliverNewSegment()?我为什么需要它?
因为我想我确实需要它,因为它阻止了我的视频流不能被流畅地解码
我在谷歌上搜索,但运气不好。
任何帮助都将不胜感激。塔克斯
更新
在方法videoPin->DeliverNewSegment(tStart、tStop、dRate)
中,参数dRate为:
应处理此段的速率,为原始速率的百分比
所以,如果不是
1.0
I,而是100.0
流按预期流动,但在某些帧之间有一些延迟。但这是迄今为止最好的 我不相信新闻节会导致您看到的问题。NewSegment用于您在单个数据包中推送的数据跨越开始时间或停止时间的情况,并且它允许解码器仅传送到停止时间。在这种情况下,您可以在流媒体开始时调用NewSegment(0,MAX_LONGLONG,1)一次,这样就可以了
如果您看到问题,那么您可能应该检查解码器输出的延迟(将时间戳与当前流时间进行比较)
G在此
交付段(0,(无符号长)(-1),1)之后,
我只得到黑色图片。我需要在PVOPs/BVOPs上打电话吗?“段”到底是什么?(基于我问题中的更新)-你的代码是说解码器应该以原始速率的1%复制新段…我认为你关于百分比的说法不正确<代码>1.0是必须存在的,从基类源代码中可以清楚地看出,m_dRate(1.0)
在CBasePin
构造函数中。另一件事是,你可能正在处理一个错误的过滤器,它反过来会错误地解释这一点。。。我将检查过滤器。
videoPin->DeliverNewSegment(REFERENCE_TIME(start), REFERENCE_TIME(end), 1.0);
hr = videoPin->Deliver(sample);
sample->Release();