关于QT中的音频通信问题

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

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

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

QAudioInput:音频采集的类

QIODevice:标准输入输出设备

QAudioOutput:数据音频的类

音频采集端口

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

1 QT      += multimedia
2 QT      += network

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

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

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

1 //音频传输的数据包格式
2 struct videoPack{
3     char    data[1024];
4     int     lens;
5 };

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

1         inputDevice = input->start ();
2         connect (inputDevice, SIGNAL(readyRead()),
3                  this, SLOT(onReadyRead()));

 1 void MainWindow::onReadyRead ()
 2 {
 3     qDebug() << "send audioinput....";
 4     videoPack vp;
 5     memset (&vp, 0, sizeof(vp));
 6     //读取音频数据
 7     vp.lens = inputDevice->read (vp.data, 1024);
 8     videoWriteSocket->writeDatagram((const char*)&vp,
 9                                     sizeof(vp),
10                                     QHostAddress("224.0.0.0"),
11                                     10000);
12 }

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

音频读取端口

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

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

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

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

1 void MainWindow::readyReadSlot ()
2 {
3     qDebug() << "video reveiver...";
4     videoPack vp;
5     memset (&vp, 0, sizeof(vp));
6     videoReadSocket->readDatagram ((char*)&vp, sizeof(vp));
7     outputDevice->write (vp.data, vp.lens);
8 }

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

时间: 2024-10-28 11:04:13

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

Qt的内部进程通信机制 [转]

Qt 作为一种跨平台的基于 C++ 的 GUI系统,能够提供给用户构造图形用户界面的强大功能.自从 1996 年 Qt 被 Trolltech公司发布以来,该系统成为世界上很多成功的图形用户应用所使用的主要系统.更为重要的是,Linux 操作系统的桌面环境系统 KDE 也是基于 Qt构造的.目前,Qt 已经提供了对包括 MS/Windows.Unix/X11 和嵌入式平台的支持,得到了越来越广泛的应用. 在 Qt 系统中,不仅有着构造完善的系统结构,而且为了满足用户对编写图形用户界面应用的种种需

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

1. Qt消息模型 (1)Qt封装了具体操作系统的消息机制 (2)Qt遵循经典的GUI消息驱动事件模型 2. 信号与槽 (1)Qt中定义了与系统消息相关的概念 ①信号(Signal):由操作系统产生的消息 ②槽(Slot):程序中的消息处理函数 ③连接(Connect):将系统消息绑定到消息处理函数(映射规则) (2)Qt中的消息处理机制 (3)Qt的核心——QObject::connect函数 ①函数原型 bool connect(const QObject* sender, //发送对象 c

QT中的SOCKET编程(QT-2.3.2)

转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 http://hi.baidu.com/landuochong/blog/item/08268100cf5b6783e950cda9.html 操作系统:ARM-LinuxQT版本:QT-2.3.2-FOR-LINUXGUI:Qtopia 在LINUX 下进行网络编程,我们可以使用LINUX提供的统

Qt 多线程同步 与 通信

转自网络 1 多线程同步 Qt提供了以下几个类来完成这一点:QMutex.QMutexLocker.QSemphore.QWaitCondition. 当然可能还包含QReadWriteLocker.QReadLocker.QWriteLocker,但线程同步是应用很少,这里只做简单的讲解! QMutex.QMutexLocker QMutex类提供了一个保护一段临界区代码的方法,他每次只允许一个线程访问这段临界区代码.QMutex::lock()函数用来锁住互斥量,如果互斥量处于解锁状态,当前

Qt学习 之 Socket通信

最近写大作业用到Qt的Socket部分,网上关于这部分的资料都太过复杂,现在总结一下一些简单的应用.有机会可以给大家讲讲用Socket传送文件的代码. 这里主要讲解如何实现TCP和UDP的简单通信. socket简介 在LINUX下进行网络编程,我们可以使用LINUX提供的统一的套接字接口.但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样那样的错误.QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作.而且它采用QT本身的sign

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

最近写大作业用到Qt的Socket部分,网上关于这部分的资料都太过复杂,现在总结一下一些简单的应用.有机会可以给大家讲讲用Socket传送文件的代码. 这里主要讲解如何实现TCP和UDP的简单通信. socket简介 在LINUX下进行网络编程,我们可以使用LINUX提供的统一的套接字接口.但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样那样的错误.QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作.而且它采用QT本身的sign

qt 关于Qt中MVC的介绍与使用

Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户.这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中. 模型 - 视图 - 控制器(MVC)是一种设计模式,由三类对象组成:模型:应用程序对象.视图:屏幕演示.控制器:定义了用户界面响应用户输入的方式. 在引入MVC之前,用户界面的设计往往是将这些对象组合在一起.MVC的解耦带来了灵活性和重用性. 如果视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了

如何修改音频通信质量?

动态修改音频通信质量主要是通过调节音频编码器的目标码率来实现的,可以满足在不同的应用中使用不同通话质量的需求,如局域网或是网络带宽有保障的应用,可以采用较高的通话质量,而互联网则采用较低的通话质量来降低带宽占用.同时也可以动态修改音频通话质量,在较好质量和一般通话质量之间动态切换.该特性需要AnyChat Platform Core SDK V2.8.7以上的版本才能支持. 可通过BRAC_SetSDKOption接口来设置单声道,或是双声道模式下的音频通信质量,典型设置代码如下: 1.DWOR

【Qt编程】音频播放

在上一篇文章中,我是在Qt4平台上调用本地发音的,后来由于用到JSON解析,就将平台转到了Qt5,因为Qt5自带解析JSON的类.然后发现上一篇文章的方法无法运行,当然网上可以找到解决方法,我在这里直接调用Qt自带的类进行网络音频播放和本地播放.比较适用于单词的网上发音和无网情况下的本地发音,而不用将音频文件下载下来,占用太多内存. 为了简便起见,工程里只有一个main.cpp文件,不要忘了在.pro文件中加入下面两行: QT += multimedia CONFIG += qaxcontain