使DirectShow从内存缓冲区播放声音

时间:2013-08-14 10:58:43

标签: winapi audio directshow

我想按需播放声音。我想编写一个简单的鼓机。

是否可以从内存缓冲区中读取DirectShow?(由c ++创建的对象)

我在想:

创建一个缓冲区,比方说40000个位置,键入double(我不知道要用作声音的实际数据类型,所以我可能错误double)。

40000个位置可以播放1秒。

DirectShow对象应该按位置一遍又一遍地读取此缓冲区位置。缓冲区将包含声音输出的实际值。例如(正弦输出):

{0,0.4,0.7,0.9,0.99,0.9,0.7,0.4,0,-0,4,-0.7,-0.9,-0.99,-0.9,-0.7,-0.4,0}

这个声音序列的分辨率可能不太好,但它只是显示我的意思。

这可能吗?我在Google上找不到任何关于它的示例或信息。

修改 在使用DirectShow和流视频(UBS相机)时,我使用了一种名为Sample Grabber的东西。这称为凸轮每一帧的方法。我正在寻找类似的东西,但是对于音乐,以及在播放音乐之前调用的东西。 感谢

1 个答案:

答案 0 :(得分:1)

您希望通过流式传输数据并将数据注入DirectShow管道。

按照设计,外部DirectShow接口不提供对流数据的访问。控制代码构建拓扑,连接过滤器,设置它们并控制管道的状态。所有数据都在后台流式传输,过滤器将数据一个接一个地传递到另一个数据流,这就加入了数据流。

Sample Grabber是一个辅助过滤器,它允许获取通过某个图形点传递的数据副本。因为否则有效载荷数据不可用于控制代码,Sample Grabber获得了普及,尤其是用于从“无法访问”的流中获取视频帧,实时或文件支持的播放。

现在,当您想要反过来,将自己的数据放入管道时,Sample Grabber概念不起作用。获取数据副本是一回事,主动将您自己的数据放入流中是另一回事。

要注入您自己的数据,您通常会将自己的自定义过滤器放入生成数据的管道中。您想要生成PCM音频数据。您可以选择从哪里获取 - 生成,从文件读取,内存,网络,循环。您填充缓冲区,添加时间戳,并将音频缓冲区传递给下游过滤器。典型的起点是PushSource Filters Sample,它引入了产生视频数据的滤波器的概念。以类似的方式,您想要生成PCM音频数据。

相关问题: