QYDocs

AudioPlayer 模块

Android 高保真音频播放组件,支持 DSD、MQA、SACD、CUE 分轨、网盘 / WebDAV 等场景。

依赖

implementation("io.github.qytech:audioplayer:1.2.5")

功能特性

进度定位

调用 seekTo(positionMs)positionMs 为毫秒)可定位播放进度。连续快速调用时,库会保留最后一次定位目标并减少重复暂停、清空音频输出造成的播放停滞;显式调用 pause() 仍按暂停语义处理。

读取内嵌歌词

AudioProbe 会把容器元数据中的 syncedlyricslyricsunsyncedlyrics 映射到 AudioMetadata.lyrics。没有内嵌歌词时该字段为 null

val metadata = AudioProbe.probeFile("/storage/usb/Music/song.flac")
val embeddedLyrics: String? = metadata?.lyrics

歌词可能是带时间轴的 LRC 文本,也可能是纯文本;SDK 不负责把纯文本转换为时间轴。

中断阻塞操作并释放资源

存储设备拔出、网络卷卸载或连接中断时,先调用 requestAbort() 请求底层尽快退出正在进行的打开、读取、预加载或 Seek,再调用 forceRelease() 完成资源回收:

audioPlayer.requestAbort()
audioPlayer.forceRelease()

requestAbort() 是非阻塞请求,不能替代 forceRelease()。业务侧仍需在 Service 或其他明确的生命周期 owner 中持有播放器,并保证后续释放路径只执行一次。


更新日志

v1.2.5 (2026-09-20)

修复与优化

升级说明

v1.2.4 (2026-09-20)

修复与优化

升级说明

v1.2.3 (2026-09-09)

新增

修复与优化

v1.2.2 (2026-09-07)

v1.2.0 (2026-09-05)

v1.1.12 (2026-09-02)

v1.1.11 (2026-08-26)

v1.1.10(2026-08-18)

v1.1.9(2026-08-14)


v1.1.8(2026-08-12)


v1.1.7(2026-08-07)

v1.1.6(2026-08-03)


v1.1.5(2026-07-28)


v1.1.4

v1.1.3

v1.1.2

特别说明

v1.1.1

v1.1.0

v1.0.9

v1.0.8

v1.0.7

data class MediaInfo(
    val sourceId: String,
    val sampleRate: Int,
    val channels: Int,
    val bitrate: Long,
    val bitDepth: Int,
    val format: String,
    val title: String = "Unknown Title",
    val artist: String = "Unknown Artist",
    val album: String = "Unknown Album",
    // MQA 状态:0=非 MQA;非 0=已识别/认证
    val mqaUiState: Int = 0,
    // MQA 原始采样率 (Hz)
    val mqaOriginalRate: Int = 0,
    // MQA 展开后的输出采样率 (Hz)
    val mqaOutputRate: Int = 0,
)

v1.0.6

v1.0.5

v1.0.4

v1.0.3

v1.0.2(2026-05-08)

v1.0.1

v1.0.0


v0.9.9

v0.9.8

v0.9.7

注:0.9.6 升级了 Gradle 版本,此版本暂时回退

v0.9.5

v0.9.4

v0.9.3

v0.9.2

v0.9.1

v0.9.0


v0.8.9

v0.8.8

playerManager.setNextMediaSource(
    DefaultMediaSource(
        uri = nextNextAudio.sourceId
    )
)

v0.8.7

v0.8.6

v0.8.5

v0.8.3

v0.8.2

v0.8.1

v0.8.0


v0.7.7

v0.7.6

v0.7.5

v0.7.4

v0.7.3

v0.7.2

data class MediaInfo(
    val sampleRate: Int,
    val channels: Int,
    val bitrate: Long,
    val bitDepth: Int,
    val format: String,
    val title: String = "Unknown Title",
    val artist: String = "Unknown Artist",
    val album: String = "Unknown Album",
)

v0.7.1


v0.6.9

v0.6.8

v0.6.7

v0.6.6

v0.6.5

v0.6.4

v0.6.3

v0.6.2

v0.6.0

val webDavUrl = "https://dav.jianguoyun.com/dav/音频测试/左右声道测试_PCM_44.1k.wav"
val webDavUser = ""
val webDavPwd = ""

AudioProbe.probeFile(webDavUrl, webDavUser = webDavUser, webDavPwd = webDavPwd)
AudioProbe.probe(webDavUrl, ScanProfile.WebDav(webDavUser, webDavPwd))

v0.5.8

v0.5.0

v0.4.9

v0.4.8

public interface PlayerListener {
    fun onPrepared()
    fun onProgress(track: Int, current: Long, total: Long, progress: Float)
    fun onError(code: Int, msg: String)
    fun onComplete()
    fun onStateChanged(state: PlaybackState)
}

v0.4.6

TODO