Streaming Sound Wave
Uno streaming sound wave è un tipo di sound wave importato che supporta l'aggiunta dinamica di dati audio, anche durante la riproduzione. Offre le stesse funzionalità di un sound wave importato, ad esempio il riavvolgimento, e può essere utilizzato in SoundCue, ecc.
Per il Voice Activity Detection (VAD), fare riferimento a questa pagina.
Creazione di uno streaming sound wave
Innanzitutto, dovresti creare uno streaming sound wave. Nota che dovresti trattarlo come un riferimento forte per prevenirne la distruzione prematura (ad esempio assegnandolo a una variabile separata in Blueprints o utilizzando UPROPERTY() in C++).
- Blueprint
- C++

UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
Riproduzione dell'onda sonora
Puoi quindi riprodurre quell'onda sonora. Tuttavia, non è necessario farlo ora, puoi iniziare a riprodurre l'onda sonora in un secondo momento.

Pre-allocazione dei dati audio
Facoltativamente, puoi pre-allocare i dati audio (byte) per evitare di riallocare l'intero buffer PCM ogni volta che vengono aggiunti nuovi dati 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
}));
Aggiunta di dati audio
Per aggiungere dati audio alla fine del buffer esistente, utilizzare le funzioni appropriate per aggiungere dinamicamente dati audio. La riproduzione seguirà la sequenza di coda di questi aggiunti.
- 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);
Evitare la riproduzione audio accelerata o distorta
Quando si trasmettono in streaming dati audio mentre l'onda sonora è in riproduzione, si potrebbe riscontrare una riproduzione audio accelerata o distorta in scenari specifici. Questo problema si verifica tipicamente quando:
- La riproduzione dell'onda sonora è vicina/alla fine del buffer corrente
- Nuovi dati audio vengono continuamente accodati nell'onda sonora in streaming
- La riproduzione raggiunge il flusso di dati in arrivo
È possibile interrompere il popolamento dei dati audio in qualsiasi momento senza problemi. Tuttavia, per scenari in cui è necessario uno streaming continuo (come lo streaming audio in tempo reale), ci sono due approcci a seconda dell'affidabilità del flusso dei dati audio:
Per streaming affidabile e consistente: Utilizzare il delegato OnPopulateAudioState per avviare la riproduzione immediatamente dopo la ricezione del primo chunk.
Per streaming inaffidabile (problemi di rete, dati intermittenti): Aggiungere un ritardo aggiuntivo anche dopo che OnPopulateAudioState viene attivato, per accumulare un buffer più grande prima di avviare la riproduzione.
- Blueprint
- C++

// Approach 1: For reliable streaming - start immediately after first chunk
bool bHasStartedPlayback = false;
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this, &bHasStartedPlayback]()
{
if (!bHasStartedPlayback)
{
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
bHasStartedPlayback = true;
}
});
// Approach 2: For unreliable streaming - add delay after first chunk
bool bHasStartedPlayback = false;
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this, &bHasStartedPlayback]()
{
if (!bHasStartedPlayback)
{
// Add delay to build up buffer for unreliable streaming
GetWorld()->GetTimerManager().SetTimer(PlaybackDelayTimer, [this]()
{
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
}, 0.5f, false); // Half-second delay
bHasStartedPlayback = true;
}
});
Nota: Puoi interrompere il popolamento dei dati audio in qualsiasi momento senza causare problemi di riproduzione. L'approccio esatto dipende dall'affidabilità del tuo flusso di dati audio: utilizza la riproduzione immediata per flussi costanti, oppure aggiungi un ritardo di buffer aggiuntivo per flussi non affidabili (ad esempio, problemi di connettività di rete).
Esempio di utilizzo
Infine, la tua implementazione potrebbe apparire così:
- Blueprint
- C++

Questo è un esempio di codice di base per aggiungere dati audio a un'onda sonora in streaming.
L'esempio utilizza la funzione AppendAudioExample situata nella classe UAppendAudioClassExample all'interno del modulo EXAMPLEMODULE.
Nota: Per eseguire correttamente l'esempio, assicurati di aggiungere il modulo RuntimeAudioImporter a PublicDependencyModuleNames o PrivateDependencyModuleNames nel file .Build.cs, così come al file .uproject del tuo progetto.
#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);
}
On Populate Audio State
Il delegato OnPopulateAudioState funziona in modo simile a OnPopulateAudioData ma non trasmette i dati audio popolati. Questo può essere utile quando si desidera monitorare quando i dati audio vengono popolati senza passare un array dei dati audio popolati, il che può migliorare le prestazioni.
- 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
});
Lavorare con i Dati PCM
Per accedere in tempo reale ai dati PCM durante la riproduzione, consulta Gestione dei Dati PCM.