今天给大家讲说一个新的东西,使用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. effective c++ Item 48 了解模板元编程

    1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...

  2. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

  3. [HAOI2006]受欢迎的牛

    洛谷传送门 直接tarjan求scc,然后统计出度为0的缩点,如果多余1个就输出0,只有一个就输出这个缩点里的点. --代码 #include <cstdio> #include < ...

  4. Oracle自动备份.bat 最新更新(支持Win10了)

    20170418更新: 很多年没有用了,最近两天打开来用,发现在Win10下面At命令已经被淘汰不能使用了,还有不少命令工作方式和原来也不一样了 所以就更新了一下下,使用 schtasks 命令代替了 ...

  5. HTML在网页中插入音频视频简单的滚动效果

    每次上网,打开网页后大家都会看到在网页的标签栏会有个属于他们官网的logo,现在学了HTML了,怎么不会制作这个小logo呢,其实很简单,也不需要死记硬背,每当这行代码出现的时候能知道这是什么意思就o ...

  6. 【转】JDBC学习笔记(3)——复习和练习

    转自:http://www.cnblogs.com/ysw-go/ 复习部分 一.获取数据库连接 1)方式一 1 // 获取数据库连接 2 @Test 3 public void testGetCon ...

  7. js 数组方法总结

    Array数组: length属性 可通过array.length增加或者减少数组的长度,如;array.length=4(数组长3,第四位为undefined),也可单纯获得长度.array[arr ...

  8. Android Weekly Notes Issue #254

    Android Weekly Issue #254 April 23rd, 2017 Android Weekly Issue #254 本期内容包括: 如何用Kotlin写一个Gradle Plug ...

  9. DirectFB 之 字体显示

    通过本文,可以简单地了解directfb字体内部运行机制. 简介 SetFont函数,是每次写字体前必须调用的一个函数,否则directfb程序将会报错.这个函数是将某种字体与某个surface相关联 ...

  10. JAVA中令人疑惑的字符串

    Java中不同的字符串存在于同一个存储池中,字符串变量将指向存储池中相应的位置,也就是字符串变量里面包含的并不是字符串而是这个字符串对象的内存地址. String a = "123" ...