处理缓冲区欠载的最佳方法?

Best way to handle buffer under-runs?

我正在 Starboard 中实现媒体处理程序,但我 运行 遇到这样一种情况,即我在 Cobalt 中的客户端应用程序没有足够积极地缓冲内容。这导致它只是闲置一个空缓冲区。当平台的缓冲区耗尽时,触发正确的右舷事件是什么?我应该以某种方式冒出一个错误,还是我可以向客户端应用程序发出请求更多数据的信号?

当出现欠载时,播放器实现应该通过在内部暂停视频播放来处理它。对于最终用户,媒体播放暂停,而媒体堆栈的状态仍被视为 "playing"。这使播放器有机会在再次恢复播放之前接收一些视频数据。在参考实现中,PlayerWorker 通过暂停音频播放来实现这一点。由于媒体时间和视频播放与音频时间挂钩,所以整个播放器都暂停了。

当有新数据到来时,播放器应该会自动恢复播放。播放器实现也可以选择增加 preroll/resuming 所需的缓冲区量以避免将来出现欠载,但这通常不是必需的。

正如您所提到的,您的应用经常遇到数据不足的情况。即使能够妥善处理欠载,也能解决这个问题以获得更好的用户体验。

我要检查的第一件事是测试环境是否有足够的网络带宽来满足所要求的视频质量。如果该应用针对网络非常差的市场,请考虑缓冲更多媒体数据。

如果应用在网络带宽足够的情况下出现underrun,说明媒体数据处理速度不够快。一个好的方法是检查 kSbPlayerDecoderStateNeedsData 是否被足够频繁地触发并且 SbPlayerWriteSample() 被调用而没有太多延迟,因为这是唯一跨右舷边界移动媒体数据的地方。