虚幻引擎AudioRecord()启动错误-38 Android

时间:2018-08-08 06:36:33

标签: android c++ unreal-engine4

此错误已在史诗游戏方面得到确认,但是,对于已经面临相同问题的任何人,是否有快速解决方案?它仅在应用程序第二次加载时发生。我已经使用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编写的,每当我关闭应用程序时,它都无法正确关闭记录驱动程序。 即使我试图按顺序关闭一切  -清除缓冲区  -销毁记录对象  -破坏引擎

还是没用。

0 个答案:

没有答案