Qt6.3.1播放音频文件QAudioSink
一、概述
案例:使用Qt播放pcm音频文件。
步骤:
1.自定义一个QIODevice
2.封装XAudioPlayer,调用步骤如下
a.创建QMediaDevices
b.从QMediaDevices中获取默认的音频播放设备QAudioDevice
c.从QAudioDevice中获取播放格式QAudioFormat
d.创建QAudioSink,并将默认音频输出设备和格式传递进去,之后的暂停,继续,开始、停止操作全部都是通过QAudioSink来操作的
3.调用startPlay方法播放
二、代码示例
1.XIODevice.h 自定义QIODevice头文件
#ifndef XIODEVICE_H #define XIODEVICE_H #include <QObject> #include <QFile> #include <QIODevice> class XIODevice : public QIODevice { public: XIODevice(); ~XIODevice(); void start(); void stop(); qint64 readData(char *data,qint64 maxlen) override; qint64 writeData(const char *data, qint64 len) override; private: QFile inputFile; }; #endif // XIODEVICE_H
2.XIODevice.cpp文件
#include "xiodevice.h" #include <QDebug> XIODevice::XIODevice() { inputFile.setFileName("D:/wei.yang/tony/tool/qtworkspace/XPlayer/out.pcm"); inputFile.open(QIODevice::ReadOnly); } void XIODevice::start(){ open(QIODevice::ReadOnly); } void XIODevice::stop(){ close(); } /** * 扬声器缺少数据时会自动调用这个方法 * @brief XAudioPlayer::readData * @param data * @param maxlen * @return */ qint64 XIODevice::readData(char *data,qint64 maxlen){ inputFile.read(data,maxlen); qDebug()<<"读取文件数据:"<<maxlen; return maxlen; } qint64 XIODevice::writeData(const char *data, qint64 len){ Q_UNUSED(data); Q_UNUSED(len); return 0; } XIODevice::~XIODevice() { inputFile.close(); }
3.XAudioPlayer.h头文件
#ifndef XAUDIOPLAYER_H #define XAUDIOPLAYER_H #include <QObject> #include <QFile> #include <QIODevice> #include <QAudioFormat> #include <QMediaDevices> #include <QAudioSink> #include <QAudioDevice> #include "xiodevice.h" class XAudioPlayer : public QObject { Q_OBJECT public: explicit XAudioPlayer(QObject *parent = nullptr); ~XAudioPlayer(); void onPause(); void onResume(); void startPlay(); void stopPlay(); private: QAudioSink *audioSink; QMediaDevices *outputDevices; QAudioDevice outputDevice; QAudioSink *audioSinkOutput; XIODevice *xIoDevice; signals: }; #endif // XAUDIOPLAYER_H
4.XAudioPlayer.cpp文件
#include "xaudioplayer.h" #include <QDebug> XAudioPlayer::XAudioPlayer(QObject *parent) : QObject{parent} { outputDevices = new QMediaDevices(this); outputDevice = outputDevices->defaultAudioOutput(); QAudioFormat format = outputDevice.preferredFormat(); // ChannelConfigStereo is 2, Int16 is 2 qDebug("sampleRate: %d, channelCount: %d, sampleFormat: %d", format.sampleRate(), format.channelCount(), format.sampleFormat() ); xIoDevice = new XIODevice(); audioSinkOutput = new QAudioSink(outputDevice, format); // xIoDevice->start(); // audioSinkOutput->start(xIoDevice); } /** * 开始 * @brief XAudioPlayer::startPlay */ void XAudioPlayer::startPlay(){ xIoDevice->start(); audioSinkOutput->start(xIoDevice); } /** * 停止 * @brief XAudioPlayer::stopPlay */ void XAudioPlayer::stopPlay(){ xIoDevice->stop(); audioSinkOutput->stop(); } /** * 暂停 * @brief onPause */ void XAudioPlayer::onPause(){ audioSinkOutput->suspend(); } /** * 继续 * @brief onResume */ void XAudioPlayer::onResume(){ audioSinkOutput->resume(); } /** * 析构函数 * @brief XAudioPlayer::~XAudioPlayer */ XAudioPlayer::~XAudioPlayer(){ xIoDevice->stop(); audioSinkOutput->stop(); }
5.外部类调用XAudioPlayer并执行播放函数
XAudioPlayer audioPlayer;
audioPlayer.startPlay();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2014-07-14 Android ExpandableListView和ScrollView联用的一些注意事项