在 Media Foundation 中检测音量或静音

Posted

技术标签:

【中文标题】在 Media Foundation 中检测音量或静音【英文标题】:Detecting Volume or Silence in Media Foundation 【发布时间】:2014-08-12 18:34:44 【问题描述】:

我正在开发基于 Microsoft 媒体基础平台的媒体播放器。它能够做两件事对于程序的顺利运行至关重要:检测文件开头或结尾处的任何静音,并执行音频文件的规范化。这两件事都涉及检测“音量”或“响度”。

根据我迄今为止所做的研究,这将涉及使用 IMFSourceReader 提取所有 IMFMediaSample 对象,然后为每个样本提取任何和所有 IMFMediaBuffer 对象。

锁定缓冲区后,我将获得其中包含的数据字节。我如何解释这些数据以确定“响度”,然后操纵数据来调整响度?

【问题讨论】:

【参考方案1】:

要分析文件,您只需为文件创建source reader,然后读取每个音频样本。

要更改文件中的值,有两个选项,具体取决于您要执行的操作。

您可以创建一个MFT 并在 MediaSession 中使用它来在播放或转码期间更改值。

或者您可以在您的程序中实现代码并更改您从源阅读器获得的值(如在分析模式下)并将这些值写入sink writer。在这两个选项中,您都在使用 IMFSample 的缓冲区。

【讨论】:

锁定 IMFMediaBuffer 后,我将获得其中包含的数据字节。我如何在音量或响度方面解释这些数据?我可以通过什么方式根据数据计算新的响度值? 样本中字节的格式取决于 Mediatype。 PCM 的描述可以在MSDN 上找到。 所以,举个例子来看看我的理解,让我们以 MP3 文件格式为例。每个 MP3 样本或帧都有一个 32 位(或四个字节)的标头。如果我忽略 IMFMediaSample 及其缓冲区的前四个字节,而样本中的剩余字节将是我的音频数据,对吗? 我会使用原始 PCM 数据。如果您有 MP3 音频,则需要先对其进行解码。如果您使用 Source Reader 或 MFT,您可以对其进行配置,以便获得解码的数据。然后在 PCM 流中,你有我上一条评论中 MSDN 链接中描述的字节数据。 因此,通过使用原始 PCM 数据作为基础,从本质上讲,您可以创建一个公分母并消除对不同格式知识的需求,对吗?

以上是关于在 Media Foundation 中检测音量或静音的主要内容,如果未能解决你的问题,请参考以下文章

Media Foundation Capture - 如何检测真正的原生输入格式

如何确定 Windows Media Foundation 接收器编写器是不是需要自下而上或自上而下的图像?

使用 Media Foundation 将音频从文件播放到扬声器

用于 Windows RT 的 Media Foundation Audio MFT 的最小实现

Web Audio API - 浏览器 ogg 与 Windows Media Foundation mp3

使用 Media Foundation .NET 从 MP4 获取帧速率