随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

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();

 

posted on   飘杨......  阅读(1441)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
历史上的今天:
2014-07-14 Android ExpandableListView和ScrollView联用的一些注意事项
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示