QT QAudioOutput+QIODevice 音频流实时播放
头文件
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 音频流实时播放相关推荐
- Qt5 QAudioOutput+QIODevice 播放固定频率的声音
首先界面如下: 1.在.pro文件中加入 QT += multimediawidgets 本例采用QAudioOutput + QIODevice 实现音频播放 ,构造一个派生自 QIODevice ...
- Qt音视频开发26-ffmpeg播放器
一.前言 用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件 ...
- YOLOv5 Qt 手势车载中控音乐播放器
资源: 配置工程:Python&Qt--yolov5手势识别隔空操纵车载音乐播放器(点击查看) 工程资源:YOLOv5 & Qt 手势车载中控音乐播放器v2(点此下载) 老工程资源:Y ...
- Android开发之PCM录音实时播放的实现方法 | 边录音边播放 |PCM录音播放无延迟 | 录音无杂音 | 录音无噪音
先说下录音得开启录音权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 然后录音 ...
- 音视频开发(16)---海康IPC+NVR+EasyDarwin+EasyPusher+VLC实现Web实时播放RTSP视频
海康IPC+NVR+EasyDarwin+EasyPusher+VLC实现Web实时播放RTSP视频 用ffmpeg+nginx实现web播放rtsp视频,原理是将rtsp转码成rtmp格式,再用fl ...
- 采集rtsp流摄像头到浏览器实时播放方案
本文旨在实现使用摄像头采集视频,并且可以在网页实时显示,主要参考的两篇博文为: 1. 视频实时显示的三种方案 2. 使用WebSockets进行HTML5视频直播 我们使用博文1介绍的第 ...
- VUE项目中优雅使用EasyPlayer实时播放摄像头多种格式视频
EasyPlayer 介绍 简介:集播放http-flv, hls, websocket 于一身的H5视频直播/视频点播播放器, 使用简单, 功能强大: 功能支持: 支持 MP4 播放 支持 m3u8 ...
- HTML 直播 RTMP流实时播放
HTML 直播 RTMP流实时播放 直接帖代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...
- 基于QT平台的手持媒体播放器项目实战视频教程下载
分享一套关于在QT平台的手持媒体播放器项目实战的视频教程,Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架. 它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工 ...
- vue项目中使用flv.js实时播放 断流重连 关闭断流开发心得
第一次碰这个东西肯定会碰壁的,问百度人都问傻了(关键还骗人),其中心酸不必多描述,只为成长 后来项目更新采用的是EasyPlayer插件 文章地址: VUE项目中优雅使用EasyPlayer 后端是流 ...
最新文章
- Nginx 的内置变量
- python基础一 -------如何在列表字典集合中根据条件筛选数据
- AbstractBeanFactory 生产Bean 实例对象
- 为什么不可以使用哈曼顿距离_请对比下欧式距离和曼哈顿距离的差别
- sql java驱动程序_Microsoft SQL Server JDBC 驱动程序支持矩阵
- java无权图求最短路径_求有权图和无权图的最短路径
- h5 右下角浮动按钮_意派Epub360丨国庆黄金周将至,分享9个H5互动营销思路
- aaa dot1x (cisco)
- JAVASCRIPT 上传文件的几种方式
- MapGis二次开发环境部署
- 【JAVA-UT】13、什么是依赖?
- Android适配全面屏,三星S8的18.9,小米mix全面屏
- 数字化转型指数2020DTI
- 大气的品牌化妆品官网模板
- 利用COCO API测试自己数据集训练的YOLOv3模型的mAP(VOC格式数据集)
- python爬虫爬取实习僧岗位信息并存入excel数据表中
- ahk实现共性与特化
- 大数据在政府中的应用案例
- 【数据压缩】TGA文件格式分析
- 平台经济反垄断,未来三年开放式金融创新机会在何处?
热门文章
- php 发送curl跨域请求,php跨域传输(curl)
- TMC2226-SA:静音防抖步进驱动
- ipad iphone开发_如何在iPad或iPhone上使用外部GPS设备
- 下载网页 TS视频并自动合成视频
- 清华大学 谭浩强c语言课件,C语言课件 清华大学谭浩强版C3
- 关闭笔记本电脑计算机键盘,笔记本电脑关闭键盘_笔记本电脑怎么关键盘
- m6000查看端口状态_M6000日常查看维护命令.doc
- java编译器eclipse_java编译器eclipse
- hp刀片服务器性能分析,IBM刀片服务器与高性能计算-20210723075634.ppt-原创力文档...
- 惠普z800工作站bios设置_惠普台式机装win10系统及bios设置(uefi+gpt)