Directshow音频采集滤镜每秒仅生成1个Sample相关问题咨询
问题解答
问题1:DirectShow的Sample与音频采样定义区别
两者定义完全不同:
- 音频录制领域的*sample(采样点)*指单声道单次模数转换得到的数值,你当前场景下16bit位宽的单个采样点占2字节,双声道模式下每次同步采集左右两个采样点,组成1个
nBlockAlign=4字节的音频帧。 - DirectShow范畴内的*Sample(媒体样本)*是
IMediaSample接口封装的一段连续媒体数据缓冲区,音频采集Filter默认会将连续多个音频采样点打包成一个IMediaSample向下游传递,并非单次音频采样就生成一个DirectShow Sample,你现在遇到的就是多采样聚合到同一个缓冲区的情况。
问题2:缓冲区大小与计算值不符的原因
你当前的配置依然是双声道采集,并非单通道,原因如下:
- 按你给出的WAVEFORMATEX参数计算:每个88200字节的缓冲区对应音频帧数量为
88200 / 4 = 22050帧,对应实际时长为22050 / 44100 = 0.5s,刚好是半秒的音频数据量。 - 出现你观测到的“每秒仅触发1次回调、每次返回88200字节”的现象,有两种常见可能:
- 你对回调触发的计数统计存在误差,实际回调是每500ms触发一次,每秒触发两次,统计时漏记了其中一次
- 你的采集链路存在Sample丢包,音频采集Filter输出的半秒大小Sample有一半被丢弃,每秒仅成功传递1个到SampleGrabber回调
- 验证方法:你可以在回调中调用当前
IMediaSample的GetTime()方法获取样本的起止时间戳,计算单个样本的时长,同时对比连续两个样本的时间差,即可确认是计数误差还是丢包问题。
内容的提问来源于stack exchange,提问作者irous
相关产品推荐
相关产品推荐

