我正在实现一个 DirectShow 过滤器,它在多个输入引脚之间进行简单的音频混合,并将合并的数据传递到单个输出引脚(多对一)。我已经弄清楚了音频数据混合,但我想对如何处理非媒体数据流消息提出一些意见。例如,下面的代码取自我已经修改并与我的 Delphi 6 应用程序一起使用的 DSPACK DirectShow 组件库:
var
Props: PAMSample2Properties;
OutSample: IMediaSample;
begin
Assert(Assigned(inputPin));
// Check for other streams and pass them on
// Props := FInput.SampleProps;
Props := inputPin.SampleProps;
if(Props.dwStreamId <> AM_STREAM_MEDIA) then
begin
// ATI: Currently, any stream notices that come in that aren't
// regular stream media data notices are immediately passed
// through to the output pin. Is this behavior OK for my multi-pin filter?
result := FOutput.FInputPin.Receive(Sample);
exit;
end;
...
如您所见,目前我正在将任何不是流媒体数据消息的输入引脚传递立即传递到输出引脚。这与我接收音频数据时所做的相反,我一直保持直到所有输入引脚都传递了它们的下一个音频数据缓冲区,混合该音频数据,然后对我唯一的输出引脚进行单个接收调用。我的问题是:
- 在处理音频数据收据时,批处理输入引脚传递会产生什么影响,但会立即将它们传递给非媒体数据收据?可以在此 MSDN 文档中找到此类消息的列表:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd373500(v=vs.85).aspx
- 下游过滤器会被这种方法弄糊涂或损坏吗?如果是这样,我应该采用什么技术来仲裁当前连接到混合音频数据的过滤器的输入引脚上的非流媒体数据接收?