gpt4 book ai didi

c# - BackgroundAudioPlayer 是 'Playing' 但没有调用 GetSampleAsync()

转载 作者:行者123 更新时间:2023-11-30 22:19:40 25 4
gpt4 key购买 nike

我在后台代理中使用自定义 MediaStreamSource 从 Web 流式传输音乐。在良好的网络条件下,这工作正常,但当网络连接不稳定时,就会出现一个奇怪的问题。

当轨道开始播放时,通过第一次调用 MediaStreamSource.GetSampleAsync() 一切顺利。由于连接时断时续,如果没有足够的数据可用,源调用 ReportGetSampleProgress(double) 并返回而不报告样本。这符合 MSDN 文档和代码示例。

奇怪的是,根本没有对 GetSampleAsync 的进一步调用!随着缓冲的继续,源继续 ReportGetSampleProgress 直到样本准备就绪,此时它调用 ReportGetSampleProgress(1.0) 以指示缓冲区已满。

我尝试了几种方法,包括:

  • ReportGetSampleCompleted 缓冲完成时;这失败了,因为下载事件来自任意线程,并且此方法显然对调用线程以及对 GetSampleAsync 的调用是否在堆栈上都很敏感;无效的调用环境会导致 COM 错误。
  • 在准确的错误情况下,停止并启动 BackgroundAudioPlayer:这无法重新启动流式传输。

一旦最初未能读取样本而挂起,我如何才能让流式传输再次开始?

最佳答案

ReportGetSampleCompleted 一旦数据可用,就是这种情况下的正确方法。

您必须在 MSS 中跟踪是否需要立即报告任何新样本数据或等待 GetSampleAsync 被调用。

但是请注意,由于竞争条件而导致的失败在所涉及的各个线程之间是可能的。

关于c# - BackgroundAudioPlayer 是 'Playing' 但没有调用 GetSampleAsync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com