Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将MPEG4视频样本推送到解码器-如何使用CBaseOutputPin::DeliverNewSegment()?_C++_Filter_Directshow_Rtsp_Mpeg 4 - Fatal编程技术网

C++ 将MPEG4视频样本推送到解码器-如何使用CBaseOutputPin::DeliverNewSegment()?

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

我编写了自己的RTSP推送源代码DirectShow过滤器(CBaseFilter),该过滤器非常适合H264!但是,当我试图支持MPEG4(MP4V-ES流)时,我偶然发现了一个问题。。。我的流被解码(使用ffdshow视频解码器过滤器或DivX视频解码器),并在整整10秒钟内完美呈现。图片以15fps的速度流畅,但10秒后fps急剧下降,只有IVOPs被解码,PVOPs/BVOPs被丢弃。。。即使我收到了它们,并按时将它们发送给解码器

然后我开始摆弄我的代码,我发现我正确地卸下了MPEG4 RTP有效负载的包装,我正确地将媒体样本发送到解码器,并正确地释放它们,而且
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();