今天给大家讲说一个新的东西,使用QT实现音频通信的功能,挺起来是不是很高大上啊,哈哈,实际上我们只是使用一些接口做一些简单的工作而已,并不是让你写一个传输协议和采集音频信息,好了,那我们就来说一说关于在QT中是实现音频通信的具体过程吧!

首先我们要是用到是UDP的通信协议和关于音频信息的采集类和标准的输入输出设别的类,那么我们分别是下面的几个类:

QUdpSocket:在QT用用于udp通信的类

QAudioInput:音频采集的类

QIODevice:标准输入输出设备

QAudioOutput:数据音频的类

音频采集端口

上边的用到的类中分别用到了网络模块和多媒体模块所以在工程文件中需要加入对网络和多媒体的支持(*.pro文件):

 QT      += multimedia
QT += network

首先我们在音频的采集端口需要设置音频采集的格式和传输的数据包的类型,使用QAudioInput的对象按指定的格式去采集音频数据,代码提供如下:

 MainWindow::MainWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置声音格式
QAudioFormat format;
format.setSampleRate (); //设置采样频率
format.setChannelCount (); //设置通道计数
format.setSampleSize (); //设置样本大小,一般为8或者16
format.setCodec ("audio/pcm"); //设置编码格式
format.setSampleType (QAudioFormat::SignedInt); //设置采样类型
format.setByteOrder (QAudioFormat::LittleEndian); //设置字节序为小端字节序 input = new QAudioInput(format, this); videoWriteSocket = new QUdpSocket(this);
}

  接下来我们要定义音频信息在网络间传输的数据包格式:

 //音频传输的数据包格式
struct videoPack{
char data[];
int lens;
};

  现在我们将音频数据能够采集出来了,接下来就是将音频的数据写入标准输入设备最后写到广播端口,写入:

         inputDevice = input->start ();
connect (inputDevice, SIGNAL(readyRead()),
this, SLOT(onReadyRead()));
 void MainWindow::onReadyRead ()
{
qDebug() << "send audioinput....";
videoPack vp;
memset (&vp, , sizeof(vp));
//读取音频数据
vp.lens = inputDevice->read (vp.data, );
videoWriteSocket->writeDatagram((const char*)&vp,
sizeof(vp),
QHostAddress("224.0.0.0"),
);
}

好了,通过上边的步骤,那么你就能够将音频数据将它按指定的格式写入广播端口了,接下来就只需要在读取端口读取我们的音频信息就可以了。

音频读取端口

    首先我们要在读取端口这边设置和音频采集端口的音频采集格式和传输的数据包类型严格的一致,不然的话你是不能处理音频信息的。

好了,接下来我们就来看一看如何使用udp的端口读取音频信息吧,代码如下:

 MainWindow::MainWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//窗口udp的套接字对象
videoReadSocket = new QUdpSocket(this);
//绑定到广播端口
videoReadSocket->bind (QHostAddress::AnyIPv4, ,
QUdpSocket::ShareAddress
| QUdpSocket::ReuseAddressHint);
//加入广播组
videoReadSocket->joinMulticastGroup (QHostAddress("224.0.0.0"));
//如果有套接字动作将会触发readyRead信号,我们将读取音频信息
connect(videoReadSocket, SIGNAL(readyRead()),
this, SLOT(readyReadSlot()));
//设置声音格式
QAudioFormat format;
format.setSampleRate (); //设置采样频率
format.setChannelCount (); //设置通道计数
format.setSampleSize (); //设置样本大小,一般为8或者16
format.setCodec ("audio/pcm"); //设置编码格式
format.setSampleType (QAudioFormat::SignedInt); //设置采样类型
format.setByteOrder (QAudioFormat::LittleEndian); //设置字节序为小端字节序
output = new QAudioOutput(format, this); //开启读取音频数据的接口
outputDevice = output->start ();
}

那好我们再来看一看在readyReadSlot的槽函数的处理代码吧

 void MainWindow::readyReadSlot ()
{
qDebug() << "video reveiver...";
videoPack vp;
memset (&vp, , sizeof(vp));
videoReadSocket->readDatagram ((char*)&vp, sizeof(vp));
outputDevice->write (vp.data, vp.lens);
}

经过上边一系列过程,那么我们可以试一试,是不是已经可以接受到音频的信息了呢,另外说一句,在构造函数的中用到的对象,我都将他声明在了这个类的声明中,以私有成员的形式出现在了类中,我就不予给出了,大家自己在头文件中加入相应的声明就行了。

