Onda sonora capturável
Visão geral
Uma onda sonora capturável é derivada da onda sonora de streaming. Ela suporta a captura de dados de áudio de dispositivos de entrada como um microfone e sua reprodução, com as mesmas capacidades de uma onda sonora importada (incluindo rebobinar, uso em SoundCues, etc). Você pode até capturar e reproduzir áudio simultaneamente sem quaisquer limitações.
Para Detecção de Atividade de Voz (VAD), consulte esta página.
A onda sonora capturável solicita automaticamente permissões de microfone em iOS e Android assim que a captura é iniciada.
Uso básico
Criando uma Onda Sonora Capturável
Primeiro, você deve criar uma onda sonora capturável.
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Você deve tratar a onda sonora capturável como uma referência forte para evitar destruição prematura (por exemplo, atribuindo-a a uma variável separada em Blueprints ou usando UPROPERTY()
em C++).
Obtendo Dispositivos de Entrada Disponíveis
Para usar este recurso, você precisa primeiro obter todos os dispositivos de áudio de entrada disponíveis que podem ser usados para captura.
- Blueprint
- C++
UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Iniciando e Parando a Captura
Após obter os dispositivos disponíveis, você pode começar a capturar dados de áudio do dispositivo de entrada e pará-la quando necessário.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
// Start capturing audio data from the input device with the specified device ID (0 in this case)
CapturableSoundWave->StartCapture(0);
// Stop capturing audio data
CapturableSoundWave->StopCapture();
DeviceId é o índice do dispositivo no array de dispositivos disponíveis obtido na etapa anterior.
Recursos Avançados
Silenciando e Dessilenciando a Captura
Você pode optar por silenciar ou dessilenciar a captura de som para evitar o acúmulo de dados de áudio sem interromper o processo de captura.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
Isso é útil ao alternar a captura frequentemente, pois iniciar a gravação através do StartCapture
pode causar pequenos travamentos no lado do engine. Você deve primeiro iniciar a captura em si, e só então silenciar/dessilenciá-la.
Se o seu objetivo é eliminar um leve congelamento, você pode considerar iniciar a captura durante um momento em que esse congelamento possa ser insignificante. Por exemplo, você poderia iniciar a captura durante a tela de carregamento do seu jogo, silenciar a onda sonora capturável logo em seguida, e então dessilenciar a onda sonora capturável quando necessário para capturar dados de áudio sem nenhum travamento.
Exemplo Completo
Aqui está um exemplo completo de implementação usando uma onda sonora capturável:
- Blueprint
- C++
Este é um exemplo básico de código para capturar dados de áudio de um dispositivo de entrada (microfone) usando uma onda sonora capturável.
O exemplo usa a função CaptureAudioExample
localizada na classe UCaptureAudioClassExample
dentro do módulo EXAMPLEMODULE
.
Para executar o exemplo com sucesso, certifique-se de adicionar o módulo RuntimeAudioImporter
a PublicDependencyModuleNames
ou PrivateDependencyModuleNames
no arquivo .Build.cs, assim como no arquivo .uproject do seu projeto.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "CaptureAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UCaptureAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void CaptureAudioExample();
private:
// Please pay attention to making the StreamingSoundWave a hard reference, such as using UPROPERTY(), to prevent it from being prematurely garbage collected
UPROPERTY()
class UCapturableSoundWave* CapturableSoundWave;
};
#include "CaptureAudioClassExample.h"
#include "Sound/StreamingSoundWave.h"
void UCaptureAudioClassExample::CaptureAudioExample()
{
// Create a capturable sound wave
CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
// Capture audio data from the input device with the specified device ID (0 in this case)
CapturableSoundWave->StartCapture(0);
// Delay for 5 seconds, just for demonstration purposes
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [this]()
{
// Stop capturing audio data
CapturableSoundWave->StopCapture();
// Play the sound wave
UGameplayStatics::PlaySound2D(GetWorld(), CapturableSoundWave);
}, 5, false);
}