在 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 的最小实现