此错误已在史诗游戏方面得到确认,但是,对于已经面临相同问题的任何人,是否有快速解决方案?它仅在应用程序第二次加载时发生。我已经使用android studio对其进行了调试,发现该应用程序第二次启动时触发了AudioRecord()启动错误-38。
以下是错误UE-62389
的链接这是我的.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "Runtime/Online/Voice/Public/VoiceModule.h"
#include "VolumeCapture.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class MYPROJECT2_API UVolumeCapture : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UVolumeCapture();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
TSharedPtr<IVoiceCapture> VoiceCapture_V;
uint32 VoiceCaptureBytesAvailable;
TArray<uint8> VoiceCaptureBuffer;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float VoiceCaptureVolume;
};
这是我的.cpp,最后我还添加了太多调试信息,以确保捕获状态,并且在应用程序第二次启动时始终可以。
// Fill out your copyright notice in the Description page of Project Settings.
#include "VolumeCapture.h"
#include "Platform.h"
// Sets default values for this component's properties
UVolumeCapture::UVolumeCapture()
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
PrimaryComponentTick.bCanEverTick = true;
// ...
}
// Called when the game starts
void UVolumeCapture::BeginPlay()
{
Super::BeginPlay();
VoiceCapture_V = FVoiceModule::Get().CreateVoiceCapture();
bool Success = VoiceCapture_V.IsValid(); //VoiceCapture->Start();
if (Success)
{
VoiceCapture_V->Start();
UE_LOG(LogTemp, Warning, TEXT("Voice capture started successfully"));
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, "Voice capture started successfully");
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Voice capture not started successfully"));
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, "Voice capture starting failed");
}
}
// Called every frame
void UVolumeCapture::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (!VoiceCapture_V.IsValid())
{
UE_LOG(LogTemp, Warning, TEXT("Voice capture is not valid; skipping the rest of voice capture tick"));
//GEngine->AddOnScreenDebugMessage(-1, 0.1f, FColor::Red, "Voice Capture is not valid");
return;
}
else
{
//GEngine->AddOnScreenDebugMessage(-1, 0.1f, FColor::Green, "valid");
}
if (VoiceCapture_V->IsCapturing())
GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Black, "Capturing data right now");
else
GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Black, "Not Capturing");
EVoiceCaptureState::Type CaptureState = VoiceCapture_V->GetCaptureState(VoiceCaptureBytesAvailable);
UE_LOG(LogTemp, Warning, TEXT("Bytes available: %d\nCapture state: %s"), VoiceCaptureBytesAvailable, EVoiceCaptureState::ToString(CaptureState));
FString NewString = FString::FromInt(VoiceCaptureBytesAvailable);
GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Black, NewString);
VoiceCaptureBuffer.Reset();
if (CaptureState == EVoiceCaptureState::Ok && VoiceCaptureBytesAvailable > 0)
{
int16_t VoiceCaptureSample;
uint32 VoiceCaptureReadBytes;
float VoiceCaptureTotalSquared = 0;
VoiceCaptureBuffer.SetNumUninitialized(VoiceCaptureBytesAvailable);
VoiceCapture_V->GetVoiceData(VoiceCaptureBuffer.GetData(), VoiceCaptureBytesAvailable, VoiceCaptureReadBytes);
for (int i = 0; i < VoiceCaptureBuffer.Num() / 2; i++)
{
VoiceCaptureSample = VoiceCaptureBuffer[i]; //(VoiceCaptureBuffer[i] << 8) | VoiceCaptureBuffer[i];
VoiceCaptureTotalSquared += ((float)VoiceCaptureSample * (float)VoiceCaptureSample);
}
float VoiceCaptureMeanSquare = (2 * (VoiceCaptureTotalSquared / VoiceCaptureBuffer.Num()));
float VoiceCaptureRms = FMath::Sqrt(VoiceCaptureMeanSquare);
float VoiceCaptureFinalVolume = ((VoiceCaptureMeanSquare / 32768.0) * 20.f);
VoiceCaptureVolume = VoiceCaptureFinalVolume;
GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Blue, FString::Printf(TEXT("VoiceCaptureVolume: %f"), VoiceCaptureVolume));
}
if (CaptureState == EVoiceCaptureState::Error)
{
GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Emerald, "ERROR");
}
if (CaptureState == EVoiceCaptureState::NoData)
{
GEngine->AddOnScreenDebugMessage(-1, 0.05f, FColor::Emerald, "NoData");
}
if (CaptureState == EVoiceCaptureState::NotCapturing)
{
GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "NotCapturing");
}
if (CaptureState == EVoiceCaptureState::UnInitialized)
{
GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "UnInitialized");
}
if (CaptureState == EVoiceCaptureState::Stopping)
{
GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "Stopping");
}
if (CaptureState == EVoiceCaptureState::BufferTooSmall)
{
GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Emerald, "BufferTooSmall");
}
}
不能做更多的事情,任何提示都会很棒。
谢谢
编辑:AndroidVoiceModule是使用OpenSL ES编写的,每当我关闭应用程序时,它都无法正确关闭记录驱动程序。 即使我试图按顺序关闭一切 -清除缓冲区 -销毁记录对象 -破坏引擎
还是没用。