今天给大家讲说一个新的东西,使用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. Angular.js学习笔记 (二)

    用A链接对象解析url的组成 var url = 'https://www.baidu.com:8080/aaa/1.html?id=10#name'; var aLink = document.cr ...

  2. CSharpGL(41)改进获取字形贴图的方法

    CSharpGL(41)改进获取字形贴图的方法 在(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-28-simplest-way-to-creating-fo ...

  3. 海康/大华 IpCamera RTSP地址和格式

    海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例如 ...

  4. .net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载

    在.net core中所有的请求都会被请求中间件所处理,所以我们可以通过在中间件里边添加对应的功能然后在服务中添加注入来实现对应的功能 文件位置:Startup.cs=>Configure方法, ...

  5. C#邮件发送开发经本人测试通过

    先准备以下工作 1.先开通邮箱我以QQ邮箱为例 2.开通 POP3/SMTP服务 (如何使用 Foxmail 等软件收发邮件?) 已开启 |  关闭 获取授权码 3.C#开发了先写一个CS文件 pub ...

  6. Linux防火墙配置—SNAT1

    1.实验目标 以实验"防火墙配置-访问外网WEB"为基础,在WEB服务器上安装Wireshark,设置Wireshark的过滤条件为捕获HTTP报文,在Wireshark中开启捕获 ...

  7. My SQL数据库的安装与配置

    MySQL是一个关系型数据库管理系统.MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言 MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小.速度快.总体拥有成本低,尤 ...

  8. Linux 基础(3)

    Linux 基础(三) rpm与yum学习 本篇分享一下自己学习rpm和yum过程中的一些心得,自己在使用yum过程中由于自己的虚拟机网络的问题在学习这一块品尝到不少苦头,还望学习这块的盆友先检查一下 ...

  9. java线程(二)

    线程范围变量 我们知道线程在cpu上的使用权并不是长时间的,因为计算机的cpu只有一个,而在计算上运行的进程有很多,线程就更不用说了,所以cpu只能通过调度来上多个线程轮流占用cpu资源运行,且为了保 ...

  10. 「七天自制PHP框架」第三天:PHP实现的设计模式

    往期回顾:「七天自制PHP框架」第二天:模型与数据库,点击此处 原文地址:http://www.cnblogs.com/sweng/p/6624845.html,欢迎关注:编程老头 为什么要使用设计模 ...