[译]Flutter 特性丰富的音频播放器 just_audio (三) - 问题排查

222 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情


本文翻译自: just_audio | Flutter Package (flutter-io.cn)

译时版本:0.9.31


问题排查

播放音频时碰到的大多数问题和音频文件格式、服务器头部、或文件名有关。

音频文件格式/编码

不同的平台支持不同的音频格式和编码。 StackOverflow 的这个回答中有相关列表。

不同的音频格式有不同的寻轨支持。
如果想控制应用要播放的音频文件的编码,建议编码为M4A,因为该格式可以嵌入准确的寻轨时间。
用MP3格式的话,会有多种不同的编码方式,这些编码方式可以寻轨,即使这些方法是近似的。

当应用需要播放用户指定的专用音频源,那就依赖于指定的音频格式了。
不同的音频格式可能会也可能不会嵌入时长元数据,just_audio 有时会返回 null 的时长,通常是因为缺少该元数据。
该行为是平台特定的,尽管这样,Android 有时会在解码整个文件并估量时长时推断出错误的时长。

服务器头部

音频内容的主机服务器会返回给客户恰当的HTTP响应头部。
这包含恰当的 Content-Length 头部和正确的 Content-Type 头部,这样播放器会知道使用哪个编码器读取数据。

服务器也应该支持范围请求。
这可以使 just_audio 可以请求整个文件中的指定的一部分字节范围,而不总是需要请求整个文件。
如果用户在音频文件末尾附近寻轨,但文件还没有下载好(如果有寻轨表),just_audio 会尝试请求文件的末尾。

范围请求也会影响 just_audio 判断文件时长的能力。
很多情况下,一些音频格式会在音频文件末尾嵌有元数据(包含音频时长),然后范围请求可以让 just_audio 先跳转到文件末尾来获取元,而不需要等待整个文件下载,然后会提前通知你音频文件的时长。
如果音频文件包含时长元数据,just_audio 却返回了 null 的时长,这应该是告诉你服务器不支持范围请求。

如果是在个人的服务器上提供音频文件,记着要正确配置上面描述的头部。

文件名

播放本地的音频文件时, just_audio 不会使用任何 Content-Type 头部来确认使用哪个解码器读取文件。
通常会用文件的扩展名来判断文件类型。
例如,如果文件名以 .mp3 结尾,则会使用 MP3 解码器来读取,如果文件名以 .wav 结尾,则会使用 WAV 解码器。
如果文件带有 .mp3 扩展名,但是实际的文件内容不是 MP3 格式,just_audio 有可能会读取失败。
iOS 上是相当严格地强制这样,Android 上更倾向于对数据进行寻轨,来推断数据的真实格式。
一般来说,尽管如此,建议对可控制的任何音频文件都使用正确的文件名扩展。


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情