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 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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值