QT有一个音频信号处理的库,非常强大,可以实现音频采集,设定采集的参数等。本文的程序是在一台电脑中实现采集即时音频信号(电脑连接耳机并且说话),将这个音频信号采集后发送至另一台电脑上,在这一台电脑中连接耳机就可以清晰地听清这个即时语音信号。全程实现的是类似音频通话的功能。

话不多说,上代码。

在.pro文件中首先加入下面两个库,否则会造成编译错误:

QT       += network
QT       += multimedia

首先是发送端,实现的是语音的采集,以及音频信号的发送:

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtNetwork/QUdpSocket>
#include <QAudio>//一下这五个是QT处理音频的库
#include <QAudioFormat>
#include <QAudioInput>
#include <QAudioOutput>
#include <QIODevice>using namespace std;namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QUdpSocket *udpSocket;//用于音频信号的发送QAudioInput *input;QIODevice *inputDevice;struct video{char audiodata[1024];int lens;};private slots:void onReadyRead();//
};#endif // MAINWINDOW_H

发送端.cpp文件如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include <QtNetwork/QUdpSocket>
#include <QDebug>
#include <QHostAddress>
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    udpSocket= new QUdpSocket(this);
 
    udpSocket->bind(QHostAddress::Any,10004);//绑定10004端口,不绑定也行,因为是发送端不涉及到接收
    input = new QAudioInput(format,this);
    inputDevice = input->start();//input开始读入输入的音频信号,写入QIODevice,这里是inputDevice
    connect(inputDevice,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
    //槽函数,当inputDevice收到input写入的音频数据之后,调用onReadyRead函数,发送数据到目标主机上
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
void MainWindow::onReadyRead(){
    qDebug()<<"It's sending audio!"<<endl;
    video vp;
    memset(&vp,0,sizeof(vp));
 
    //读取音频
    vp.lens = inputDevice->read(vp.data,1024);//读取音频
    QHostAddress destaddr;
    destaddr.setAddress("192.168.1.104");
    udpSocket->writeDatagram((const char*)&vp,sizeof(vp),destaddr,10004);//将此结构体发送给目标主机,端口是10004,IP是192.168.1.104
}
 

至此发送端的程序就结束了,只要有音频信号输入就可以调用writedatagram函数发送至目标主机。

接收端的任务是手写接收网络上发送给他的音频数据包,之后发送给QIODevice进行播放。程序如下:

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtNetwork/QUdpSocket>
#include <QAudio>
#include <QAudioInput>
#include <QAudioOutput>
#include <QAudioFormat>
#include <QIODevice>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QUdpSocket *udpsocket;struct video{char data[1024];int lens;};QAudioOutput *output;QIODevice *outputDevice;private slots:void readyReadSlot();};#endif // MAINWINDOW_H

接收.cpp文件如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);udpsocket = new QUdpSocket(this);udpsocket->bind(QHostAddress::Any,10004);connect(udpsocket,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));//收到网络数据报就开始往outputDevice写入,进行播放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();//开始播放}MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::readyReadSlot(){while(udpsocket->hasPendingDatagrams()){QHostAddress senderip;quint16 senderport;qDebug()<<"audio is being received..."<<endl;video vp;memset(&vp,0,sizeof(vp));udpsocket->readDatagram((char*)&vp,sizeof(vp),&senderip,&senderport);outputDevice->write(vp.data,vp.lens);}
}

别忘了往.pro文件加上那两行QT库。

怎么样?运行程序,你在发送端的电脑上面说话,接收端就能听到,延迟不到半秒。这样你就自己实现了语音电话的功能。是不是很酷炫呢?

https://blog.csdn.net/hanzhen7541/article/details/98794555  这是更新版,更有借鉴价值。

