Потоковая звуковая волна
Для обнаружения голосовой активности (VAD), обратитесь к этой странице.
Потоковая звуковая волна - это тип импортированной звуковой волны, которая поддерживает динамическое добавление аудиоданных, даже во время воспроизведения. Она предлагает ту же функциональность, что и импортированная звуковая волна, например, перемотка, и может быть использована в SoundCues и т.д.
Создание потоковой звуковой волны
Сначала следует создать потоковую звуковую волну. Обратите внимание, что вы должны рассматривать это как сильную ссылку, чтобы предотвратить преждевременное разрушение (например, путем назначения ее отдельной переменной в Blueprints или использованием UPROPERTY()
в C++).
- Blueprint
- C++
UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
Воспроизведение звуковой волны
Затем можно воспроизвести эту звуковую волну. Однако это необязательно делать сейчас, вы можете начать воспроизведение звуковой волны позже.
Предварительное выделение аудиоданных
При желании, вы можете предварительно выделить аудиоданные (байты), чтобы избежать перераспределения всего PCM буфера каждый раз при добавлении новых аудиоданных.
- 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
}));
Добавление аудиоданных
Чтобы добавить аудиоданные в конец существующего буфера, воспользуйтесь соответствующими функциями для динамического добавления аудиоданных. Воспроизведение будет следовать последовательности очереди этих добавлений.
- 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);
Избежание ускоренного воспроизведения аудио
Часто, когда необходимо передавать аудиоданные и воспроизводить их одновременно, следует добавить небольшую задержку перед воспроизведением, чтобы избежать ускоренного воспроизведения аудио из-за слишком быстрой заполнения буфера. Обычно рекомендуется задержка около полсекунды.
Пример использования
В итоге, ваша реализация может выгля деть следующим образом:
- Blueprint
- C++
Это базовый пример кода для добавления аудиоданных к потоку звуковой волны.
Пример использует функцию AppendAudioExample
, расположенную в классе UAppendAudioClassExample
в модуле EXAMPLEMODULE
.
Примечание: для успешного выполнения примера убедитесь, что модуль RuntimeAudioImporter
добавлен в PublicDependencyModuleNames
или PrivateDependencyModuleNames
в файле .Build.cs, а также в файл .uproject вашего проекта.
#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);
}
О заполнении состояния аудио
Делегат OnPopulateAudioState функционирует схоже с OnPopulateAudioData, но не транслирует заполненные аудио данные. Это может быть полезно, когда вы хотите отслеживать, когда аудио данные заполнены, без передачи массива заполненных аудио данных, что может улучшить производительность.
- 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
});
Работа с PCM данными
Для получения PCM данных в реальном времени во время воспроизведения, см. PCM Data Handling.