当前位置: 首页 > news >正文

ps高手教学网站手机免费建站app

ps高手教学网站,手机免费建站app,响应式品牌网站设计,网站seo专员修改OpenAudioCaptureStream启动参数为PCM_32,在PC上正常,在Android系统,读取的的数据计算出的音量值在0.4-0.6之间跳动,数据异常。 Audio::FAudioCaptureDeviceParams Params;/** 设置声卡不支持的采样数和通道数开始音频流不会成…

修改OpenAudioCaptureStream启动参数为PCM_32,在PC上正常,在Android系统,读取的的数据计算出的音量值在0.4-0.6之间跳动,数据异常。

    Audio::FAudioCaptureDeviceParams Params;/** 设置声卡不支持的采样数和通道数开始音频流不会成功,这里不能修改* Params.NumInputChannels = 1;* Params.SampleRate = 16000;* * 可以修改PCM数据格式,默认是32位浮点数FLOATING_POINT_32* 我这里修改为32位整数PCM_32*/Params.PCMAudioEncoding = Audio::EPCMAudioEncoding::PCM_32;// 使用 TFunction 包装成员函数Audio::FOnAudioCaptureFunction OnCapture = [this](const void* InAudio, int32 NumFrames, int32 NumChannels, int32 SampleRate, double StreamTime, bool bOverFlow){this->OnAudioCapture(InAudio, NumFrames, NumChannels, SampleRate, StreamTime, bOverFlow);};bool r = AudioCapture->OpenAudioCaptureStream(Params, MoveTemp(OnCapture), 4800);

修改为FLOATING_POINT_32,按照float值读取数据则是正常的。

    Audio::FAudioCaptureDeviceParams Params;/** 设置声卡不支持的采样数和通道数开始音频流不会成功,这里不能修改* Params.NumInputChannels = 1;* Params.SampleRate = 16000;* * 可以修改PCM数据格式,默认是32位浮点数FLOATING_POINT_32* 修改为32位整数PCM_32,在Android系统有问题,还是修改为FLOATING_POINT_32*/Params.PCMAudioEncoding = Audio::EPCMAudioEncoding::FLOATING_POINT_32;// 使用 TFunction 包装成员函数Audio::FOnAudioCaptureFunction OnCapture = [this](const void* InAudio, int32 NumFrames, int32 NumChannels, int32 SampleRate, double StreamTime, bool bOverFlow){this->OnAudioCapture(InAudio, NumFrames, NumChannels, SampleRate, StreamTime, bOverFlow);};bool r = AudioCapture->OpenAudioCaptureStream(Params, MoveTemp(OnCapture), 1920); // 48000采样率可以在重采样是整除3

全部代码
FxAudioCaptureComponent.h

#pragma once#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "AudioCaptureDeviceInterface.h"
#include "HAL/ThreadSafeCounter.h"
#include "HAL/Thread.h"
#include "FxAudioCaptureComponent.generated.h"UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))
class UFxAudioCaptureComponent : public UActorComponent
{GENERATED_BODY()public:UFxAudioCaptureComponent();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XML")int ID;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XML")float Intensity;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "XML")bool bMobile;protected:virtual void BeginPlay() override;virtual void EndPlay(const EEndPlayReason::Type EndPlayReason);// Called every framevirtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;TArray<float> ResampleAndConvert16KHzMono16Bit(const float* inputData, int inputNumSamples, int inputChannels, int inputSampleRate);public:UFUNCTION(BlueprintPure, Category = "FxAudioCapture")int GetAudioDataSize();UFUNCTION(BlueprintCallable, Category = "FxAudioCapture")TArray<uint8> CopyAudioData(int Length, bool bRemove = true);UFUNCTION(BlueprintCallable, Category = "FxAudioCapture")bool StartRecord(float seconds = 10.0f);UFUNCTION(BlueprintCallable, Category = "FxAudioCapture")void StopRecord();UFUNCTION(BlueprintPure, Category = "FxAudioCapture")bool IsRecording();private:FCriticalSection Mutex;TArray<float> m_audioData;bool bRecording;float RecordSeconds;TUniquePtr<Audio::IAudioCaptureStream> AudioCapture;void OnAudioCapture(const void* InAudio, int32 NumFrames, int32 NumChannels, int32 SampleRate, double StreamTime, bool bOverFlow);
};

