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