2

我想“按需”播放声音。一个简单的鼓机是我想要编程的。

是否可以让 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 的东西。它为来自凸轮的每一帧调用了一个方法。我正在寻找类似的东西,但对于音乐,以及在播放音乐之前调用的东西。谢谢

4

1 回答 1

1

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

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

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

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

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

一个相关的问题:

于 2013-08-14T18:16:39.347 回答