Onda de sonido en streaming
Para la Detección de Actividad de Voz (VAD), consulta esta página.
Una onda de sonido en streaming es un tipo de onda de sonido importada que permite agregar datos de audio dinámicamente, incluso durante la reproducción. Ofrece la misma funcionalidad que una onda de sonido importada, por ejemplo, rebobinar, y puede ser utilizada en SoundCues, etc.
Creación de una onda de sonido en streaming
Primero debes crear una onda de sonido en streaming. Ten en cuenta que debes tratarlo como una referencia fuerte para evitar su destrucción prematura (por ejemplo, asignándolo a una variable separada en Blueprints o usando UPROPERTY()
en C++).
- Blueprint
- C++
UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
Reproduciendo la onda de sonido
Luego puedes reproducir esa onda de sonido. Sin embargo, esto no es necesario hacer ahora, puedes comenzar a reproducir la onda de sonido más tarde.
Preasignación de datos de audio
Opcionalmente, puedes preasignar datos de audio (bytes) para evitar reasignar todo el buffer PCM cada vez que se añaden nuevos datos de audio.
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->PreAllocateAudioData(12582912, FOnPreAllocateAudioDataResultNative::CreateWeakLambda(this, [StreamingSoundWave](bool bSucceeded)
{
// Handle the result
}));
Añadir datos de audio
Para agregar datos de audio al final del buffer existente, utilice las funciones apropiadas para agregar datos de audio dinámicamente. La reproducción seguirá la secuencia de cola de estas adiciones.
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
// Example of appending encoded audio data
TArray<uint8> AudioData = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(AudioData, ERuntimeAudioFormat::Auto);
// Or, if you have raw audio data
TArray<uint8> RawAudioData = ...; // Fill with raw audio data
StreamingSoundWave->AppendAudioDataFromRAW(RawAudioData, ERuntimeRAWAudioFormat::Float32, 44100, 2);
Evitando la reproducción de audio acelerada
A menudo, cuando necesitas transmitir datos de audio y reproducir al mismo tiempo, debes añadir una pequeña demora antes de la reproducción para evitar que el audio se acelere debido a la población demasiado rápida del búfer. Se recomienda una demora de alrededor de medio segundo.
Ejemplo de uso
Finalmente, tu implementación podría verse así:
- Blueprint
- C++
Este es un ejemplo básico de código para anexar datos de audio a una onda de sonido en streaming.
El ejemplo utiliza la función AppendAudioExample
ubicada en la clase UAppendAudioClassExample
dentro del módulo EXAMPLEMODULE
.
Nota: Para ejecutar correctamente el ejemplo, asegúrate de añadir 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 "AppendAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UAppendAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void AppendAudioExample();
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 UStreamingSoundWave* StreamingSoundWave;
};
#include "AppendAudioClassExample.h"
#include "Sound/StreamingSoundWave.h"
void UAppendAudioClassExample::AppendAudioExample()
{
// Create a streaming sound wave
StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
// Append audio data
TArray<uint8> StreamedAudioDataToAdd = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(StreamedAudioDataToAdd, ERuntimeAudioFormat::Auto);
// Play the sound wave
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
}
Sobre Populate Audio State
El delegado OnPopulateAudioState funciona de manera similar a OnPopulateAudioData, pero no transmite los datos de audio completados. Esto puede ser útil cuando deseas rastrear cuándo se completan los datos de audio sin pasar un array de los datos de audio completados, lo que puede mejorar el rendimiento.
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this]()
{
// Handle the result
});
Trabajo con Datos PCM
Para acceso en tiempo real a datos PCM durante la reproducción, consulta Manejo de Datos PCM.