我正在Starboard中实现媒体处理程序,并且遇到了这样的情况,即我在Cobalt中的客户端应用程序没有足够积极地缓冲内容。这导致它只是闲置了一个空缓冲区。平台缓冲区耗尽时触发的正确Starboard事件是什么?我应该以某种方式冒犯错误,还是有信号可以让客户端应用程序请求更多数据?
最佳答案
当发生欠载时,播放器实现应通过内部暂停视频播放来处理它。对于最终用户,媒体播放被暂停,而媒体堆栈的状态仍被视为“正在播放”。这使播放器有机会在重新恢复播放之前接收一些视频数据。在参考实现中,PlayerWorker通过暂停音频播放来实现。由于媒体时间和视频播放与音频时间相关联,因此整个播放器将暂停。
当出现新数据时,播放器应自动恢复播放。播放器实现也可以选择增加预滚动/恢复所需的缓冲区数量,以避免将来出现欠载情况,但这通常不是必需的。
正如您提到的那样,您的应用程序经常会出现欠载情况。即使可以妥善处理欠载问题,也可以解决此问题,以获得更好的用户体验。
我要检查的第一件事是测试环境具有足够的网络带宽来满足要求的视频质量。如果该应用程序的目标市场是网络非常差的市场,请考虑缓冲更多媒体数据。
如果有足够的网络带宽时应用程序运行不足,则表明媒体数据的处理速度不够快。一个好的方法是检查是否频繁触发了kSbPlayerDecoderStateNeedsData且调用SbPlayerWriteSample()的时间没有太多延迟,因为这是唯一将媒体数据移过右舷边界的地方。
关于cobalt - 处理缓冲区欠载的最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40517025/