IAMBufferNegotiation接口的SuggestAllocatorProperties参数设置问题

Dionix 2008-09-10 11:34:11
最近在使用DShow做一个录音程序,需要使用IAMBufferNegotiation接口的SuggestAllocatorProperties方法调整Buffer。对于ALLOCATOR_PROPERTIES结构中的cbAlign的赋值比较困惑。

在DShow提供的示例代码中,Capture Pin的 cbAlign的值等于nBytesPerSample * nChannels(采样位数*声道数),这样的话对于16位双声道的声音应该赋值4,但是实际程序中,如果直接调用ICaptureGraphBuilder2的RenderStream方法连接Filter,检查Capture pin的cbAlign值为却为1

不是很明白DShow的SDK中对该参数的解释(Alignment of the buffer; buffer start will be aligned on a multiple of this value. ),网上也没找到关于这个参数的详细说明

刚接触DShow不久,希望那位大大能够给点帮助,

谢谢
...全文
270 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dionix 2008-09-12
  • 打赏
  • 举报
回复
谢谢 ,wwwllg的热心帮助,

也谢谢whChina的帮顶,

结贴,送分
UDX协议 2008-09-12
  • 打赏
  • 举报
回复
基本就是你理解的。
Dionix 2008-09-11
  • 打赏
  • 举报
回复
To wwwllg:

那是不是可以这样认为,只要设置的ALLOCATOR_PROPERTIES结构中的参数,使总Buffer大小( cBuffers * cbBuffer )能确保Graph一次传递的Sample数据不会丢失,(可以理解为,cBuffers * cbBuffer > cbAlign * 一个Sample的Size), 就不会影响声音的质量。而在通过调节cBuffers 和cbBuffer 的值来减少Buffer时,也需要注意不能让总Buffer小于Graph一次可以传递的Sample数据。

UDX协议 2008-09-10
  • 打赏
  • 举报
回复
但是ALLOCATOR_PROPERTIES中的cbAlign值却是1。
--------------只是表明你的graph只会有一个sample在传递。并不表明其他的意思。
这是在graph连接的时候设置的。大于1一般是对于编码或解码器filter需要缓冲多个buff设置的。
江城老温 2008-09-10
  • 打赏
  • 举报
回复
帮顶下.
Dionix 2008-09-10
  • 打赏
  • 举报
回复
谢谢 wwwllg的回答,

Wave格式(WaveFormatEx)中的nBlockAlign的确是4 ,但是ALLOCATOR_PROPERTIES中的cbAlign值却是1。

将ALLOCATOR_PROPERTIES中的cbAlign值设为nBytesPerSample * nChannels(Render后读取出来的值是4) 或者-1(使用默认值,Render后读取出来的值是1)。 程序都能正常工作,但是想搞清楚设定这些参数对程序执行结果会带来什么影响。

还有,从调用顺序来说,在render前,调用SuggestAllocatorProperties和SetFormat方法的先后顺序是否有要求,不同的顺序会否对程序带来什么影响

谢谢
UDX协议 2008-09-10
  • 打赏
  • 举报
回复
我想你RenderStream方法连接Filter的时候,其他设置是否正确?

比如wave的格式中, WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
这些是否都正常。nBlockAlign一般就是等于nBytesPerSample * nChannels

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