1

我有一个使用 DSPACK 库的 Delphi 6 Pro 程序来执行 DirectShow 过滤器工作。我正在创建我的第一个推送源过滤器,它将提供来自自定义音频源的音频。目前我最大的问题是如何确定在 FillBuffer() 调用期间我将复制到过滤器的输出缓冲区中的数据量。

我真的一次只复制一个音频样本吗?在我的情况下,这将只有 2 个字节,因为每个音频样本都是 16 位宽的单通道。这似乎效率极低。还是我一次复制一个样本块,如果是这样,确定要复制多少字节的正确逻辑是什么?简单地使用 Sample.GetSize() 返回的值作为要提供的字节数是否是正确的逻辑,其中 Sample 是传递给 FillBuffer() 调用的 IMediaSample 对象?

此外,如果有人对创建音频推送源过滤器和视频过滤器有任何提示或注意事项,请在此处发布。我正在使用的示例是一个视频过滤器,它将当前桌面图像作为一系列位图流式传输。我担心当使用视频过滤器作为我的起点时,我会做一些不适合纯音频 DirectShow 过滤器的事情。此外,来自此过滤器的音频必须是实时的,因为它涉及两方之间的实时音频连接。

4

1 回答 1

1

我真的一次只复制一个音频样本吗?在我的情况下,这将只有 2 个字节,因为每个音频样本都是 16 位宽的单通道。这似乎效率极低。还是我一次复制一个样本块...

您一次复制一个块。事实上,由于您有一个上游/源过滤器,因此生成数据的是您。因此,您的过滤器要求在输出引脚上附加一个内存分配器,以便为您提供一个新的缓冲区来承载数据。你获得了缓冲区并且你有它的容量,比如 N 个字节。您可以随意填充缓冲区,将更多或更少的样本放入其中,只需几个字节或尽可能多。

为避免复杂化,您应该在块对齐时填充数据,具体到媒体类型。对于音频,它通常是WAVEFORMATEX::nBlockAlign有价值的。对于某些将在内部缓冲数据并自行处理对齐的对等过滤器,即使不这样做也可能是可以的。此外,通过良好的对齐,将正确的时间戳附加到数据会更容易。

于 2011-10-25T20:47:15.360 回答