native-gui 的媒体扩展(独立模块,媒体因此对主模块消费者保持「模块级可选」):media/ 是新栈引擎(ffmpeg 解码 + miniaudio 设备直出),src/ 是旧链声明式播放器组件(待示例迁移完成后下线)
Dependencies
| 包 | 内容 |
|---|---|
| NoahLiu/gui-media/media | ffmpeg 解码 + miniaudio 设备直出的引擎(AudioPlayer / VideoPlayer / Demuxer 之上的字幕层与 LRC 歌词层、纯 MoonBit 的实时频谱分析),以及两个节点组件 video(含音轨与字幕叠加)与 audio(纯音频,含歌词与频谱条) |
moon add NoahLiu/gui-media| 平台 | 音频后端(miniaudio 设备层,零 ffmpeg 依赖) | ffmpeg 解码后端 |
|---|---|---|
| Linux | ✅ | ✅(pkg-config 探系统 libav*) |
| Windows | ✅ 可编译可运行(单调时钟走 QueryPerformanceCounter) | ✅ vendor dev 包真链接;vendor 缺失时 prebuild 降级空 link_configs 保可构建,CI 的 Windows job 装运行库跑真解码测试 |
| macOS | ⬜ 时钟分支已写(mach_absolute_time),未真机回证 | ❌ 未接(无 vendor 内容,门面给语义化降级) |
// 纯音频:播放/进度/-5s·+5s 跳转/音量/倍速;lyric 传已读好的 LRC 文本
let a = @media.audio("music.mp3", lyric=lrc_text, width=560.0, auto_play=true, on_error=fn(e) { .. })
// 视频:画面 + 音轨 + 字幕叠加(subtitle 传已读好的 SRT/VTT 文本,留空则试容器内嵌轨)
let v = @media.video("demo.mp4", width=640.0, height=360.0, auto_play=true)let player = @media.AudioPlayer::make("music.mp3")!
player.play()
// 组件定时器里每 33ms 调一次 player.pump()
let vp = @media.VideoPlayer::make("demo.mp4")!
vp.play()
// 每 33ms 调一次 vp.tick(),帧从 vp.current_frame() 取 RGBA 字节Install
Download zipnative-gui 的媒体扩展(独立模块,媒体因此对主模块消费者保持「模块级可选」):media/ 是新栈引擎(ffmpeg 解码 + miniaudio 设备直出),src/ 是旧链声明式播放器组件(待示例迁移完成后下线)
Dependencies