怎样让audio renderer一收到包就播放?

依然做自己的软件 2012-05-22 06:37:13
因项目原因,需要将audio 数据马上播放,就是在audio renderer一收到数据时就播放,不管其时间戳。
我尝试了多次,将graph的参考时钟设为NULL,或者将Sample的时间戳都设为0,均不行。
我怀疑是audio renderer 按连接时的媒体类型自己去匹配播放速度,于是试着在连接时去改变采样率,帧速率这些参数,但是都没能真正改变,是不是audio renderer也会自己去设置默认的参数哦???

下面是速率匹配的一些原则:
*如果graph没有使用一个参考时钟,那么audio renderer不会去进行速率匹配(如果graph没有参考时钟,那么样本总是在到达时就被立刻render)。
*另外,如果graph中有一个参考时钟,audio renderer检测是否有一个实时源在上游,如果没有,audio renderer不进行速率匹配。
*如果有一个实时源在上游,并且这个实时源在它的输出Pin上暴露IAMPushSource接口,audio renderer调用IAMPushSource::GetPushSourceFlags,并寻找以下标记:
•AM_PUSHSOURCECAPS_INTERNAL_RM,这个标记表示这个实时源拥有自己的速率匹配机制,因此audio renderer不进行速率匹配。
•AM_PUSHSOURCECAPS_NOT_LIVE,这个标记表示source filter并不是一个真正的实时源,即使它暴露了IAMPushSource接口,因此,audio renderer不进行速率匹配。
•AM_PUSHSOURCECAPS_PRIVATE_CLOCK,这个标记表示source filter使用一个私有的时钟来产生时间戳。在这种情况下,audio renderer速率匹配与时间戳会有冲突。(如果样本没有时间戳,那么renderer忽略这个标记。
*如果GetPushSourceFlags返回没有标记(0),audio renderer的行为依赖于graph时钟和样本是否拥有时间戳:
•如果audio renderer不是graph参考时钟,并且样本拥有时间戳,那么audio renderer速率匹配与时间戳会有冲突
•如果样本没有时间戳,audio renderer尝试与输入的音频数据的速率进行匹配。
•如果audio renderer是graph参考时钟,它与输入的数据速率进行匹配。

按上面的原则,将参考时钟设为NULL,或设置Sample时间戳,任意一条都可以让renderer 立即播放的。为什么不能呢???
...全文
231 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rightorwrong 2012-05-26
  • 打赏
  • 举报
回复
动态设置采样率,肯定不行。要么就缓冲,有一定的时延
  • 打赏
  • 举报
回复
现在的情况是,我发现audio renderer确实是一收到数据就播放的,但是按44.1K采样率来播的,而实际上数据到达的速度略大于这个,所以会造成延时。我的问题更准确说是,能否动态设置播放时采样率,与实际的数据流速率匹配??
rightorwrong 2012-05-23
  • 打赏
  • 举报
回复
不设置时间戳,有了数据就可以播放

2,542

社区成员

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

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