【问题标题】:media foundation H264 decoder not working properly媒体基础 H264 解码器无法正常工作
【发布时间】:2014-09-03 20:34:48
【问题描述】:

我正在使用媒体基础创建视频会议应用程序,但在解码通过网络接收的 H264 视频帧时遇到问题。

设计

目前我的网络源在每个请求样本上排队一个令牌,除非有可用的存储样本。如果样本通过网络到达并且没有可用的令牌,则样本将存储在链表中。否则,它将与 MEMediaSample 事件一起排队。我还将解码器设置为低延迟。

我的问题

当使用我的网络源运行拓扑时,我会立即看到第一帧渲染到屏幕上。然后我会经历一段长时间的停顿,直到直播开始完美播放。几秒钟后,流似乎暂停了,但随后您注意到它只是一遍又一遍地循环通过同一帧,每隔几秒钟添加一个实时帧,然后立即消失并返回显示旧循环。

为什么会这样?我绝不是 H264 或媒体基金会方面的专家,但是,我已经尝试解决这个问题好几个星期了,但没有成功。我不知道问题可能出在哪里。请帮我!

时间戳是通过从 0 开始并为每个新样本添加持续时间来创建的。其他数据从 IMFSampleGrabberSinkCallback 中检索。

我还将我的一些 MFTrace 发布到 msdn 媒体基金会论坛 Link

我在那里提到,演示时钟似乎在跟踪上没有改变,但我不确定这是否是原因或如何解决它。

【问题讨论】:

    标签: c++ video decode h.264 ms-media-foundation


    【解决方案1】:

    编辑: 你能分享这个问题的视频和完整的 mftrace 日志吗?我不清楚到底发生了什么:一段时间后你会看到现场视频吗?

    当前日志不包含足够的信息来跟踪样本处理。根据您的描述,看起来只有关键帧被渲染。另外,渲染关键帧的持续时间很奇怪:

        Sample @00A74970, Time 6733ms, Duration 499ms. <- Duration is not 33ms.
    

    我想看看那个样本发生了什么。

    无论如何,如果您使用的是标准编码器和解码器,则问题应该出在您的媒体源以及它如何缓冲帧。不正确的循环缓冲区实现?在开始将它们提供给解码器之前,您可能需要尝试缓存一到两个样本。

    【讨论】:

    • 我已经更新了我的帖子以显示我的一些代码。如果还不够,请告诉我,我会添加其他内容。感谢您的回复!
    • 我的源旨在成为一个实时网络源(试图制作一个视频会议应用程序),所以我尝试了两种不同的实现。从网络数据创建样本后,我要么立即将 MEMediaSample 事件与样本一起排队,要么尝试另一种实现来检查我是否收到了样本请求,如果没有,它将样本加载到CInterfacelist 将在下一个请求中使用(我认为这种情况不会发生,因为流似乎是无速率的)。无论如何,我都会遇到同样的问题。我会尽快上传完整的跟踪日志。
    • 一时兴起,我将来源的特征更改为不再包含 MFMEDIASOURCE_IS_LIVE。它现在工作正常。这让我大吃一惊。你知道它为什么会因为这个特性而采取这种方式吗?
    • 如果 MFMEDIASOURCE_IS_LIVE,MF 将使用实时演示时钟,并丢弃任何迟到的样本。提前缓冲一些样本将有助于确保在播放开始时不会出现后期样本丢失。
    • 我已经解决了 msdn 上的问题。谢谢你的帮助!我真的很感激!
    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多