Capturable Sound Wave
Visão Geral
Uma capturable sound wave é derivada da streaming sound wave. Ela suporta a captura de dados de áudio de dispositivos de entrada como um microfone e reproduzi-los, com as mesmas capacidades de uma sound wave importada (incluindo rebobinar, uso em SoundCues, etc). Você pode até capturar e reproduzir áudio simultaneamente sem quaisquer limitações.
Para Voice Activity Detection (VAD), consulte esta página.
A capturable sound wave solicita automaticamente permissões de microfone no iOS e Android assim que a captura é iniciada.
Uso Básico
Criando uma Capturable Sound Wave
Primeiro você deve criar uma capturable sound wave.
- 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 entrada de áudio 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 iniciar a captura de 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. Para usar o dispositivo de entrada de áudio padrão, passe -1
em Blueprints ou Audio::DefaultDeviceIndex
em C++ (que equivale a INDEX_NONE
), pois às vezes o índice zero não é o dispositivo padrão.
Verificando o Status de Captura
Você pode verificar se a sound wave está atualmente capturando áudio:
- Blueprint
- C++
// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Recursos Avançados
Silenciando e Ativando a Captura
Você pode optar por silenciar ou ativar 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);
UE 5.3 e mais recente: Iniciar e parar a captura não causa mais travamentos, então ToggleMute
tem o mesmo efeito que StartCapture
/StopCapture
. Você pode não precisar usar ToggleMute
para otimização de desempenho.
UE 5.2 e anteriores: Iniciar a captura através de StartCapture
pode causar pequenos travamentos. Nessas versões, é recomendado usar ToggleMute
para alternar frequentemente a captura ligada e desligada. Você deve primeiro iniciar a captura em si durante um momento menos crítico (como uma tela de carregamento), e então usar mute/unmute para controlar quando os dados de áudio são realmente acumulados.
Se você está usando UE 5.2 ou anterior e quer eliminar pequenas congeladas, considere 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 capturable sound wave logo em seguida, e então dessilenciar a capturable sound wave quando necessário para capturar dados de áudio sem nenhum travamento.
Exemplo Completo
Aqui está um exemplo completo de implementação usando uma capturable sound wave:
- Blueprint
- C++
Este é um exemplo básico de código para capturar dados de áudio de um dispositivo de entrada (microfone) usando uma capturable sound wave.
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, bem como ao 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"
#include "AudioCaptureDeviceInterface.h"
void UCaptureAudioClassExample::CaptureAudioExample()
{
// Create a capturable sound wave
CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
// Capture audio data from the default input device
CapturableSoundWave->StartCapture(Audio::DefaultDeviceIndex);
// 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);
}