ZBLOG

目标平台为 ARM64 嵌入式 linux 的基于 Qt 5.14库的C++程序需要播放一个 .mp3 音频文件,除了使用 QMediaPlayer,还有什么方法吗?

在 ARM64 嵌入式 Linux 平台上,除了 QMediaPlayer,还可以通过以下方法实现 MP3 播放(需根据平台资源权衡选择):


1. 使用 Qt Multimedia 的底层接口

如果 QMediaPlayer 因依赖过多或性能问题不适用,可以尝试直接调用 Qt Multimedia 的底层音频接口:

  1. #include <QAudioOutput>
  2. #include <QFile>
  3. // 解码 MP3 后播放 PCM 数据(需自行处理解码)
  4. void playPcmData(const QByteArray &pcmData, const QAudioFormat &format) {
  5. QAudioOutput *audio = new QAudioOutput(format);
  6. audio->start(); // 输出到默认设备
  7. audio->write(pcmData); // 写入 PCM 数据
  8. }

注意:需要先通过其他库(如 FFmpeg)将 MP3 解码为 PCM。


2. 集成 FFmpeg + ALSA/PulseAudio

FFmpeg 轻量级解码 + ALSA 直接输出,适合资源受限环境:

  1. # 交叉编译 FFmpeg (示例配置)
  2. ./configure --target-os=linux --arch=aarch64 --enable-cross-compile \
  3. --disable-x86asm --enable-small --disable-programs \
  4. --enable-decoder=mp3 --enable-demuxer=mp3

代码示例:

  1. extern "C" {
  2. #include <libavcodec/avcodec.h>
  3. #include <alsa/asoundlib.h>
  4. }
  5. void playMp3(const char *filename) {
  6. // FFmpeg 解码 MP3...
  7. AVFrame *frame = av_frame_alloc();
  8. // ...(省略解码流程)
  9. // ALSA 输出 PCM
  10. snd_pcm_t *pcm_handle;
  11. snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
  12. snd_pcm_writei(pcm_handle, frame->data[0], frame->nb_samples);
  13. }

3. GStreamer Pipeline

Qt 支持 GStreamer backend(需确保嵌入式系统已安装):

  1. #include <QGst/Element>
  2. #include <QGst/Pipeline>
  3. void playMp3(const QString &file) {
  4. QGst::ElementPtr pipeline = QGst::ElementFactory::make("playbin");
  5. pipeline->setProperty("uri", "file://" + file);
  6. pipeline->setState(QGst::StatePlaying);
  7. }

要求

  • Qt 编译时启用 GStreamer (-qt-gstreamer)
  • ARM64 系统安装 GStreamer plugins-base + plugins-good

4. MAD (libmad)

超轻量级 MP3 解码库(无浮点运算,适合低端嵌入式):

  1. # libmad (交叉编译示例)
  2. ./configure --host=aarch64-linux-gnu CFLAGS="-Os"

代码片段:

  1. #include <mad.h>
  2. void decodeMp3(struct mad_stream *stream) {
  3. while (mad_frame_decode(stream, &frame)) {
  4. // ...处理 PCM...
  5. alsa_write(pcm_data); // ALSA/PulseAudio输出
  6. }
  7. }

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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23632

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?