使用 DMO 媒体缓冲区

输入数据使用媒体缓冲区传递到编解码器 DSO。 媒体缓冲区是实现 IMediaBuffer 接口的对象。 为此,你可以实现类,或者,如果你在应用程序中使用 Windows Media Format SDK,则可以使用该 SDK 中定义的缓冲区对象。

如果实现自己的缓冲区类,请谨慎处理缓冲区内存的方式。 传递输入样本时,DMO 会保留对缓冲区的引用,直到该样本完成。 可以立即释放对 IMediaBuffer 接口的引用,但无法知道编解码器何时不再需要其引用。 为了确保在对象删除自身时释放内存,应实现类,以便它在内部分配和释放缓冲区的内存。

由于 MDO 将对缓冲区的引用保留一段时间未知,因此使用有限的缓冲区池并不是一件小事。 最简单的解决方案是为每个样本分配一个新的缓冲区,尽管这样做效率低下。

更好的解决方案是实现 对象来管理缓冲区池。 为此,请在 IMediaBuffer 实现的 Release 方法中编写代码,该代码调用缓冲区管理器 (的方法,而不是) 引用计数降至零时删除自身。 然后,缓冲区管理器可以维护指向分配的缓冲区对象的指针列表。 在缓冲区管理器中创建一个方法来检查可用缓冲区的列表并返回一个指针,以便应用程序可以在需要时访问缓冲区。 此方法应根据需要创建新的缓冲区,并将其添加到列表中。

使用编解码器 DSO