虚幻引擎实时音频采集

Part1前言

虚幻引擎其实对实时音频的采集支持得非常好。不过由于对音频概念的学习,还是花了一些时间进行研究。本文主要介绍如何基于虚幻引擎采集实时麦克风的音频数据。

Part2音频采样率

在虚幻引擎中,我没有找到动态修改音频采样率的方法。下面的方法设置是不行的,不知道有没有哪位高手可以指点一下。4a36b675bcf34aa28a711b506c4bac73.png单双通道可以自己进行处理。针对双通道转单通道,可以尝试如下思路。单通道:在单通道PCM数据中,音频样本按时间顺序连续排列。数据流看起来像这样:S1, S2, S3, S4, ...,其中每个S代表一个样本。
双通道:在双通道PCM数据中,通常使用交错排列方式。这意味着左右声道的样本交替出现。数据流看起来像这样:L1, R1, L2, R2, L3, R3, ...,其中L和R分别代表左声道和右声道的样本。
将双通道转成单通道可以尝试如下方案:
单声道样本 = (左声道样本 + 右声道样本) / 2

Part3音频编码字节序

PCM数据可以以大端字节序(Big Endian)或小端字节序(Little Endian)存储
WAV文件通常使用小端字节序
另外 Windows系统使用的是小端字节序(Little Endian)。在小端字节序中,多字节值的低位字节存储在内存中的低地址处,而高位字节则存储在高地址处。
例如,在小端系统中,一个16位整数0x1234将以34 12的形式存储在内存中(假设内存地址从左到右增加):0x34是低位字节,存储在较低的地址,而0x12是高位字节,存储在较高的地址。
所以在虚幻音频当中我就默认小端字节序了。

Part4音频数据保存

在虚幻引擎中使用FFileHelper类写文件时,如果目标文件已经存在,那么默认行为是覆盖该文件。这意味着原始文件的内容将被新内容完全替换。如果你需要根据文件是否存在来采取不同的行动,可以在写文件之前先检查文件是否存在。

#include "HAL/PlatformFilemanager.h"void AppendOrCreateFile(const FString& FilePath, const TArray<uint8>& Data)
{// 获取平台文件管理器的引用IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();// 检查文件是否存在if (PlatformFile.FileExists(*FilePath)){// 文件已存在,追加内容IFileHandle* FileHandle = PlatformFile.OpenWrite(*FilePath, true);if (FileHandle){FileHandle->Write(Data.GetData(), Data.Num());delete FileHandle; // 关闭文件}}else{// 文件不存在,创建新文件并写入内容FFileHelper::SaveArrayToFile(Data, *FilePath);}
}

Part5音频数据采集

主要通过 UAudioCapture 对象进行采集,代码调用也非常简洁。创建一个UAudioCapture对象

m_AudioCapture = UAudioCaptureFunctionLibrary::CreateAudioCapture();

注册音频回调函数

m_AudioGeneratorHandle = m_AudioCapture->AddGeneratorDelegate(MyFunction);

启动音频采集

m_AudioCapture->StartCapturingAudio();

启动成功之后就可以获取到相关音频参数如采样率和通道

auto samplerate =  m_AudioCapture->GetSampleRate();auto channelnum = m_AudioCapture->GetNumChannels();

音频处理方面,在回调函数中,音频被设置在0-1之间,如果我们想保存为32bit的音频,可以自己等比例变换。

void ATestVoiceChatAudioCapture::OnAudioGenerate(const float* InAudio, int32 NumSamples)

这里我转成了32bit的pcm编码,转换如下

outAudio[i] = InAudio[i] * MAX_int32;

之后在保存为文件即可。有了实时音频采集的加持,我们可以做很多工作,比如语音识别,语音聊天等等。

Part6关于源码

请关注公众号g0415shenw 加入知识星球。
星球地址 https://t.zsxq.com/15EvfoA7n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319271.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例253:基于微信小程序的懂球短视频管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SpringBoot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

