0

0

如何在Golang中开发简易音乐播放器_读取本地音乐文件播放

P粉602998670

P粉602998670

发布时间:2026-01-06 08:51:08

|

584人浏览过

|

来源于php中文网

原创

Go简易本地音乐播放器核心是用tcolgate/mp3解码MP3、ebiten/v2/audio播放,需初始化音频上下文、创建Player并调用Play(),配合time.Sleep或输入监听防止退出,支持MP3/WAV格式及基础控制。

如何在golang中开发简易音乐播放器_读取本地音乐文件播放

在 Go 语言中开发一个简易本地音乐播放器,核心在于:读取音频文件(如 MP3、WAV)、解码为 PCM 数据、再通过音频设备输出。Go 标准库不直接支持音频播放,需借助第三方库。下面是一套轻量、可运行的实现方案。

选择合适的音频播放库

推荐使用 oakmound/audio 或更成熟稳定的 ebitengine/ebiten/audio(适合桌面应用),但对纯命令行播放器而言,hajimehoshi/ebiten/v2/audio 依赖较重;更轻量的选择是:
faiface/pixel/audio(已归档,不推荐新项目)
gosnd/snd(纯 Go,支持 WAV/MP3 解码 + ALSA/PulseAudio/CoreAudio 输出)
– 实际推荐:ebiten/v2/audio(稳定、跨平台、文档好)或 mp3 + portaudio 组合(控制更强)

对于入门级播放器,我们采用:
github.com/hajimehoshi/ebiten/v2/audio(负责播放)
github.com/hajimehoshi/ebiten/v2/audio/wav(读 WAV)
github.com/mjibson/go-dsp/wavegithub.com/tcolgate/mp3(读 MP3)

读取并解码本地音频文件

Go 不原生支持 MP3 解码,需手动解码为 PCM 流。以 MP3 为例:

  • tcolgate/mp3 打开文件,获取 mp3.Frame
  • miojo/lamedrmpeg(C 绑定)也可,但纯 Go 更易部署
  • 推荐组合:github.com/tcolgate/mp3 + github.com/hajimehoshi/ebiten/v2/audio

示例关键代码(读 MP3 并转成音频流):

file, _ := os.Open("song.mp3")
decoder, _ := mp3.NewDecoder(file)
streamer, _ := audio.NewInfiniteLoop(decoder, decoder.Length())

注意:decoder 需实现 audio.Streamer 接口(tcolgate/mp3Decoder 已实现)。

立即学习go语言免费学习笔记(深入)”;

魔珐星云
魔珐星云

无需昂贵GPU,一键解锁超写实/二次元等多风格3D数字人,跨端适配千万级并发的具身智能平台。

下载

初始化音频上下文并播放

Ebiten 的音频系统需先初始化全局上下文:

context := audio.NewContext(44100) // 采样率 44.1kHz
player, _ := audio.NewPlayer(context, streamer)
player.Play()

播放后程序会立即退出,需阻塞等待(如用 time.Sleep 或监听按键):

  • time.Sleep(decoder.Length())(需提前算出时长)
  • 或用 player.IsPlaying() 循环轮询
  • 更友好方式:监听终端输入(如按回车暂停/退出)

支持常见格式与简单 CLI 控制

一个实用的简易播放器至少应支持:
– MP3 和 WAV(覆盖 90% 本地音乐)
– 播放/暂停/停止(用布尔标志 + 重新创建 Player)
– 列出当前目录下支持的音频文件(filepath.Glob("*.mp3")

小技巧:

  • github.com/moutend/go-wav 替代 Ebiten 自带 wav 包,支持更多 WAV 变体
  • MP3 时长可通过 decoder.Length() 获取(单位:秒),用于进度显示
  • 避免内存泄漏:每次播放新文件前调用 player.Close()

不复杂但容易忽略。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.5万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号