头文件

class QByteArray;
class QAudioOutput;
class QIODevice;
class CAudioMonitorThread : public QThread
{Q_OBJECTpublic:CAudioMonitorThread(QObject *parent = nullptr);~CAudioMonitorThread();void Stop();
protected:void run() override;
private slots:void OnstateChanged(QAudio::State);
private:bool m_bStop = false;std::shared_ptr<QBuffer>  m_audioBuffer = nullptr;std::shared_ptr<QByteArray> m_pByte = nullptr;std::shared_ptr<QAudioOutput>  out = nullptr;QIODevice *io = nullptr;
};

实现:

#include "CAudioMonitorThread.h"
#include "CCommandInterface.h"
#include "CMutilQueues.h"
#include <QUrl>
#include <QBuffer>
#include <QAudioFormat>
#include <QAudioOutput>
#include "CGoogleLog.h"
CAudioMonitorThread::CAudioMonitorThread(QObject *parent): QThread(parent)
{m_pByte.reset(new QByteArray);m_audioBuffer.reset(new QBuffer(m_pByte.get()));QAudioFormat fmt; //通过fmt设定音频数据格式。只有明确知道音频数据的声道数、采样率、采样位数,才可以正常地播放fmt.setSampleRate(44100);  //设定播放采样频率为44100Hz的音频文件fmt.setSampleSize(16);     //设定播放采样格式(采样位数)为16位(bit)的音频文件。QAudioFormat支持的有8/16bit,即将声音振幅化为256/64k个等级fmt.setChannelCount(1);    //设定播放声道数目为2通道(立体声)的音频文件。mono(平声道)的声道数目是1,stero(立体声)的声道数目是2fmt.setCodec("audio/pcm"); //播放PCM数据(裸流)得设置编码器为"audio/pcm"。"audio/pcm"在所有的平台都支持,也就相当于音频格式的WAV,以线性方式无压缩的记录捕捉到的数据。如想使用其他编码格式 ,可以通过QAudioDeviceInfo::supportedCodecs()来获取当前平台支持的编码格式fmt.setByteOrder(QAudioFormat::LittleEndian); //设定字节序,以小端模式播放音频文件fmt.setSampleType(QAudioFormat::UnSignedInt); //设定采样类型。根据采样位数来设定。采样位数为8或16位则设置为QAudioFormat::UnSignedIntout.reset(new QAudioOutput(fmt));io = out->start(); //调用start函数后,返回QIODevice对象的地址io->open(QIODevice::ReadWrite);connect(out.get(), SIGNAL(stateChanged(QAudio::State)), this, SLOT(OnstateChanged(QAudio::State)));
}CAudioMonitorThread::~CAudioMonitorThread()
{
}void CAudioMonitorThread::Stop()
{m_bStop = true;
}void CAudioMonitorThread::run()
{int size = out->periodSize();std::shared_ptr<char> buffer(new char[size], std::default_delete<char[]>());memset(buffer.get(), 0x00, size);while (!m_bStop){//获取音频信息CCommandAudio * pCommand = (CCommandAudio*)CMutilQueues::GetData(EQueueId::AUDIO);if (pCommand == nullptr){continue;}//放入buffQByteArray byt = pCommand->GetResult();m_audioBuffer->open(QIODevice::ReadWrite);m_audioBuffer->write(byt);m_audioBuffer->seek(0);//读取buff送入声卡while (!m_audioBuffer->atEnd()){memset(buffer.get(), 0x00, size);if (out->bytesFree() == 0)//声卡缓冲区无空闲时不写数据,跳过{continue;}if (m_audioBuffer->read(buffer.get(), size) <= 0)  //从缓冲据读取数据 ,如果读取到文件末尾或者读取不成功则通过break函数跳出while循环{break;}io->write(buffer.get(), size); //调用write函数将内存buf中的PCM数据写入到扬声器,即把buf中的数据提交到声卡发声}m_audioBuffer->close();//没有进入消息循环的event需要手动释放delete pCommand;pCommand = nullptr;}io->close();
}void CAudioMonitorThread::OnstateChanged(QAudio::State newState)
{switch (newState){case QAudio::IdleState:LOG(INFO) << "QAudio::IdleState";break;case QAudio::StoppedState:LOG(INFO) << "QAudio::StoppedState";break;case QAudio::SuspendedState:LOG(INFO) << "QAudio::SuspendedState";break;case QAudio::ActiveState:LOG(INFO) << "QAudio::ActiveState";break;default:break;}
}

QT QAudioOutput+QIODevice 音频流实时播放相关推荐

  1. Qt5 QAudioOutput+QIODevice 播放固定频率的声音

    首先界面如下: 1.在.pro文件中加入 QT += multimediawidgets 本例采用QAudioOutput + QIODevice 实现音频播放 ,构造一个派生自 QIODevice ...

  2. Qt音视频开发26-ffmpeg播放器

    一.前言 用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件 ...

  3. YOLOv5 Qt 手势车载中控音乐播放器

    资源: 配置工程:Python&Qt--yolov5手势识别隔空操纵车载音乐播放器(点击查看) 工程资源:YOLOv5 & Qt 手势车载中控音乐播放器v2(点此下载) 老工程资源:Y ...

  4. Android开发之PCM录音实时播放的实现方法 | 边录音边播放 |PCM录音播放无延迟 | 录音无杂音 | 录音无噪音

    先说下录音得开启录音权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 然后录音 ...

  5. 音视频开发(16)---海康IPC+NVR+EasyDarwin+EasyPusher+VLC实现Web实时播放RTSP视频

    海康IPC+NVR+EasyDarwin+EasyPusher+VLC实现Web实时播放RTSP视频 用ffmpeg+nginx实现web播放rtsp视频,原理是将rtsp转码成rtmp格式,再用fl ...

  6. 采集rtsp流摄像头到浏览器实时播放方案

    本文旨在实现使用摄像头采集视频,并且可以在网页实时显示,主要参考的两篇博文为:  1.  视频实时显示的三种方案   2.  使用WebSockets进行HTML5视频直播   我们使用博文1介绍的第 ...

  7. VUE项目中优雅使用EasyPlayer实时播放摄像头多种格式视频

    EasyPlayer 介绍 简介:集播放http-flv, hls, websocket 于一身的H5视频直播/视频点播播放器, 使用简单, 功能强大: 功能支持: 支持 MP4 播放 支持 m3u8 ...

  8. HTML 直播 RTMP流实时播放

    HTML 直播 RTMP流实时播放 直接帖代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  9. 基于QT平台的手持媒体播放器项目实战视频教程下载

    分享一套关于在QT平台的手持媒体播放器项目实战的视频教程,Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架. 它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工 ...

  10. vue项目中使用flv.js实时播放 断流重连 关闭断流开发心得

    第一次碰这个东西肯定会碰壁的,问百度人都问傻了(关键还骗人),其中心酸不必多描述,只为成长 后来项目更新采用的是EasyPlayer插件 文章地址: VUE项目中优雅使用EasyPlayer 后端是流 ...

最新文章

  1. Nginx 的内置变量
  2. python基础一 -------如何在列表字典集合中根据条件筛选数据
  3. AbstractBeanFactory 生产Bean 实例对象
  4. 为什么不可以使用哈曼顿距离_请对比下欧式距离和曼哈顿距离的差别
  5. sql java驱动程序_Microsoft SQL Server JDBC 驱动程序支持矩阵
  6. java无权图求最短路径_求有权图和无权图的最短路径
  7. h5 右下角浮动按钮_意派Epub360丨国庆黄金周将至,分享9个H5互动营销思路
  8. aaa dot1x (cisco)
  9. JAVASCRIPT 上传文件的几种方式
  10. MapGis二次开发环境部署
  11. 【JAVA-UT】13、什么是依赖?
  12. Android适配全面屏,三星S8的18.9,小米mix全面屏
  13. 数字化转型指数2020DTI
  14. 大气的品牌化妆品官网模板
  15. 利用COCO API测试自己数据集训练的YOLOv3模型的mAP(VOC格式数据集)
  16. python爬虫爬取实习僧岗位信息并存入excel数据表中
  17. ahk实现共性与特化
  18. 大数据在政府中的应用案例
  19. 【数据压缩】TGA文件格式分析
  20. 平台经济反垄断,未来三年开放式金融创新机会在何处?

热门文章

  1. php 发送curl跨域请求,php跨域传输(curl)
  2. TMC2226-SA:静音防抖步进驱动
  3. ipad iphone开发_如何在iPad或iPhone上使用外部GPS设备
  4. 下载网页 TS视频并自动合成视频
  5. 清华大学 谭浩强c语言课件,C语言课件 清华大学谭浩强版C3
  6. 关闭笔记本电脑计算机键盘,笔记本电脑关闭键盘_笔记本电脑怎么关键盘
  7. m6000查看端口状态_M6000日常查看维护命令.doc
  8. java编译器eclipse_java编译器eclipse
  9. hp刀片服务器性能分析,IBM刀片服务器与高性能计算-20210723075634.ppt-原创力文档...
  10. 惠普z800工作站bios设置_惠普台式机装win10系统及bios设置(uefi+gpt)