今天给大家讲说一个新的东西,使用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. 解决EditText不能撑满全屏的问题及EditText你应该知道的属性

    一般我们要实现去下图一的效果很简单: 两个EditText就搞定 效果图一:   但是我们想让第二个EditText撑满剩余空间怎么做?如效果图二 效果图二: 解决: 使用了ScrollView嵌套L ...

  2. 浅谈echo、print、var_dump()、print_r()的区别

    1.echo 和 print 的区别 共同点:首先echo 和 print 都不是严格意义上的函数,他们都是语言结构;他们都只能输出 字符串,整型跟int型浮点型数据.不能打印复合型和资源型数据: 而 ...

  3. 如何使用第三方webservice

    webservice地址后加wdls 生成后把文件名改为wdsl 调用方式: 1.添加webservice引用: 2.生成代理类的方法(本人比较喜欢用这种方式): 使用cmd命令行: a.通过webs ...

  4. 51单片机I/O口直接输入输出实例(附调试及分析过程)

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  5. 2017-4-18 ADO.NET

    1.什么是ADO.NET?     (是一种数据库访问技术) ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问 ...

  6. 《Vue2.0 实践揭秘》终于出版啦!

    不知不觉间在园子开博都两年多了,最近一些园友问最近去哪了为何都没有新的文章了.最近确实发生了很多的事,一是忙工作二就是忙着写书.这还得多些园子的小编,自两年前发表的"架构师修炼"系 ...

  7. 局域网内补丁更新80072EE2错误

    在公网中,80072ee2通常是在进行自动更新时遇到的连接性错误.通常由于三防杀毒软件或者浏览器,代理服务器设置不正确而导致的.那么如果是在局域网中遇到该问题,该如何解决呢? 错误截图: 1.首先确认 ...

  8. Homebrew - macOS 不可或缺的套件管理器

    一.Homebrew 是什么? Unix/Linux 安装软件的时候有个很常见.也很令人头疼的事情,那就是软件包依赖.值得高兴的是,当前主流的 Linux 两大发行版本都自带了解决方案,Red hat ...

  9. js图片轮播

    html部分 <a href="" id="pta"><div id="picture" class="pt&q ...

  10. JavaScript利用闭包循环绑定事件

    我们经常在做前端面试题的时候,会遇到循环绑定事件后,输出打印结果,很多人总是搞不清楚,今天借此机会跟大家梳理一下闭包相关作用. 1.首先我们举一个简单的例子. html部分: <a href=& ...