gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:19:30 26 4
gpt4 key购买 nike

我编写了自己的 RTSP 推送源 DirectShow 过滤器 (CBaseFilter),它非常适合 H264!但是,当我尝试支持 MPEG4(MP4V-ES 流)时,我偶然发现了一个问题……我的流被解码(使用 ffdshow 视频解码器过滤器或 DivX 视频解码器)并完美呈现恰好 10 秒。图片在 15fps 时流畅,但 10 秒后 fps 急剧下降,只有 IVOP 被解码,PVOP/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 是:

Rate at which this segment should be processed, as a percentage of the original rate.

因此,如果我使用 100.0 而不是 1.0,流会按预期流动,但在某些帧之间会有一些延迟。但这是迄今为止最好的!

最佳答案

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

如果您发现问题,那么也许您应该检查解码器输出的延迟(将时间戳与当前流时间进行比较)。

G

关于c++ - 将 MPEG4 视频样本推送到解码器 - 如何使用 CBaseOutputPin::DeliverNewSegment()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6428729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com