TCP/IP 语音*

 参考文章:[QT 实现采集即时音频信号并发送至另一台电脑播放](https://blog.csdn.net/hanzhen7541/article/details/80152381)

记录一下一个研究成果

TCP通信必须先建立TCP连接,通信端分为客户端和服务器,QTcoSocket类 和 QTcpServer类。
QT音频 采用 QIODevice类采集和播放,QAudioFormat设置采集格式,包括编码格式,采样率,通道数。

.pro文件中加入
QT  +=network
QT +=multimedia

服务器端代码

.h
// An highlighted block
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QAudio>
#include <QAudioFormat>
#include <QAudioInput>
#include <QAudioOutput>
#include <QIODevice>namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QTcpSocket *tcpsocket;QTcpServer *tcpserver;QAudioInput *input;//音频采集QIODevice   *inputDevice;//播放QAudioOutput *output;QIODevice   *outputDevice;private slots:void onReadyRead();void readyReadSlot();//receive};#endif // MAINWINDOW_H
.cpp
// An highlighted block
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);tcpsocket = new QTcpSocket;tcpserver = new QTcpServer;//receivetcpserver->listen(QHostAddress::Any,8888);setWindowTitle("服务器端【端口号8888】") ;connect(tcpserver,&QTcpServer::newConnection,[=](){tcpsocket = tcpserver->nextPendingConnection();QString ip = tcpsocket->peerAddress().toString();int port = tcpsocket->peerPort();ui->textEdit->setText(QString("连接%1::%2").arg(ip).arg(port));//connect 一定要写在newConnection内connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));//receiv  important});QAudioFormat format; //采样设置format.setCodec("audio/pcm");//编码format.setByteOrder(QAudioFormat::LittleEndian);format.setSampleRate(8000);//采样评率format.setSampleSize(16);//采样点数据位数format.setSampleType(QAudioFormat::UnSignedInt);//返回采样点格式format.setChannelCount(1);//音频数据通道数input = new QAudioInput(format,this);//采用格式inputDevice = input->start();//采集声音output = new QAudioOutput(format,this);outputDevice = output->start();//开始播放connect(inputDevice,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onReadyRead()
{/*----------------------------------send************************/// qDebug()<<"It's sending audio!"<<endl;video vp;memset(&vp,0,sizeof(vp));//读取音频vp.lens = inputDevice->read(vp.audiodata,1024);//读取音频tcpsocket->write((const char*)&vp,sizeof(vp));}void MainWindow::readyReadSlot()
{qDebug() << "read" ;int size = output->periodSize();QByteArray bug;qDebug()<<"audio is being received..."<<endl;bug = tcpsocket->readAll();ui->textEdit->append(bug);outputDevice->write(bug,size);
}
channelCount()---------:`音频数据实际通道数
sampleSize()----------`采样点位数,就是一个采样数据点的量化位数,一般有8位,16位和32位,
位数越多,分辨率越高,保真度越好
sampleRate()----------:`返回实际采样频率,一般等于或大于音频输入设置的采样率
sampleType()----------:`返回采样点格式,是指一个采样点用什么类型数据表示,UnsignedInt,SignedInt,Float
byteOrder()----------:`返回字节序,分为大端字节序和小端字节序
codec()----------:`编码方式

客户端部分

.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QDialog>
#include <QtNetwork/QUdpSocket>
#include <QAudio>
#include <QAudioInput>
#include <QAudioOutput>
#include <QIODevice>#include<QTcpSocket>
namespace Ui {class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = nullptr);~Dialog();private:Ui::Dialog *ui;QTcpSocket *tcpsocket;struct video{char audiodata[1024];int lens;};//outQAudioOutput *output;QIODevice *outputDevice;//inQAudioInput *input;QIODevice *inputDevice;private slots:void readyReadSlot();void on_buttonConnect_clicked();void onReadyRead();
};#endif // DIALOG_H
.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QHostAddress>
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);tcpsocket = new QTcpSocket;setWindowTitle("客户端");connect(tcpsocket, &QTcpSocket::connected,[=](){//提示连接成功ui->textEdit->clear();ui->textEdit->append("和服务器连接成功,等待服务器传送文件……");});connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));QAudioFormat format;format.setSampleRate(8000);format.setChannelCount(1);format.setSampleSize(16);format.setCodec("audio/pcm");format.setSampleType(QAudioFormat::SignedInt);format.setByteOrder(QAudioFormat::LittleEndian);output = new QAudioOutput(format,this);outputDevice = output->start();//开始播放input = new QAudioInput(format,this);inputDevice = input->start();connect(inputDevice,SIGNAL(readyRead()),this,SLOT(onReadyRead()));//send}Dialog::~Dialog()
{delete ui;
}void Dialog::readyReadSlot(){//qDebug() << "read" ;int size = output->periodSize();QByteArray bug;//qDebug()<<"audio is being received..."<<endl;video vp;memset(&vp,0,sizeof(vp));bug = tcpsocket->readAll();//ui->textEdit->append(bug);outputDevice->write(bug,size);}
void Dialog::on_buttonConnect_clicked()
{//获取服务器的ip和端口QString ip = ui->lineEditIP->text();quint16 port = ui->lineEditPort->text().toInt();//主动和服务器连接tcpsocket->connectToHost(ip, port);
}void Dialog::onReadyRead()//send
{qDebug()<<"It's sending audio!"<<endl;video vp;memset(&vp,0,sizeof(vp));//读取音频vp.lens = inputDevice->read(vp.audiodata,1024);tcpsocket->write((const char*)&vp,sizeof(vp));//先给服务发送(接收文件完成的信息)ui->textEdit->append(vp.audiodata);}

Qt TCP/IP语音相关推荐

  1. Qt TCP/IP(多客户端连接服务器)多个客户端同时登陆的聊天室示例

    一.TCP和UDP的区别 这里我会用一个表格来显示这两者的区别 比较项 TCP UDP 是否连接 面向连接 无连接 传输是否可靠 可靠 不可靠 流量控制 提供 不提供 工作方式 全双工 可以是全双工 ...

  2. qt android 设备权限,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...

    QtScrcpy QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制.不需要root权限. 单个应用程序最多支持16个安卓设备同时连接. 同时支持GNU/Li ...

  3. qt android wifi,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...

    QtScrcpy QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制.不需要root权限. 单个应用程序最多支持16个安卓设备同时连接. 同时支持GNU/Li ...

  4. qt中socket通信流程图_使用QT实现简单的tcp/ip通信

    使用QT实现tcp/ip的通信非常的简单,下面我将直接贴出代码: 一.服务器端 1.头文件#ifndef SERVERWIDGET_H #define SERVERWIDGET_H #include ...

  5. Qt 之进程间通信(TCP/IP)

    Qt 之进程间通信(TCP/IP) 原创 一去丶二三里 发布于2016-02-04 10:19:46 阅读数 15428 收藏 更新于2018-05-30 10:35:06 分类专栏: Qt < ...

  6. QT程序设计多人聊天室(基于QT、sqlite3、TCP/IP)

    目录 技术路线 效果展示 程序主体 sqoperator.h mylogin.h myenroll.h chatinterface.h tips.h myapp.h ***************** ...

  7. QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)

    引言 TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯.控制器可以设置 ...

  8. qt之TCP/IP通信客户端与服务器自动连接互相传输数据

    一.前言 在开发上位机软件,用的最多的通信就是网络通信,串口通信和USB通信,串口通信相对是最容易的,USB通信在前面的文章中也专门写了一个博客介绍USB HID通信方式,见链接:https://bl ...

  9. 基于TCP/IP协议的网络摄像头的QT项目

    目录 项目简述: 1.服务器 步骤一:首先搭建一个基本的服务器框架. 1.初始化服务器的函数主体 2.等待连接 步骤二:数据库的使用,本次项目使用的Sqlite3数据库 1.数据库初始化 2.登录时使 ...

最新文章

  1. 【C++】多线程(链式、循环队列)实现生产者消费者模式
  2. vsftpd企业应用快速部署文档
  3. error: IO error while decoding xxx.jar with UTF-8
  4. 论坛中,无限分类的原理
  5. 操作系统上机题目(多进程2)
  6. AZURE 日志分析自动告警
  7. 风靡全球的GANs:一文看尽这“混世魔王”的“三生三世”
  8. excel甘特图模板_最简单的Excel甘特图制作方法,只用一条公式,项目进度一目了然...
  9. Failure [INSTALL_FAILED_OLDER_SDK] [每件问题100块]
  10. ibatis基础(五):删除指定id的单个对象
  11. mysql报错:Host‘IP地址‘ isblocked because of many connection errors;unblock with ‘mysqladmin flush-hosts‘
  12. 通达信手机版分时图指标大全_今天教大家怎么把通达信副图指标源码导入手机通达信软件上。...
  13. 运筹学角度看动态规划(努力更新中...)
  14. 饶阳彻查“黑砖窑”事件 卡酷族×××涉案人
  15. 两条平滑曲线相乘_对三次贝塞尔曲线过点平滑中尖角和交叉现象的优化
  16. 简单功能强大的jQuery在线图片裁剪插件croppic
  17. android如何保证多线程安全,保证线程安全的方式有哪几种?
  18. 『暗香记忆』十世成佛
  19. 世界上顶级英文歌曲首选
  20. JS删除数组里的某个元素方法

热门文章

  1. android 百度转码,自适应网站移动端被百度转码解决方案
  2. ElasticSearch分页查询的3个坑
  3. 井号法(#)创建二叉树(利用前序遍历来建树)C++实现
  4. Harbor容器安装以及相关特性部署与使用(SSL证书+AD域)
  5. 交通流分析2:《基于公共交通大数据的上海市居民出行时空特征研究_王宇》和《面向交通拥堵预测大数据的神经网络群组快速学习_沈晴》阅读总结
  6. 与某流氓网站的血泪交战史
  7. 计算机网络的对学生的利弊英语作文,网上学习利弊 英语作文网络与学习的优缺点...
  8. 人工智能接口调试(百度AI|腾讯AI)
  9. 国家开放大学2021春1248公共部门人力资源管理题目
  10. c语言中用什么表示真假,C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?...