仅提供音频的DirectShow推送源过滤器的正确样本大小是多少?

时间:2011-10-25 15:52:24

标签: delphi audio filter directshow dspack

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

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

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

1 个答案:

答案 0 :(得分:1)

  

我是否一次只复制一个音频样本?这将是一个单纯的   在我的情况下是2字节,因为每个音频样本是16位宽,   单通道。这看起来效率极低。或者我复制一个块   样品一次......

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

为避免并发症,您应该在块对齐时填充数据,特定于媒体类型。对于音频,它通常为WAVEFORMATEX::nBlockAlign值。即使不这样做也可能对某些对等过滤器没问题,这会过滤内部数据并自己处理对齐。此外,通过良好的对齐,可以更容易地将正确的时间戳附加到数据中。