iOday4

标准io文件拷贝 文件IO拷贝 stat 对目录操作

【已解决】You have an error in your SQL syntax

报错讯息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desc,target_url,sort,status,create_by,modify_by,created,last_update_time FROM…

Unity3D UGUI图集打包与动态使用(TexturePacker)

制作图集的好处&#xff1a; 众所周知CPU是用来处理游戏的逻辑运算的&#xff0c;而GPU是用来处理游戏中图像的。在GPU中&#xff0c;我们要绘制一个图像需要提交图片&#xff08;纹理&#xff09;到显存&#xff0c;然后再进行绘制&#xff08;在这个过程中会产生一次DrawCall…

通俗易懂web3.0

目录 前言一、WEB1.0二、WEB2.0三、WEB3.0区别最后 前言 大家好&#xff0c;我是清风。互联网连接了人与人&#xff0c;在过去的30年中&#xff0c;互联网技术不断进化、演化&#xff0c;向纵深发展&#xff0c;政治、经济、社交、生活、工作已经几乎离不开互联网。我们经历了…

【Proteus仿真】【51单片机】超声波测距系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用动态数码管、按键、HCSR04超声波、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示超声波检测距离&#xff0c;当检测距离…

PET塑料粘接时,要求强力粘接性能,那么怎么选胶呢?

聚对苯二甲酸乙二醇酯 简称PET。 需要强力粘接塑料PET时&#xff0c;可以选择以下几种胶水&#xff1a; 1.环氧树脂胶 具有较高的强度&#xff0c;硬度和耐久性&#xff0c;能够有效地粘合PET材料。但是&#xff0c;对于某些特殊环境和温度条件&#xff0c;可能需要选择耐高…

JDK、JRE、JVM的联系与区别

JDK、JRE、JVM的联系与区别 一、JDK,JRE,JVM定义 JDK(Java Development Kit),包含JRE,以及增加编译器和调试器等用于程序开发的文件。 JRE(Java Runtime Environment)&#xff0c;包含Java虚拟机、库函数、运行Java应用程序所必须的文件。 JVM(Java Virtual Machine)是一个虚…

SCT2330C——3.8V-28V输入,3A,低EMI,超低功耗同步降压DCDC转换器

描述&#xff1a; SCT2330C是3A同步buck变换器&#xff0c;输入电压范围高达28V&#xff0c;完全集成了80mΩ高压侧MOSFET和42mΩ低压侧MOSFET&#xff0c;提供高效降压DC-DC转换。SCT2330C采用峰值电流模式控制&#xff0c;集成补偿网络&#xff0c;通过最小化片外元件数量&a…

Matlab机械臂运动学示教演示

对于昨天的matlab程序&#xff0c;又进行了优化&#xff0c;直接将3*3姿态矩阵转为欧拉角(ZYX)显示。优化后的程序如下&#xff1a; T robot.fkine([0 0 0 0 0 0]).T %T robot.fkine([-0.081522 0.590650 2.562666 0.439001 1.575855 -0.840727]).T %robot.plot([0 0 0 0 0 0…

RTC模块在汽车电池管理系统中的优势

汽车行业目前正在经历一个巨大的时期&#xff0c;关键词是 “案例”。CASE是连接、自治、共享和电气的缩写。它 表明了该汽车制造商在日益数字化的世界中的战略方向。市场的 电动汽车正在快速增长&#xff0c;预计将有助于减少二氧化碳排放和对抗 全球变暖 在本文中&#…

Spring事务传播问题 — PROPAGATION_REQUIRES_NEW

一、描述 Spring遇到嵌套事务时&#xff0c;当被嵌套的事务被定义为“PROPAGATION_REQUIRES_NEW”时&#xff0c; 内层Service的方法被调用时&#xff0c;外层方法的事务被挂起&#xff1b; 内层事务相对于外层事务是完全独立的&#xff0c;有独立的隔离性等等。 二、实验 但实…