FxAudioCaptureComponent.cpp

#include "FxAudioCaptureComponent.h"
#include "AudioCaptureDeviceInterface.h"
#include "AudioCaptureCore.h"
#include "AudioMixer.h"UFxAudioCaptureComponent::UFxAudioCaptureComponent(): bRecording(false)
{PrimaryComponentTick.bCanEverTick = true;
}void UFxAudioCaptureComponent::BeginPlay()
{Super::BeginPlay();IModularFeatures::Get().LockModularFeatureList();TArray<Audio::IAudioCaptureFactory*> AudioCaptureStreamFactories = IModularFeatures::Get().GetModularFeatureImplementations<Audio::IAudioCaptureFactory>(Audio::IAudioCaptureFactory::GetModularFeatureName());IModularFeatures::Get().UnlockModularFeatureList();// For now, just return the first audio capture stream implemented. We can make this configurable at a later point.if (AudioCaptureStreamFactories.Num() > 0 && AudioCaptureStreamFactories[0] != nullptr){AudioCapture = AudioCaptureStreamFactories[0]->CreateNewAudioCaptureStream();if (!AudioCapture.IsValid()){GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("CreateNewAudioCaptureStream return null"));}}else {GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("no Audio Capture Stream Factories"));}
}
void UFxAudioCaptureComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
{Super::EndPlay(EndPlayReason);StopRecord();
}
void UFxAudioCaptureComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
}
int UFxAudioCaptureComponent::GetAudioDataSize()
{int len = 0;Mutex.Lock();len = m_audioData.Num();Mutex.Unlock();return len;
}
TArray<uint8> UFxAudioCaptureComponent::CopyAudioData(int numSamples, bool bRemove)
{TArray<uint8> Array;Mutex.Lock();if (0 < numSamples && numSamples <= m_audioData.Num()) {for (int i = 0; i < numSamples; ++i) {int16_t sample16Bit = static_cast<int16_t>(m_audioData[i] * 32767.0f);// 将16位样本存储到Array中Array.Push(static_cast<uint8_t>(sample16Bit & 0xFF));Array.Push(static_cast<uint8_t>((sample16Bit >> 8) & 0xFF));}if (bRemove) {m_audioData.RemoveAt(0, numSamples);}}Mutex.Unlock();return Array;
}
bool UFxAudioCaptureComponent::StartRecord(float seconds)
{StopRecord();RecordSeconds = seconds;if (AudioCapture.IsValid()){Audio::FAudioCaptureDeviceParams Params;/** 设置声卡不支持的采样数和通道数开始音频流不会成功,这里不能修改* Params.NumInputChannels = 1;* Params.SampleRate = 16000;* * 可以修改PCM数据格式,默认是32位浮点数FLOATING_POINT_32* 修改为32位整数PCM_32,在Android系统有问题,还是修改为FLOATING_POINT_32*/Params.PCMAudioEncoding = Audio::EPCMAudioEncoding::FLOATING_POINT_32;// 使用 TFunction 包装成员函数Audio::FOnAudioCaptureFunction OnCapture = [this](const void* InAudio, int32 NumFrames, int32 NumChannels, int32 SampleRate, double StreamTime, bool bOverFlow){this->OnAudioCapture(InAudio, NumFrames, NumChannels, SampleRate, StreamTime, bOverFlow);};bool r = AudioCapture->OpenAudioCaptureStream(Params, MoveTemp(OnCapture), 1920); // 48000采样率可以在重采样是整除3if (r) {r = AudioCapture->StartStream();if (!r) {GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("StartStream return false"));}}else {GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("OpenAudioCaptureStream return false"));}bRecording = r;}return IsRecording();
}
void UFxAudioCaptureComponent::StopRecord()
{if (bRecording && AudioCapture.IsValid()){AudioCapture->StopStream();AudioCapture->CloseStream();}bRecording = false;
}void UFxAudioCaptureComponent::OnAudioCapture(const void* InAudio, int32 NumFrames, int32 NumChannels, int32 SampleRate, double StreamTime, bool bOverFlow)
{// GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("OnAudioCapture - %d,%d,%d,%f,%d"), NumFrames, NumChannels, SampleRate, (float)StreamTime, bOverFlow ? 1 : 0));// 按照16Khz和Mono重采样数据TArray<float> data = ResampleAndConvert16KHzMono16Bit(static_cast<const float*>(InAudio), NumFrames, NumChannels, SampleRate);// 计算强度float total = 0;for (float val : data) {total += FMath::Abs(val);}Intensity = total / (float)(data.Num());// 拷贝数据Mutex.Lock();m_audioData.Append(data.GetData(), data.Num());Mutex.Unlock();
}bool UFxAudioCaptureComponent::IsRecording() {if (!AudioCapture.IsValid()) {return false;}if (!bRecording) {return false;}if (!AudioCapture->IsCapturing()) {return false;}return true;
}
TArray<float> UFxAudioCaptureComponent::ResampleAndConvert16KHzMono16Bit(const float* inputData, int inputNumSamples, int inputChannels, int inputSampleRate)
{int targetSampleRate = 16000;// 计算重采样的步长double resampleRate = static_cast<double>(inputSampleRate) / targetSampleRate;// 临时存储单声道数据std::vector<float> monoSamples;int id = 0;for (int i = 0; i < inputNumSamples; ++i) {float sampleValue = 0;// 如果是多声道,转换为单声道if (inputChannels > 1) {float monoValue = 0;for (int j = 0; j < inputChannels; ++j) {monoValue += inputData[id++];}// 取平均值以避免溢出sampleValue = monoValue / inputChannels;}else {sampleValue = inputData[id++];}monoSamples.push_back(sampleValue);}// 重采样TArray<float> resampledSamples;int targetNumSamples = static_cast<int>(inputNumSamples / resampleRate);for (int i = 0; i < targetNumSamples; ++i) {double srcIndex = i * resampleRate;int srcIndexInt = static_cast<int>(srcIndex);double frac = srcIndex - srcIndexInt;// 线性插值float sample1 = monoSamples[srcIndexInt];float sample2 = monoSamples[std::min(srcIndexInt + 1, inputNumSamples - 1)];float resampledValue = (1.0 - frac) * sample1 + frac * sample2;resampledSamples.Push(resampledValue);}return resampledSamples;
}
http://www.tj-hxxt.cn/news/83307.html

相关文章:

  • 黄岛开发区做网站的公司口碑营销推广
  • 做网站需要写代码最新一周新闻
  • 网站开发对显卡的要求厦门网络推广培训
  • 公司变更法人需要多少费用搜索引擎优化指的是什么
  • 如何做介绍监控公司的网站网络营销方案3000字
  • 重庆渝云建设有限公司班级优化大师简介
  • 钱追得回吗深圳网站优化培训
  • 徐州推广网络营销公司北京网站优化指导
  • 动态网站开发考试卷子网站设计公司网站制作
  • 孝义网站开发西安网络科技公司排名
  • 做代妈的网站推销广告
  • wordpress批量删除评论seo自学教程seo免费教程
  • 广州手机网站建设seo专业培训需要多久
  • 商城网站开发制作seo网站优化推广教程
  • 期末成绩怎么做网站网页设计图
  • 部门门户网站建设请示seo 重庆
  • 金融网站建设微信公众号seo
  • 网站制作公司 云南网络公司网站模板
  • 做图表的网站品牌推广手段
  • 网站ui升级怎么做天津短视频seo
  • 南阳网站优化渠道杭州seo软件
  • 广州互帮物流哪家公司做的网站seo群发软件
  • 做网站能力介绍关键词优化包含
  • 自己可以建设网站吗青岛 google seo
  • 网站目录文件软文范例100字以内
  • 买了一个域名怎么做网站北京网络优化推广公司
  • 查网站流量查询工具东莞网络营销渠道
  • 张店网站建设价格百度云资源搜索
  • 网站开发策划个人简历google浏览器官网
  • 高端营销型网站制作百度关键词规划师工具