QT 实现采集即时音频信号并发送至另一台电脑播放相关推荐

  1. QT 用QAudio语音库实现音频信号的采集 以及发送到另一台电脑 播放

    一年多以前曾经写过一篇用QT  audio语音库实现音频的采集和播放的博文:https://blog.csdn.net/hanzhen7541/article/details/80152381 上面那 ...

  2. 一种用QT实现即时通信软件表情发送与接收的思路

    一种用QT实现即时通信软件表情发送与接收的思路 最近需要使用QT为项目添加一个表情包发送与接受的功能,虽然之前知道表情发送与接收显示的一个基本原理,但是其中涉及到例如表情包插入到QTextEdit如何 ...

  3. C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

    C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口. 最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件 抖动窗口功能 ...

  4. 8.QT的事件循环与事件发送相关类

    一.QT的事件发送类QCoreApplication QT使用QCoreApplication类为Qt程序提供了事件循环机制.该类继承QObject.QCoreApplication包含主事件循环,来 ...

  5. QT(Send raw data to printer)发送原始数据到USB打印机

    QT(Send raw data to printer)发送原始数据到USB打印机 http://hi.baidu.com/ppacctv/blog/item/c9517538a35ef3d2b211 ...

  6. qt客户端显示服务器发送的图片不显示,使用Qt将一系列图片通过网络发送到客户端动态显示...

    <使用Qt将一系列图片通过网络发送到客户端动态显示>由会员分享,可在线阅读,更多相关<使用Qt将一系列图片通过网络发送到客户端动态显示(8页珍藏版)>请在人人文库网上搜索. 1 ...

  7. webrtc 视频的采集,编码,发送流程详细分析(希望对底层深入了解的朋友有所帮助)

    ---------------------------------------------------------------------------------------------------- ...

  8. Android通过蓝牙发送数据到Windows PC电脑:Java实现

    Android通过蓝牙发送数据到Windows PC电脑:Java实现 Android手机设备之间通过蓝牙连接然后发送数据,这在我之前的蓝牙专栏里面有介绍,详情见专栏:https://blog.csd ...

  9. java向硬件发送信息_如何用电脑控制手机发短信 用JAVA 通过USB口

    http://download.csdn.net/source/134522 可以去这里下载一个研究研究 ----------------------------------------------- ...

最新文章

  1. 【转载】关于幂律分布的一个笔记
  2. 建立稳定安全的SSH隧道
  3. lixuxmint系统定制与配置(4)-应用安装
  4. java 高手_Java高手是怎样炼成的
  5. egg(110,111,112)--egg之微信支付
  6. python去除图像光照不均匀_低光照环境下图像增强相关
  7. @value 数组_为什么不推荐用for...in遍历数组
  8. linux内核路由反向检查,Linux路由设置 反向路由设置
  9. java守护线程与用户线程_详解Java线程-守护线程与用户线程
  10. 拍照手抖有救了!DeblurGAN消除运动模糊效果惊人 | 附论文+代码
  11. Nginx安装使用及与tomcat实现负载均衡
  12. Qt之HTTP之模仿迅雷——根据URL获取文件信息(上)
  13. C#winform 控件鼠标落下变色,鼠标挪开恢复原色
  14. 举个例子解释下什么是线程不安全?
  15. 认识 ESP-IDF-v4.3+工程结构(ESP32-C3应用调整示例)
  16. 绝地求生服务器维护需要多久,绝地求生8月4日更新到几点?绝地求生维护一次需要多长时间?...
  17. 奋什么直什么的成语(奋什么直什么四字成语大全)
  18. endnote中科大版是什么意思_ios14.2rc是什么意思 ios14.2rc版是原来的“GM”版吗
  19. 如何剪辑视频,视频画中画制作教程分享
  20. getText()和getText().toString()

热门文章

  1. python中文视频教程-中谷python中文视频教程(全38集)
  2. python系统下载-深度操作系统中怎样下载python?
  3. python能做什么工作-python能做哪方面的工作
  4. linux ssh客户端乱码,Win10专业版下Open ssh客户端乱码咋办?
  5. element级联选择框的使用~干货分享
  6. Gulp模块报错:Did you forget to signal async completion? 处理
  7. LeetCode 172 阶乘后的0
  8. FFmpeg源代码简单分析:libavdevice的gdigrab
  9. android 查找所有的串口,Android 串口通讯 获取卡号
  10. html页面转换pdf.txt