Onda de sonido capturable
Visión general
Una onda de sonido capturable se deriva de la onda de sonido de transmisión. Soporta la captura de datos de audio desde dispositivos de entrada como un micrófono y su reproducción, con las mismas capacidades que una onda de sonido importada (incluyendo rebobinado, uso en SoundCues, etc.). Incluso puedes capturar y reproducir audio simultáneamente sin ninguna limitación.
Para la Detección de Actividad de Voz (VAD), consulta esta página.
La onda de sonido capturable solicita automáticamente permisos de micrófono en iOS y Android una vez que se inicia la captura.
Uso básico
Creación de una onda de sonido capturable
Primero debes crear una onda de sonido capturable.
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Debes tratar la onda de sonido capturable como una referencia fuerte para prevenir su destrucción prematura (por ejemplo, asignándola a una variable separada en Blueprints o usando UPROPERTY()
en C++).
Obteniendo Dispositivos de Entrada Disponibles
Para usar esta función, primero necesitas obtener todos los dispositivos de audio de entrada disponibles que pueden usarse para la captura.
- Blueprint
- C++
UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Iniciar y Detener la Captura
Después de obtener los dispositivos disponibles, puedes comenzar a capturar datos de audio desde el dispositivo de entrada y detenerlo cuando sea necesario.
- 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 es el índice del dispositivo en el arreglo de dispositivos disponibles obtenido del paso anterior.
Verificando el Estado de Captura
Puedes verificar si la onda de sonido está actualmente capturando audio:
- Blueprint
- C++
// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Funciones Avanzadas
Silenciar y Activar la Captura
Puedes elegir silenciar o activar la captura de sonido para evitar la acumulación de datos de audio sin interrumpir el proceso de captura.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
Esto es útil cuando se cambia de captura con frecuencia, ya que iniciar la grabación mediante StartCapture
puede causar pequeñas interrupciones en el motor. Primero deberías iniciar la captura en sí, y solo entonces silenciarla o activar el sonido.
Si tu objetivo es eliminar un ligero congelamiento, podrías considerar iniciar la captura durante un momento en el que este congelamiento sea insignificante. Por ejemplo, podrías iniciar la captura durante la pantalla de carga de tu juego, silenciar la onda de sonido capturable inmediatamente después, y luego activar el sonido de la onda capturable cuando sea necesario para capturar datos de audio sin interrupciones.
Ejemplo Completo
Aquí hay un ejemplo completo de implementación del uso de una onda de sonido capturable:
- Blueprint
- C++
Este es un ejemplo básico de código para capturar datos de audio desde un dispositivo de entrada (micrófono) usando una onda de sonido capturable.
El ejemplo utiliza la función CaptureAudioExample
ubicada en la clase UCaptureAudioClassExample
dentro del módulo EXAMPLEMODULE
.
Para ejecutar el ejemplo con éxito, asegúrate de agregar el módulo RuntimeAudioImporter
a PublicDependencyModuleNames
o PrivateDependencyModuleNames
en el archivo .Build.cs, así como al archivo .uproject de tu proyecto.
#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);
}