Onda de sonido capturable
Resumen
Una onda de sonido capturable se deriva de la onda de sonido en streaming. 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 limitaciones.
Para 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
Creando 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++).
Obteniendo Dispositivos de Entrada Disponibles
Para usar esta función, primero necesitas obtener todos los dispositivos de entrada de audio disponibles que pueden usarse para capturar.
- 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.
Funciones Avanzadas
Silenciar y Activar 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. Deberías iniciar primero 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 justo después, y luego activar el sonido de la onda capturable cuando sea necesario para capturar datos de audio sin interrupciones.
Ejemplo Completo
Aquí tienes 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);
}