嵌入式音乐播放器
一、项目全维度概要
本项目基于韦东山 I.MX6ULL-PRO 嵌入式开发板与嵌入式 Linux 平台,依托 Ubuntu 18.04 交叉编译环境、Qt5 图形开发框架、音频驱动,结合百度语音识别与阿里百炼 AI 大模型,开发一款嵌入式智能 AI 车载音乐播放器。项目硬件适配 7 寸、1024×600 分辨率电容触控屏幕,搭载 WM8960 音频芯片完成音频录入与播放,基于 BusyBox 轻量化根文件系统稳定运行,适配嵌入式设备低资源、高稳定的运行特性。
播放器集成完整的本地音频播放体系,支持 MP3、WAV 主流音频格式,实现播放、暂停、上下曲切换、进度拖拽、硬件音量调节功能,同时支持列表循环、单曲循环、随机播放三种播放模式自由切换,搭配虚拟触屏键盘、实时 WiFi 网络检测、播放历史与 AI 歌曲推荐等辅助功能,完善嵌入式触控交互体验。
项目最大特色为嵌入式 AI 智能语音交互,通过开发板麦克风采集音频,经百度语音识别完成语音转文字,再由阿里百炼大模型智能解析用户语音指令,实现全自动语音点歌、语音控制播放状态、智能人机对话等功能,摆脱传统手动触控操作,实现触控操作 + AI 语音控制双交互模式,高度贴合车载嵌入式设备智能化、便捷化的使用场景,是一套软硬件结合、功能完整的嵌入式 Linux 智能应用实战项目。
1. 硬件平台(韦东山 MX6ULL-PRO 开发板)
| 硬件类别 | 详细参数 |
|---|---|
| 主控芯片 | NXP i.MX6 UltraLite(Cortex-A7 单核 ARMv7) |
| 屏幕 | 7 寸电容触摸屏,物理分辨率 1024×600 |
| 音频芯片 | WM8960(ALSA 驱动) |
| 存储 | TF 卡(本地音乐存储) |
| 网络 | 以太网 / WiFi(AI 语音 / 对话必备) |
| 系统底层 | 适配 IMX6ULL 的 Linux 内核 + BusyBox 1.31.1 根文件系统 |
2. 软件环境
- 宿主机:Ubuntu 18.04 x86_64
- 编译工具:ARM 架构交叉编译器
- UI 框架:Qt 5.12+(嵌入式移植版本)
- 音频框架:ALSA(驱动 WM8960 声卡)
- 核心依赖:
mpg123(播放)、arecord(录音)、amixer(音量)
3. 核心功能
- 基础播放:播放 / 暂停 / 上一曲 / 下一曲
- 模式切换:列表循环 / 单曲循环 / 随机播放
- AI 语音:百度语音识别 + 阿里百炼大模型,语音点歌 / 控制
- 硬件适配:7 寸触屏交互、WM8960 音频输出、全屏显示
4. 开发板环境查询指令(BusyBox 专用)
| 功能 | 执行指令 |
|---|---|
| 查看 CPU | cat /proc/cpuinfo |
| 查看内存 | free |
| 查看存储 | df -h |
| 查看屏幕分辨率 | cat /sys/class/graphics/fb0/virtual_size |
| 测试网络 | ping www.baidu.com |
| 内核版本 | uname -a |
二、分功能详解
所有功能适配韦东山 IMX6ULL-PRO + 7 寸 1024×600 屏 + WM8960 声卡
功能 1:项目基础框架(硬件窗口适配)
硬件适配:适配 1024×600 分辨率、无边框全屏、7 寸电容屏交互
widget.h 声明
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QProcess>
#include <QTimer>
#include <QNetworkAccessManager>
class AIChatWindow;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
// 基础进程/定时器
QProcess *mplayer;
QTimer *progressTimer;
QTimer *wifiCheckTimer;
QNetworkAccessManager *networkManager;
QString baiduToken;
bool m_wasPlaying;
// AI 接口配置
const QString BAILIAN_API_URL;
const QString BAILIAN_API_KEY;
const QString BAILIAN_MODEL;
};
#endif
widget.cpp 实现
#include "widget.h"
#include "aichatwindow.h"
// 百度语音密钥
const QString BAIDU_API_KEY = "DeZl22FLAAK3Fc1yrTTUCDLa";
const QString BAIDU_SECRET_KEY = "kpvmQi7fVfIv3gDfGcvGsxD9XEj85xbM";
const QString RECORD_FILE = "/home/book/record.wav";
// 构造:适配IMX6ULL 1024×600屏幕
Widget::Widget(QWidget *parent)
: QWidget(parent)
, mplayer(new QProcess(this))
, progressTimer(new QTimer(this))
, wifiCheckTimer(new QTimer(this))
, networkManager(new QNetworkAccessManager(this))
, BAILIAN_API_URL("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions")
, BAILIAN_API_KEY("sk-bfc95bbdb098444ebec81b00ecfcc55f")
, BAILIAN_MODEL("qwen3-max")
{
// 硬件屏幕适配:7寸1024x600 无边框全屏
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
setFixedSize(1024, 600);
showFullScreen();
// 创建音乐存储目录(TF卡/根文件系统)
QDir dir;
dir.mkpath("/home/book/nfs/Music");
}
// 析构:释放硬件资源
Widget::~Widget()
{
if(mplayer->state() == QProcess::Running)
mplayer->kill();
delete aiChatWindow;
}
功能 2:音乐播放核心(适配 WM8960 声卡)
硬件适配:调用 ALSA 驱动、指定 WM8960 声卡设备 plughw:0,0
widget.h 声明
private slots:
void onPlayBtnClicked();
void onPrevBtnClicked();
void onNextBtnClicked();
void pauseMusic();
void resumeMusic();
void updatePlayProgress();
void playAudio(int index, int jumpSec = 0);
private:
int currentPlayIndex;
bool isPaused;
int totalSeconds;
int currentSeconds;
bool isSliderDrag;
QStringList musicFullPath;
widget.cpp 实现
// 播放/暂停
void Widget::onPlayBtnClicked(){
if(musicFullPath.isEmpty()) return;
if(mplayer->state() != QProcess::Running) {
playAudio(currentPlayIndex);
btn_play->setText("⏸ 暂停");
return;
}
isPaused = !isPaused;
isPaused ? pauseMusic() : resumeMusic();
btn_play->setText(isPaused ? "▶ 播放" : "⏸ 暂停");
}
// 核心播放:适配WM8960声卡
void Widget::playAudio(int index, int jumpSec)
{
if(mplayer->state() == QProcess::Running) {
mplayer->kill();
mplayer->waitForFinished();
}
// 指定WM8960硬件声卡设备
mplayer->start("mpg123", {"-a", "plughw:0,0", musicFullPath[index]});
progressTimer->start(1000);
}
// 进度条更新
void Widget::updatePlayProgress(){
if(mplayer->state()!=QProcess::Running || isSliderDrag || isPaused) return;
currentSeconds++;
slider_progress->setValue(currentSeconds*1000/totalSeconds);
if(currentSeconds >= totalSeconds) onNextBtnClicked();
}
功能 3:播放模式 + 音量控制(硬件音量调节)
硬件适配:amixer 直接控制 WM8960 硬件音量
widget.h 声明
private slots:
void changePlayMode();
void adjustVolume(int value);
private:
int playMode; // 0列表 1单曲 2随机
widget.cpp 实现
// 模式切换:列表/单曲/随机
void Widget::changePlayMode()
{
playMode = (playMode+1)%3;
btn_mode->setText(playMode==0?"🔁列表":playMode==1?"🔂单曲":"🔀随机");
}
// 硬件音量:ALSA + WM8960
void Widget::adjustVolume(int value)
{
QProcess vol;
// 直接控制硬件声卡音量
vol.start("amixer", {"cset","numid=3",QString::number(value*60)});
vol.waitForFinished();
}
功能 4:本地音乐加载(TF 卡文件扫描)
硬件适配:扫描 TF 卡 / 根文件系统音乐文件
widget.h 声明
private slots:
void loadMusicFiles();
void onListItemClicked(QListWidgetItem *item);
private:
QListWidget *musicList;
widget.cpp 实现
// 扫描TF卡/本地MP3/WAV文件
void Widget::loadMusicFiles()
{
musicFullPath.clear();
musicList->clear();
QDir d("/home/book/nfs/Music");
// 过滤音频文件
QStringList fs = d.entryList({"*.mp3","*.wav"}, QDir::Files);
for(QString f : fs){
musicFullPath << d.absoluteFilePath(f);
musicList->addItem(f);
}
}
// 触屏点击列表播放
void Widget::onListItemClicked(QListWidgetItem *item)
{
currentPlayIndex = musicList->row(item);
playAudio(currentPlayIndex);
}
功能 5:虚拟键盘(7 寸电容触屏适配)
硬件适配:7 寸电容屏无物理键盘,全屏触屏输入
widget.h 声明
private slots:
void initKeyboard();
void onKeyInput();
void onDeleteKey();
void onClearKey();
void hideKeyboard();
bool eventFilter(QObject*, QEvent*) override;
void mousePressEvent(QMouseEvent*) override;
private:
QWidget *keyboardWidget;
QGridLayout *keyboardLayout;
QLineEdit *edit_url;
widget.cpp 实现
// 初始化触屏键盘(1024×600屏幕布局)
void Widget::initKeyboard()
{
keyboardWidget = new QWidget(this);
keyboardWidget->setGeometry(0, 380, 1024, 220);
keyboardLayout = new QGridLayout(keyboardWidget);
keyboardWidget->hide();
}
// 触屏点击弹出键盘
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == edit_url && event->type() == QEvent::MouseButtonPress) {
keyboardWidget->show();
return true;
}
return QWidget::eventFilter(watched, event);
}
功能 6:WiFi 网络检测(开发板联网测试)
硬件适配:IMX6ULL 以太网 / WiFi 模块联网检测
widget.h 声明
private slots:
void checkWifiStatus();
private:
QLabel *lab_wifiStatus;
widget.cpp 实现
// 硬件网络检测:ping 百度
void Widget::checkWifiStatus()
{
int ret = QProcess::execute("ping", {"-c","1","-W","2","www.baidu.com"});
lab_wifiStatus->setText(ret==0 ? "📶 WiFi: 已连接 ✅" : "📶 WiFi: 未连接 ❌");
}
功能 7:AI 语音识别(百度语音 + 开发板录音)
硬件适配:arecord 调用 WM8960 麦克风录音
widget.h 声明
private slots:
void getBaiduToken();
void startAsyncRecord();
void onRecordFinished(int,QProcess::ExitStatus);
void startRecordAndUpload();
void parseBaiduReply(QNetworkReply*);
private:
QProcess *recordProcess;
QTimer *countdownTimer;
int countdown;
widget.cpp 实现
// 硬件录音:WM8960 麦克风
void Widget::startAsyncRecord(){
recordProcess->start("arecord", {"-d","3","-r","16000",RECORD_FILE});
}
// 上传百度语音识别
void Widget::startRecordAndUpload(){
QFile file(RECORD_FILE);
file.open(QIODevice::ReadOnly);
networkManager->post(QNetworkRequest(QUrl("https://vop.baidu.com/server_api")), file.readAll());
}
功能 8:AI 大模型交互(阿里百炼)
硬件适配:IMX6ULL 网络通信,AI 指令解析
widget.h 声明
private slots:
void requestBailianChat(const QString&);
void parseBailianResponse(QNetworkReply*);
widget.cpp 实现
// 发送语音文字给AI
void Widget::requestBailianChat(const QString& asrText)
{
QNetworkRequest req{QUrl(BAILIAN_API_URL)};
req.setRawHeader("Authorization", ("Bearer "+BAILIAN_API_KEY).toUtf8());
networkManager->post(req, QJsonDocument(json).toJson());
}
功能 9:AI 语音点歌(核心智能功能)
硬件适配:全语音控制,无需触屏操作
widget.h 声明
private slots:
void initCommandExecutor();
void executeControlCommand(const QJsonObject&);
void playMusicByName(const QString&);
widget.cpp 实现
// 指令映射
void Widget::initCommandExecutor(){
m_controlCommands["music_play"] = [this](){ onPlayBtnClicked(); };
m_controlCommands["music_next"] = [this](){ onNextBtnClicked(); };
}
// 语音点歌:模糊匹配本地歌曲
void Widget::playMusicByName(const QString& songName)
{
for(int i=0;i<musicFullPath.size();i++){
if(musicFullPath[i].contains(songName, Qt::CaseInsensitive)){
playAudio(i);
return;
}
}
}
功能 10:UI 界面初始化(1024×600 全屏布局)
硬件适配:7 寸屏完美布局,歌词 / 列表 / 按钮自适应
widget.h 声明
private slots:
void initCarUI();
widget.cpp 实现
// 1024×600 硬件屏幕布局
void Widget::initCarUI()
{
// 歌词区域 + 音乐列表 + 控制按钮 + 进度条
// 全屏适配韦东山7寸电容屏
}
三、项目效果
嵌入式音乐播放器
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)