Streamende Schallwelle
Für Voice Activity Detection (VAD) siehe diese Seite.
Eine streamende Schallwelle ist eine Art importierter Schallwelle, die das dynamische Hinzufügen von Audiodaten unterstützt, sogar während der Wiedergabe. Sie bietet die gleiche Funktionalität wie eine importierte Schallwelle, z.B. Zurückspulen, und kann in SoundCues usw. verwendet werden.
Erstellen einer streamenden Schallwelle
Zuerst sollten Sie eine streamende Schallwelle erstellen. Bitte beachten Sie, dass Sie sie 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 Schallwelle
Sie können dann diese Schallwelle abspielen. Dies ist jedoch nicht zwingend jetzt erforderlich, Sie können mit dem Abspielen der Schallwelle auch später beginnen.
Vorab-Zuweisung von Audiodaten
Optional können Sie Audiodaten (Bytes) vorab zuweisen, um eine Neuzuweisung des gesamten PCM-Puffers bei jeder Anfügung 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 bestehenden 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 Audiowiedergabe
Oftmals, wenn Sie Audiodaten streamen und gleichzeitig abspielen müssen, sollten Sie eine kurze Verzögerung vor der Wiedergabe einfügen, um beschleunigten Audioeffekt durch zu schnelle Pufferbefüllung zu vermeiden. Eine Verzögerung von etwa einer halben Sekunde wird typischerweise empfohlen.
Beispielverwendung
Letztendlich könnte Ihre Implementierung wie folgt aussehen:
- Blueprint
- C++
Dies ist ein grundlegendes Codebeispiel zum Anhängen von Audiodaten an eine Streaming-Soundwelle.
Das Beispiel verwendet die Funktion AppendAudioExample
in der Klasse UAppendAudioClassExample
innerhalb des Moduls EXAMPLEMODULE
.
Hinweis: Um das Beispiel erfolgreich auszuführen, stellen Sie sicher, dass Sie das Modul RuntimeAudioImporter
entweder zu PublicDependencyModuleNames
oder PrivateDependencyModuleNames
in der .Build.cs-Datei sowie in der .uproject-Datei Ihres Projekts 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-Delegate funktioniert ähnlich wie OnPopulateAudioData, überträgt jedoch nicht die populierten Audiodaten. Dies kann nützlich sein, wenn Sie verfolgen möchten, wann die Audiodaten populiert werden, ohne ein Array der populierten 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 Echtzeit-Zugriff auf PCM-Daten während der Wiedergabe siehe PCM-Datenverarbeitung.