Qt实现pcm音频播放

16 篇文章 86 订阅

qt实现pcm音频播放

更多精彩内容
👉个人内容分类汇总 👈

方法一

  • 在pro文件中添加multimedia模块
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QDebug>

#pragma execution_character_set("utf-8")

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("./out.pcm");    // 需要播放的音频
    if (file.open(QIODevice::ReadOnly))
    {
        qDebug() << "打开成功!";
        QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
        qDebug() << info.supportedSampleTypes();   // 输出支持的样本类型列表。
        qDebug() << info.supportedByteOrders();    // 输出支持的字节顺序列表
        qDebug() << info.supportedCodecs();        // 输出可用编码器
        qDebug() << info.supportedSampleRates();   // 输出支持的采样率

        QAudioFormat fmt;
        fmt.setSampleRate(44100);   // 设置采样率
        fmt.setSampleSize(16);      // 设置样本大小
        fmt.setChannelCount(2);     // 设置使用双通道
        fmt.setCodec("audio/pcm");  // 设置编解码器
        fmt.setByteOrder(QAudioFormat::LittleEndian);   // 使用小端
        fmt.setSampleType(QAudioFormat::UnSignedInt);   //使用无符号整数样本类型(如果在linux下显示支持UnSignedInt,但是实际打开会失败,改用SignedInt就可以了)

        if (!info.isFormatSupported(fmt))
        {
            qDebug() << "输出设备不支持该格式,不能播放音频";
            return 0;
        }

        //QAudioOutput audio(fmt, qApp);
        //audio.start(&file);
        QAudioOutput* audio = new QAudioOutput(fmt, qApp);  // 注意:这里QAudioOutput必须使用指针,否则不能播放
        audio->start(&file);
        delete audio;
        audio = nullptr;
    }

    return a.exec();
}

方法二

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QAudioFormat>
#include <QAudioOutput>
#include <QDebug>
#include <QThread>

#pragma execution_character_set("utf-8")

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("./out.pcm");
    if (file.open(QIODevice::ReadOnly))
    {
        qDebug() << "打开成功!";
        QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
        qDebug() << info.supportedSampleTypes();   // 输出支持的样本类型列表。
        qDebug() << info.supportedByteOrders();    // 输出支持的字节顺序列表
        qDebug() << info.supportedCodecs();        // 输出可用编码器
        qDebug() << info.supportedSampleRates();   // 输出支持的采样率

        QAudioFormat fmt;
        fmt.setSampleRate(44100);   // 设置采样率
        fmt.setSampleSize(16);      // 设置样本大小
        fmt.setChannelCount(2);     // 设置使用双通道
        fmt.setCodec("audio/pcm");  // 设置编解码器
        fmt.setByteOrder(QAudioFormat::LittleEndian);   // 使用小端
        fmt.setSampleType(QAudioFormat::UnSignedInt);   // 使用无符号整数样本类型

        if (!info.isFormatSupported(fmt))
        {
            qDebug() << "输出设备不支持该格式,不能播放音频";
            return 0;
        }

        QAudioOutput* audio = new QAudioOutput(fmt, qApp);  // 注意:这里QAudioOutput必须使用指针,否则不能播放
        QIODevice* io = audio->start();
        int size = audio->periodSize();     // 这是每个周期防止缓冲区欠载和确保不间断播放所需的数据量。
        QByteArray buf = file.readAll();    // 将需要播放的音频数据读到buf中
        file.close();

        while (!buf.isEmpty())
        {
            if (audio->bytesFree() < size)   // 音频缓冲区中可用的空闲字节数,判断缓冲区是否可写入数据。
            {
                QThread::msleep(1);
                continue;
            }

            io->write(buf.mid(0, size));   // 写入需要播放的数据
            buf.remove(0, size);
            qDebug() << buf.count();
        }

        io->close();
        delete io;
        io = nullptr;
    }

    return a.exec();
}


Qt播放PCM音频,你可以使用QAudio类及其相关的子类。以下是一个基本的步骤: 1. **设置音频设备和格式**: 首先,你需要创建一个`QAudioDeviceInfo`对象,它代表系统的音频输入或输出设备。然后选择一个合适的音频格式,如QAudioFormat::Format_PCM_16Bit。 ```cpp QAudioDeviceInfo deviceInfo(QAudioDeviceInfo::defaultInputDevice()); QAudioFormat format; format.setSampleRate(44100); format.setChannelCount(2); // 双声道 format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleSize(16); ``` 2. **创建音频输出流**: 使用`QAudioOutput`类创建一个音频输出流,并将设备信息和格式设置到流中。 ```cpp QAudioOutput audioOutput(deviceInfo, format); if (!audioOutput.open(QIODevice::ReadOnly)) { qWarning() << "Failed to open audio output: " << audioOutput.errorString(); } ``` 3. **读取和播放PCM数据**: PCM数据通常存储在一个文件或者内存缓冲区中。你可以读取PCM数据并逐帧发送给音频输出流。 ```cpp QByteArray pcmData; // 假设已经从文件读取到pcmData audioOutput.start(); while (pcmData.size()) { qint64 bytesPlayed = audioOutput.write(pcmData.data(), pcmData.size()); if (bytesPlayed < 0) { qWarning() << "Error playing audio: " << audioOutput.errorString(); break; } pcmData.remove(0, bytesPlayed); } audioOutput.stop(); ``` 4. **处理错误和结束**: 在整个播放过程中,记得检查错误并正确关闭资源。 ```cpp audioOutput.close(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值