Capturable Sound Wave
Descripción general
Una onda de sonido capturable se deriva de la onda de sonido de transmisión en tiempo real. Admite 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
Crear 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 evitar su destrucción prematura (por ejemplo, asignándola a una variable separada en Blueprints o usando UPROPERTY()
en C++).
Obtención de Dispositivos de Entrada Disponibles
Para usar esta característica, primero necesitas obtener todos los dispositivos de entrada de audio 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 array de dispositivos disponibles obtenido del paso anterior. Para usar el dispositivo de entrada de audio predeterminado, pasa -1
en Blueprints o Audio::DefaultDeviceIndex
en C++ (que equivale a INDEX_NONE
), ya que a veces el índice cero no es el dispositivo predeterminado.
Verificación del Estado de Captura
Puedes verificar si la onda de sonido está capturando audio actualmente:
- Blueprint
- C++
// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Características 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);
UE 5.3 y más recientes: Iniciar y detener la captura ya no causa tirones, por lo que ToggleMute
tiene el mismo efecto que StartCapture
/StopCapture
. Es posible que no necesites usar ToggleMute
en absoluto para la optimización del rendimiento.
UE 5.2 y anteriores: Iniciar la captura a través de StartCapture
puede causar pequeños tirones. En estas versiones, se recomienda usar ToggleMute
para cambiar frecuentemente la captura de encendido a apagado. Deberías iniciar primero la captura en sí durante un momento menos crítico (como una pantalla de carga), y luego usar mute/unmute para controlar cuándo se acumulan realmente los datos de audio.
Si estás usando UE 5.2 o anterior y quieres eliminar ligeras congelaciones, considera iniciar la captura durante un momento en el que esta congelación podría ser insignificante. Por ejemplo, podrías iniciar la captura durante la pantalla de carga de tu juego, silenciar la onda de sonido capturable justo después de eso, y luego quitar el silencio de la onda de sonido capturable cuando sea necesario para capturar datos de audio sin ningún tirón.
Ejemplo Completo
Aquí tienes un ejemplo de implementación completa del uso de una onda de sonido capturable:
- Blueprint
- C++
Este es un ejemplo básico de código para capturar datos de audio de 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
ya sea a PublicDependencyModuleNames
o a 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"
#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);
}