今天给大家讲说一个新的东西,使用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中的音频通信问题的更多相关文章
-
QT中的C/S通信问题:关于服务器端readyread()信号不发射
在windows下用QT测试C/S通信的时候,遇到服务器端不能读取客户端发来的数据的问题. 后来设置断点检查错误,发现是readyread信号不触发的原因. 后来在客户端写socket后面加了一句so ...
-
Qt中使用ActiveX(3篇)
由于最近需要使用ActiveX,一般来说可以使用微软提供的MFC或者ATL框架来开发,由于我个人对这部分内容不是很熟悉,好在Qt也提供对于ActiveX的支持.本文主要记录个人学习ActiveX的一些 ...
-
QT中的SOCKET编程(QT-2.3.2)
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
-
Qt学习 之 Socket通信(世界上最简单的例子了)
最近写大作业用到Qt的Socket部分,网上关于这部分的资料都太过复杂,现在总结一下一些简单的应用.有机会可以给大家讲讲用Socket传送文件的代码. 这里主要讲解如何实现TCP和UDP的简单通信. ...
-
Qt 的内部进程通信机制
Qt 的内部进程通信机制 续欣 (xxin76@hotmail.com), 博士.大学讲师 2004 年 4 月 01 日 Qt 作为一种跨平台的基于 C++ 的 GUI 系统,能够提供给用户构造图形 ...
-
Android智能手机中各种音频场景下的audio data path
上一篇文章(Android智能手机上的音频浅析)说本篇将详细讲解Android智能手机中各种音频场景下的音频数据流向,现在我们就开始.智能手机中音频的主要场景有音频播放.音频录制.语音通信等.不同场景 ...
-
QT创建TCP Socket通信
最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...
-
Qt中使用的C++知识和技能-你必须要了解的
如果你不确定在使用Qt编程时自己所掌握的C++知识是否够用,这一节的内容会帮到你.这里给出了Qt自身以及在使用Qt进行编程时涉及到的C++知识,因此,通过阅读本节,你会了解你是否缺少一些C++技能. ...
-
第10课 初探 Qt 中的消息处理
1. Qt消息模型 (1)Qt封装了具体操作系统的消息机制 (2)Qt遵循经典的GUI消息驱动事件模型 2. 信号与槽 (1)Qt中定义了与系统消息相关的概念 ①信号(Signal):由操作系统产生的 ...
随机推荐
-
Arduino 极速入门系列–1 点亮 LED
本篇内容为,使用 Arduino 点亮 LED 的做法示范.很简单的一个入门示范.我们让 LED 闪. 本篇使用到的工具和材料 Arduino Mini Pro 1 PCS Mini USB 数据线 ...
-
php:微信公众号token验证失败原因、验证码显示不出来的问题
ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的 ...
-
windows server 2008服务器 做raid0
dell服务器,启动后,根据提示按F10进入raid设置,设置成raid0 我们的服务器是4块硬盘,每块600G,做raid0时,生成一个虚拟磁盘vdisk. 做完raid之后,做OS部署 重启服务器 ...
-
CodeIgniter nginx 404
默认情况下CI 不支持路由模式需要在server里面配置,配置成如下即可: server { listen 80 ; server_name wechat.XX.com.cn; root XX; in ...
-
Atitit. 异常的使用总结最佳实践java .net php Vo8f
Atitit.java 异常的使用总结最佳实践 Vo8f 1. 为什么使用异常 1 2. 用throw抛出一个异常到catch子句中与通过函数调用传递一个参数两者基本相同. 2 3. S E H的主要 ...
-
linux 下安装gsl
访问 http://ftp.club.cc.cmu.edu/pub/gnu/gsl/下载最新版本的,现在最新的是gsl-1.16.tar.gz,已经是2013年更新的了.然后下载 安装 简便的安装过程 ...
-
npm总是安装不成功,而且很慢?
什么方法解决: 在cmd 里面先运行 npm config set registry "http://registry.npm.taobao.org" 然后再安装npm 就会很快 ...
-
Linux下I/O多路转接之epoll(绝对经典)
epoll 关于Linux下I/O多路转接之epoll函数,什么返回值,什么参数,我不想再多的解释,您不想移驾,我给你移来: http://blog.csdn.net/colder2008/artic ...
-
PHP 判断括号是否闭合
一开始的思路就是判断每种括号的开闭数量是否相等,其实虽然也能实现但是搞得太复杂了: 后来查了查,只需设一个常量,左括号 +1,右括号 -1,闭合的话为0,没闭合的话不为0, 出现<0即为顺 ...
-
MAC OX 配置 Tomcat 说明
1: 首先在官网下载 Tomcat(我选择的是最新的9.0) , http://tomcat.apache.org/ 2:下载完成之后将压缩包解压在/Library/下 可使用快捷键 control+ ...