admin 管理员组

文章数量: 1086019

Qt6.3.1播放音频文件QAudioSink

1、概述

  案例:使用Qt播放pcm音频文件。

  步骤:

    1.自定义一个QIODevice

    2.封装XAudioPlayer,调用步骤如下

      a.创建QMediaDevices

      b.从QMediaDevices中获取默认的音频播放设备QAudioDevice

      c.从QAudioDevice中获取播放格式QAudioFormat

      d.创建QAudioSink,并将默认音频输出设备和格式传递进去,之后的暂停,继续,开始、停止操作全部都是通过QAudioSink来操作的

    3.调用startPlay方法播放

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

2、代码示例

  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 2qDebug("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();

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文标签: Qt631播放音频文件QAudioSink