Streaming Sound Wave
Per il rilevamento dell'attività vocale (VAD), fare riferimento a questa pagina.
Una 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 una sound wave importata, ad esempio il riavvolgimento, e può essere utilizzata in SoundCues, ecc.
Creazione di una streaming sound wave
Innanzitutto dovresti creare una streaming sound wave. Nota che dovresti trattarla come un riferimento forte per prevenirne la distruzione prematura (ad esempio assegnandola 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
Opzionalmente, 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
}));
Aggiungere 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 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 accodati continuamente nell'onda sonora in streaming
- La riproduzione raggiunge il flusso di dati in entrata
È 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 ulteriore ritardo anche dopo che OnPopulateAudioState è stato 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 streaming di dati audio: utilizza la riproduzione immediata per flussi costanti, o aggiungi un ritardo di buffering aggiuntivo per flussi inaffidabili (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);
}
Su Popola Stato Audio
Il delegato OnPopulateAudioState funziona in modo simile a OnPopulateAudioData ma non trasmette i dati audio popolati. Questo può essere utile quando si desidera tracciare 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 l'accesso in tempo reale ai dati PCM durante la riproduzione, consultare Gestione dei Dati PCM.