首页 > 其他分享 >QT6 USB接收麦克声音并播放代码

QT6 USB接收麦克声音并播放代码

时间:2024-11-01 13:42:46浏览次数:1  
标签:QT6 麦克 USB format inputDeviceStream inputDevice audioData outputDevice include

#include <QApplication>
#include <QAudioSource>
#include <QAudioSink>
#include <QMediaDevices>
#include <QAudioFormat>
#include <QByteArray>
#include <QIODevice>
#include <QDebug>
#include <QUdpSocket>

#include <QLabel>
#include <QPixmap>
#include <QVBoxLayout>
#include <QTimer>
#include <QCoreApplication>
#include <QtMultimedia>
#include <QThread>

QUdpSocket udpSocket;
quint16 port = 5021; // 你要监听的端口

class AudioHandler : public QObject {
Q_OBJECT

public:
AudioHandler() {
// 设置音频格式
QAudioFormat format;
format.setSampleRate(16000); // 采样率 16kHz
format.setChannelCount(1); // 单声道
format.setSampleFormat(QAudioFormat::Int16); // 16 位 PCM 格式

// 获取默认输入和输出设备
QAudioDevice inputDevice = QMediaDevices::defaultAudioInput();
QAudioDevice outputDevice = QMediaDevices::defaultAudioOutput();

// 检查设备是否支持所需格式
if (!inputDevice.isFormatSupported(format)) {
qWarning() << "Requested format not supported by input device, using nearest format.";
format = inputDevice.preferredFormat();
}
if (!outputDevice.isFormatSupported(format)) {
qWarning() << "Requested format not supported by output device, using nearest format.";
format = outputDevice.preferredFormat();
}

// 初始化音频输入和输出
audioInput = new QAudioSource(inputDevice, format, this);
audioOutput = new QAudioSink(outputDevice, format, this);

// 创建输入和输出设备流
inputDeviceStream = audioInput->start();
outputDeviceStream = audioOutput->start();

// 连接输入流数据读取槽函数
connect(inputDeviceStream, &QIODevice::readyRead, this, &AudioHandler::handleAudioInput);
}

private slots:
void handleAudioInput() {
#if 1
qDebug() << "handleAudioInput123";
QByteArray audioData = inputDeviceStream->read(2900); // 读取4096字节
// 发送数据通过UDP
QHostAddress targetAddress("192.168.1.101"); // 替换为目标设备的实际 IP 地址
quint16 targetPort = 5022; // 目标端口

qint64 bytesSent = udpSocket.writeDatagram(audioData, targetAddress, targetPort);
if (bytesSent == -1) {
qDebug() << "Failed to send UDP datagram:" << udpSocket.errorString();
} else {
qDebug() << "Sent" << bytesSent << "bytes to" << targetAddress.toString() << "on port" << targetPort;
}
#endif

// QByteArray audioData = inputDeviceStream->readAll(); // 从输入流读取音频数据
outputDeviceStream->write(audioData); // 将数据写入输出流播放

}

private:
QAudioSource *audioInput;
QAudioSink *audioOutput;
QIODevice *inputDeviceStream;
QIODevice *outputDeviceStream;
};

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
AudioHandler audioHandler;
return app.exec();
}
#include "main.moc"

标签:QT6,麦克,USB,format,inputDeviceStream,inputDevice,audioData,outputDevice,include
From: https://www.cnblogs.com/1359787445QAQ/p/18519979

相关文章

  • USB PD快充技术发展历史及版本特性
    USBPowerDelivery(USBPD)是基于USB规范的快速充电技术,是USB重要的规范之一。USB技术自发布已来,得到了很大的发展,并且由于USB自速电源供电(VBUS),使得有很多的小型设备开始使用USB接口进行供电,所以市面上也出现了五花八门的USB充电技术。随着USB3.0规范和TYPE-C接口的发布,在原来US......
  • STM32的USB接口介绍
    STM32微控制器系列提供了强大的USB功能,支持USB设备和主机模式。本文将详细介绍STM32的USB接口,包括其主要特征、寄存器和缓存映射、时钟要求以及如何通过代码实现USB通信。一、USB简介STM32的USB外设实现了USB2.0全速总线和APB总线间的接口。它支持USB挂起/恢复操作,可以停......
  • USB E-Maker用途
    E-Marker是“ElectronicallyMarkedCable”的缩写,是封装在USB-C端口中的芯片。通过这个芯片,可以得到电缆的各种参数,包括功率、数据、视频传输、ID等信息。由于Type-C设备之间的功能差异很大,因此在决策过程中考虑电缆至关重要。例如,如果源和接收设备都需要100W的功率,但电......
  • USB协议详解第30讲(USB枚举过程详解及抓包分析)
    当USB设备连接到或从USB中移除时,主机使用总线枚举过程来识别和管理接入的设备。当USB设备连接到一个已经被上电的端口,采取以下顺序行动:1.设备上电用户把USB设备插入USB端口(主机下的根hub或主机下行端口上的hub端口)或系统启动时设备上电。此时,USB设备处于加电状态,它所连接的端口......
  • USB协议详解第29讲(USB设备状态及数据交互条件)
    1.连接状态(Attached)USB设备可以从USB总线上连接或断开。当USB设备与USB总线断开时,它的状态USB规范没有定义,我们可以这么想,设备都拔了就断电了,也就不存在什么样的状态了。规范仅在设备被连接后处理后续的操作。2.上电状态(Powered)USB设备的电源可来自外部电源,也可从USB接口的......
  • USB协议详解第28讲(USB硬件设计和热拔插原理)
    1.USB引脚接线定义对于四线制的USB,即USB1.0、USB1.1和USB2.0,USB硬件接口有4根接线,如下图。引脚名称电缆颜色描述1VBUSRed+5V,电源2D−WhiteData−,数据线3D+GreenData+,数据线4GNDBlackGround,接地2.低速USB设备硬件设计原理低速设备端在*D......
  • USB协议详解第27讲(USB包-中断传输包详解)
    1.中断传输包结构中断传输和批量传输类似,中断传输只由一个中断事务组成,中断事务包含令牌包、数据包、握手包,如图下所示。中断事务类型的特点是能够通过错误检测和重试来保证主机和设备之间数据的无错误传递。需要理解和注意以下点。(1)当主机准备接收数据时,它发出IN令牌,设备端点......
  • USB协议详解第26讲(USB包-批量传输包详解)
    1.批量传输包结构批量传输由一个或多个批量事务组成,每一个批量事务具有令牌包、数据包、握手包,如图下所示。批量事务类型的特点是能够通过错误检测和重试来保证主机和设备之间数据的无错误传递。需要理解和注意以下点。(1)当主机准备接收批量数据时,它发出IN令牌,设备端点通过返回......
  • 记一次thinkpad检测不到麦克风的问题修复
    记一次thinkpad检测不到麦克风的问题修复目录记一次thinkpad检测不到麦克风的问题修复写在前面解决方案写在前面摘要新到了一个thinkpadP16-3SCD,开会没有麦,一直在忍,在考虑要不要买一个带麦的耳机。偶尔的机会看到淘宝上同款thinkpad是支持麦的,这我能忍?开始研究!(设备管理器......
  • 安卓13 连接usb设备后不更新ui
    总纲android13rom开发总纲说明文章目录1.前言2.问题分析3.代码更改4.彩蛋1.前言  有些界面在链接usb设备后,ui会被刷新,导致闪烁问题。2.问题分析像这种问题一般是usb事件,导致的ui事件更新了,处理方法是禁止该事件3.代码更改这块我们就需要在输入事件管......