qt 播放pcm音频

一、获取PCM音频

ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 -ac 2 -f s16le output.pcm

  • -acodec pcm_s16le:指定16位小端PCM编码格式(兼容性最佳)
  • -ar 44100:设置采样率为CD标准44.1kHz(可替换为16000/8000等)‌
  • -ac 2:保留立体声(单声道用 -ac 1)‌
  • -f s16le:强制输出二进制裸数据格式‌

二、播放

方式1:

复制代码
int main(int argc, char *argv[])
{
    qSetMessagePattern("[GUI]%{file}(%{line}): %{message}");
    QGuiApplication app(argc, argv);

    QFile file(argv[1]);    // 需要播放的音频
    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::SignedInt);   //使用无符号整数样本类型(如果在linux下显示支持UnSignedInt,但是实际打开会失败,改用SignedInt就可以了)

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

        QAudioOutput* audio = new QAudioOutput(fmt, qApp);
        audio->setVolume(QString(argv[2]).toFloat());
        audio->start(&file);
    }

    return app.exec();
}

方式2:

复制代码
int main(int argc, char *argv[])
{
    qSetMessagePattern("[GUI]%{file}(%{line}): %{message}");
    QGuiApplication app(argc, argv);

    QFile file(argv[1]);    // 需要播放的音频
    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::SignedInt);   //使用无符号整数样本类型(如果在linux下显示支持UnSignedInt,但是实际打开会失败,改用SignedInt就可以了)

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

        QAudioOutput* audio = new QAudioOutput(fmt, qApp);  
        audio->setVolume(QString(argv[2]).toFloat());
        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 audio;
        audio = nullptr;
    }

    return app.exec();
}

觉得有帮助的话,打赏一下呗。。

需要商务合作(定制程序)的欢迎私信!!

相关推荐
Android系统攻城狮4 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
redfred14 小时前
HyperFrames 部署教程:5.6 万 Star 开源「写 HTML 出视频」框架,Windows 从零上手(CLI 三条命令 + 7 个避坑)
ffmpeg·开源·自动化·html·音视频
martindelophy15 小时前
用自然语言剪视频:我们在 Timeline Studio 中实现了 ChatCut 对话剪辑
android·音视频
特视界说15 小时前
没有完整 3D 模型,能做产品三维动画吗?
3d·微信·音视频·新浪微博
特视界说15 小时前
产品宣传动画和企业宣传片有什么区别,应该先做哪个?
微信·音视频·新浪微博·新人首发
bluebonnet2715 小时前
【docker】容器内映射外部音频驱动
docker·容器·音视频
可乐鸡翅yeah_1 天前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8
企业数字化笔记1 天前
视频理解怎样从“看见”变成“判断”?几何规则、轨迹特征与动作模型的选型
音视频
小猴子爱上树1 天前
跨马翻译:批量图片翻译+视频字幕+智能抠图,跨境电商在线图片翻译工具
大数据·人工智能·python·音视频
阿明副业观察2 天前
AI视频创作流程怎么做?完整指南与工具推荐
大数据·人工智能·aigc·音视频·ai写作