音频缓冲演示?
一个 Flutter 应用,展示了如何通过互联网分块(缓冲)下载音频文件,并在无需等待整个文件加载的情况下进行播放。
音频还可以缓存一段时间,以避免每次播放音频时都通过互联网进行缓冲。
截图?
工作原理 ⚙️
使用 HTTP HEAD 方法,我们检索音频的元数据头,包括 `Content-Length`(表示音频的大小,以字节为单位)和 `Accept-Ranges`(表示音频内容是否可以分块下载)。
如果 `Accept-Ranges == bytes`,则可以分块下载音频内容,我们就可以继续缓冲!否则,整个音频内容将一次性下载然后播放。
在此演示中,有一个固定的最大块数。基于 `Content-Length` 计算此值的算法会更好,这样较小的文件就不会被下载成不必要的过小块。但是,对于此演示,音频文件大约为 10MB,最大块数为 10,我们将下载每个音频内容的 10 个块,并将这些块附加到它们各自的文件中。
在下载块时启用了重试功能,以防在最初几次下载块时出现问题。当重试次数超过限制时,缓冲将停止。
每个层都使用 `ValueNotifier` 来通信已下载音频内容的状态。此通知最终会到达 UI,触发对必要音频播放器流的重新订阅。
缺点?
-
在从一个缓冲块过渡到另一个缓冲块时,存在可听见的延迟/卡顿。我相信可以通过逻辑来改进这一点(弄清楚要跳到的确切持续时间)。
-
由于没有办法在不下载全部内容的情况下得知整个音频的时长,因此在下载更多块时,滑块的移动会有些卡顿,因为滑块需要进行调整。
