首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将MPEG4视频示例推送到解码器-如何使用CBaseOutputPin::DeliverNewSegment()?

将MPEG4视频示例推送到解码器-如何使用CBaseOutputPin::DeliverNewSegment()?
EN

Stack Overflow用户
提问于 2011-06-21 16:26:14
回答 1查看 778关注 0票数 0

我写了我自己的RTSP推源DirectShow过滤器(CBaseFilter),它像魅力一样适用于H264!但是,当我试图支持MPEG4 (MP4V-ES流)时,我偶然发现了一个问题…我的流被解码(使用ffdshow视频解码器过滤器,或DivX视频解码器),并且完美地呈现了10秒。图片流畅到15 fps,但在10秒后fps急剧下降,只有IVOPs被解码,PVOPs/BVOP被丢弃。即使我收到了它们,并及时将它们发送到解码器。

然后我开始摆弄我的代码,我发现我正确地去除了MPEG4 RTP有效负载,我正确地将媒体样本发送到解码器,并且正确地释放它们,CBaseOutputPin::DecideBufferSize()也按照它应该做的做了它的工作,我正确地调用IMediaSample::SetTime() .但是,如果我更改将示例传递给解码器的代码:

代码语言:javascript
运行
复制
hr = videoPin->Deliver(sample);
sample->Release();

使用此代码(请注意第一行)

代码语言:javascript
运行
复制
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流按预期的方式流动,但是在某些帧之间有一些延迟。但这是迄今为止最好的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-21 17:47:24

我不相信NewSegment会引起你所看到的问题。NewSegment用于您在单个数据包中推送的数据跨越开始时间或停止时间的情况,并且它允许解码器只传递到停止时间。在这种情况下,您可以在流开始时调用NewSegment (0,MAX_LONGLONG,1)一次,应该可以。

如果您看到问题,那么也许您应该检查解码器输出的延迟(比较时间戳和当前流时间)。

G

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6428729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档