关于QT中的音频通信问题的更多相关文章

  1. QT中的C/S通信问题:关于服务器端readyread()信号不发射

    在windows下用QT测试C/S通信的时候,遇到服务器端不能读取客户端发来的数据的问题. 后来设置断点检查错误,发现是readyread信号不触发的原因. 后来在客户端写socket后面加了一句so ...

  2. Qt中使用ActiveX(3篇)

    由于最近需要使用ActiveX,一般来说可以使用微软提供的MFC或者ATL框架来开发,由于我个人对这部分内容不是很熟悉,好在Qt也提供对于ActiveX的支持.本文主要记录个人学习ActiveX的一些 ...

  3. QT中的SOCKET编程(QT-2.3.2)

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  4. Qt学习 之 Socket通信(世界上最简单的例子了)

    最近写大作业用到Qt的Socket部分,网上关于这部分的资料都太过复杂,现在总结一下一些简单的应用.有机会可以给大家讲讲用Socket传送文件的代码. 这里主要讲解如何实现TCP和UDP的简单通信. ...

  5. Qt 的内部进程通信机制

    Qt 的内部进程通信机制 续欣 (xxin76@hotmail.com), 博士.大学讲师 2004 年 4 月 01 日 Qt 作为一种跨平台的基于 C++ 的 GUI 系统,能够提供给用户构造图形 ...

  6. Android智能手机中各种音频场景下的audio data path

    上一篇文章(Android智能手机上的音频浅析)说本篇将详细讲解Android智能手机中各种音频场景下的音频数据流向,现在我们就开始.智能手机中音频的主要场景有音频播放.音频录制.语音通信等.不同场景 ...

  7. QT创建TCP Socket通信

    最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...

  8. Qt中使用的C++知识和技能-你必须要了解的

    如果你不确定在使用Qt编程时自己所掌握的C++知识是否够用,这一节的内容会帮到你.这里给出了Qt自身以及在使用Qt进行编程时涉及到的C++知识,因此,通过阅读本节,你会了解你是否缺少一些C++技能. ...

  9. 第10课 初探 Qt 中的消息处理

    1. Qt消息模型 (1)Qt封装了具体操作系统的消息机制 (2)Qt遵循经典的GUI消息驱动事件模型 2. 信号与槽 (1)Qt中定义了与系统消息相关的概念 ①信号(Signal):由操作系统产生的 ...

随机推荐

  1. vue实现简单表格组件

    本来想这一周做一个关于vuex的总结的,但是由于朋友反应说还不知道如何用vue去写一个组件,所以在此写写一篇文章来说明下如何去写vue页面或者组件.vue的核心思想就是组件,什么是组件呢?按照我的理解 ...

  2. 聊聊 Tomcat 的单机多实例

    Tomcat 从何而来? 先说 Tomcat 这一单词解释,如果你不是一个开发者,当然它在美国口语中并非是褒义词:如果你是开发者,那你一定听过 Web 应用服务器.Sun 公司和 Tomcat .如你 ...

  3. 【one day one linux】find 用法详解小记

    find命令的功能很强大,查找文件的选项很多,所以这是一个很实用并且很常用的linux命令.但是他有个缺点就是搜索的时候比较慢的.而与之相对的有一个locate命令. find的命令格式 find   ...

  4. 利用Scrapy爬取所有知乎用户详细信息并存至MongoDB

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :崔庆才 本节分享一下爬取知乎用户所有用户信息的 Scrapy 爬虫实战. 本节目标 本节要实现的内容有 ...

  5. System.map详解

    system.map内容格式为:线性地址类型符号 具体内容如下: 00100000 A phys_startup_32 c0100000 T startup_32 c0100000 A _text   ...

  6. 通过 U 盘启动重装 macOS 系统

    重装系统是工作和生活中经常需要做的事情,作为一名开发人员,学会该技能你才是一名合格的程序猿!以后再也不会遇到"程旭元你会装系统吗?"的尴尬了!本文主要介绍怎样通过U盘启动重新安装 ...

  7. 转载 ~shell简介

    Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释 ...

  8. Transform java future into completable future 【将 future 转成 completable future】

    Future is introduced in JDK 1.5 by Doug Lea to represent "the result of an asynchronous computa ...

  9. VopSdk一个高逼格微信公众号开发SDK(源码下载)

    看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...

  10. Java中的StringTokenizer类

    /*//在java.util中的StringTokenizer类可以分析一个字符串并将字符串分解成可被独立使用的单词//1.StringTokenizer(String s)-----------为字 ...