Streaming Sound Wave
Ein Streaming-Sound-Wave ist eine Art importierter Sound-Wave, der das dynamische Hinzufügen von Audiodaten unterstützt, sogar während der Wiedergabe. Er bietet die gleiche Funktionalität wie ein importierter Sound-Wave, z.B. Rückspulen, und kann in SoundCues usw. verwendet werden.
Für Voice Activity Detection (VAD) siehe diese Seite.
Einen Streaming-Sound-Wave erstellen
Zuerst sollten Sie einen Streaming-Sound-Wave erstellen. Bitte beachten Sie, dass Sie ihn als starke Referenz behandeln sollten, um eine vorzeitige Zerstörung zu verhindern (z.B. durch Zuweisung zu einer separaten Variable in Blueprints oder Verwendung von UPROPERTY() in C++).
- Blueprint
- C++

UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
Abspielen der Soundwelle
Sie können diese Soundwelle dann wiedergeben. Dies ist jedoch nicht notwendig, um es jetzt zu tun, Sie können die Soundwelle später abspielen.

Vorabzuweisung von Audiodaten
Optional können Sie Audiodaten (Bytes) vorab zuweisen, um eine Neuzuweisung des gesamten PCM-Puffers bei jedem Anhängen neuer Audiodaten zu vermeiden.
- 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
}));
Anhängen von Audiodaten
Um Audiodaten an das Ende des vorhandenen Puffers anzuhängen, verwenden Sie die entsprechenden Funktionen zum dynamischen Anhängen von Audiodaten. Die Wiedergabe folgt der Warteschlangenreihenfolge dieser Anhänge.
- 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);
Vermeidung von beschleunigter oder verzerrter Audiowiedergabe
Beim Streamen von Audiodaten während die Soundwelle abgespielt wird, kann es in bestimmten Szenarien zu beschleunigter oder verzerrter Audiowiedergabe kommen. Dieses Problem tritt typischerweise auf, wenn:
- Die Soundwelle-Wiedergabe sich dem Ende des aktuellen Puffers nähert oder dort ist
- Neue Audiodaten kontinuierlich in die Streaming-Soundwelle eingereiht werden
- Die Wiedergabe mit dem eingehenden Datenstrom gleichzieht
Sie können das Auffüllen mit Audiodaten jederzeit ohne Probleme stoppen. Für Szenarien, die kontinuierliches Streaming erfordern (wie Echtzeit-Audio-Streaming), gibt es jedoch zwei Ansätze, abhängig von der Zuverlässigkeit Ihres Audiodaten-Streamings:
Für zuverlässiges, konsistentes Streaming: Verwenden Sie den OnPopulateAudioState-Delegaten, um die Wiedergabe unmittelbar nach dem Empfang des ersten Datenblocks zu starten.
Für unzuverlässiges Streaming (Netzwerkprobleme, unterbrochene Daten): Fügen Sie eine zusätzliche Verzögerung hinzu, selbst nachdem OnPopulateAudioState ausgelöst wurde, um einen größeren Puffer aufzubauen, bevor die Wiedergabe beginnt.
- 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;
}
});
Hinweis: Sie können die Audio-Daten jederzeit ohne Wiedergabeprobleme stoppen. Der genaue Ansatz hängt von der Zuverlässigkeit Ihres Audio-Daten-Streams ab - verwenden Sie die sofortige Wiedergabe für konsistente Streams oder fügen Sie eine zusätzliche Pufferverzögerung für unzuverlässige Streams hinzu (z. B. bei Netzwerkverbindungsproblemen).
Beispielhafte Verwendung
Schließlich könnte Ihre Implementierung so aussehen:
- Blueprint
- C++

Dies ist ein einfaches Codebeispiel zum Anhängen von Audio-Daten an eine Streaming-Soundwelle.
Das Beispiel verwendet die Funktion AppendAudioExample, die sich in der Klasse UAppendAudioClassExample innerhalb des Moduls EXAMPLEMODULE befindet.
Hinweis: Um das Beispiel erfolgreich auszuführen, stellen Sie sicher, dass Sie das RuntimeAudioImporter-Modul entweder zu PublicDependencyModuleNames oder PrivateDependencyModuleNames in der .Build.cs-Datei sowie zu Ihrer Projektdatei .uproject hinzufügen.
#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
Der OnPopulateAudioState-Delegat funktioniert ähnlich wie OnPopulateAudioData, sendet aber die gefüllten Audiodaten nicht aus. Dies kann nützlich sein, wenn Sie verfolgen möchten, wann die Audiodaten gefüllt werden, ohne ein Array der gefüllten Audiodaten zu übergeben, was die Leistung verbessern kann.
- 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
});
Arbeiten mit PCM-Daten
Für den Echtzeitzugriff auf PCM-Daten während der Wiedergabe siehe PCM-Datenverarbeitung.