在 ARM64 嵌入式 Linux 平台上,除了 QMediaPlayer
,还可以通过以下方法实现 MP3 播放(需根据平台资源权衡选择):
1. 使用 Qt Multimedia 的底层接口
如果 QMediaPlayer
因依赖过多或性能问题不适用,可以尝试直接调用 Qt Multimedia 的底层音频接口:
#include <QAudioOutput>
#include <QFile>
// 解码 MP3 后播放 PCM 数据(需自行处理解码)
void playPcmData(const QByteArray &pcmData, const QAudioFormat &format) {
QAudioOutput *audio = new QAudioOutput(format);
audio->start(); // 输出到默认设备
audio->write(pcmData); // 写入 PCM 数据
}
注意:需要先通过其他库(如 FFmpeg)将 MP3 解码为 PCM。
2. 集成 FFmpeg + ALSA/PulseAudio
FFmpeg 轻量级解码 + ALSA 直接输出,适合资源受限环境:
# 交叉编译 FFmpeg (示例配置)
./configure --target-os=linux --arch=aarch64 --enable-cross-compile \
--disable-x86asm --enable-small --disable-programs \
--enable-decoder=mp3 --enable-demuxer=mp3
代码示例:
extern "C" {
#include <libavcodec/avcodec.h>
#include <alsa/asoundlib.h>
}
void playMp3(const char *filename) {
// FFmpeg 解码 MP3...
AVFrame *frame = av_frame_alloc();
// ...(省略解码流程)
// ALSA 输出 PCM
snd_pcm_t *pcm_handle;
snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
snd_pcm_writei(pcm_handle, frame->data[0], frame->nb_samples);
}
3. GStreamer Pipeline
Qt 支持 GStreamer backend(需确保嵌入式系统已安装):
#include <QGst/Element>
#include <QGst/Pipeline>
void playMp3(const QString &file) {
QGst::ElementPtr pipeline = QGst::ElementFactory::make("playbin");
pipeline->setProperty("uri", "file://" + file);
pipeline->setState(QGst::StatePlaying);
}
要求:
- Qt 编译时启用 GStreamer (
-qt-gstreamer
)
- ARM64 系统安装 GStreamer plugins-base + plugins-good
4. MAD (libmad)
超轻量级 MP3 解码库(无浮点运算,适合低端嵌入式):
# libmad (交叉编译示例)
./configure --host=aarch64-linux-gnu CFLAGS="-Os"
代码片段:
#include <mad.h>
void decodeMp3(struct mad_stream *stream) {
while (mad_frame_decode(stream, &frame)) {
// ...处理 PCM...
alsa_write(pcm_data); // ALSA/PulseAudio输出
}
}
5. Mini Audio Libraries
- miniaudio:单文件音频库,支持 MP3(需启用 DR_MP3)。
- SDL2_mixer:简单跨平台接口。
选择建议
方案 | 优点 | 缺点 |
---|---|---|
FFmpeg + ALSA | 灵活高效 | ARM64优化和交叉编译较复杂 |
GStreamer | Qt集成方便 | 依赖较重 |
libmad | 极简、无浮点需求 | API较老旧 |
miniaudio/SDL2_mixer | API简单 | SDL可能引入额外开销 |
根据目标平台的存储、算力及现有依赖选择合适的方案。若已部署 GStreamer,优先推荐方案3;极端资源限制下可选 libmad。
内容由零声教学AI助手提供,问题来源于学员提问