Streaming Sound Wave
Bir streaming ses dalgası, oynatma sırasında bile dinamik olarak ses verisi eklemeyi destekleyen bir tür içe aktarılmış ses dalgasıdır. İçe aktarılmış bir ses dalgasıyla aynı işlevselliği sunar, örneğin geri sarma, ve SoundCues vb. içinde kullanılabilir.
Ses Aktivitesi Algılama (VAD) için, bu sayfaya bakın.
Bir streaming ses dalgası oluşturma
İlk olarak bir streaming ses dalgası oluşturmalısınız. Lütfen erken yok olmayı önlemek için onu güçlü bir referans olarak ele almanız gerektiğini unutmayın (örneğin, Blueprints'te ayrı bir değişkene atayarak veya C++'ta UPROPERTY() kullanarak).
- Blueprint
- C++

UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
Ses dalgasını çalma
Daha sonra o ses dalgasını çalabilirsiniz. Ancak bunu şimdi yapmak gerekli değildir, ses dalgasını daha sonra çalmaya başlayabilirsiniz.

Ses verilerini önceden ayırma
İsteğe bağlı olarak, yeni ses verileri her eklendiğinde tüm PCM tamponunun yeniden tahsis edilmesini önlemek için ses verilerini (bayt olarak) önceden ayırabilirsiniz.
- 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
}));
Ses verisi ekleme
Mevcut tamponun sonuna ses verisi eklemek için, ses verisini dinamik olarak eklemeye yönelik uygun işlevleri kullanın. Oynatma, bu eklemelerin sıraya dizilmiş sırasını takip edecektir.
- 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);
Hızlanmış veya bozulmuş ses oynatımını önleme
Ses dalgası oynatılırken ses verilerini akış halinde gönderirken, belirli senaryolarda hızlanmış veya bozulmuş ses oynatımı yaşayabilirsiniz. Bu sorun genellikle şu durumlarda ortaya çıkar:
- Ses dalgası oynatımı mevcut tamponun sonuna yakın/ulaşmış durumda
- Yeni ses verileri sürekli olarak akış halindeki ses dalgasına sıraya ekleniyor
- Oynatım, gelen veri akışına yetişiyor
Ses verilerini herhangi bir zamanda sorunsuz bir şekilde doldurmayı durdurabilirsiniz. Ancak, sürekli akış gerektiren senaryolar için (gerçek zamanlı ses akışı gibi), ses veri akışınızın güvenilirliğine bağlı olarak iki yaklaşım vardır:
Güvenilir, tutarlı akış için: İlk veri parçası alındıktan hemen sonra oynatımı başlatmak için OnPopulateAudioState temsilcisini kullanın.
Güvenilir olmayan akış için (ağ sorunları, kesintili veri): Oynatımı başlatmadan önce daha büyük bir tampon oluşturmak için OnPopulateAudioState tetiklendikten sonra bile ek bir gecikme ekleyin.
- 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;
}
});
Not: Ses verilerini doldurmayı istediğiniz zaman durdurabilirsiniz, bu oynatma sorunlarına neden olmaz. Kesin yaklaşım, ses veri akışınızın güvenilirliğine bağlıdır - tutarlı akışlar için anında oynatma kullanın veya güvenilmez akışlar için (örneğin, ağ bağlantı sorunları) ek tamponlama gecikmesi ekleyin.
Örnek kullanım
Son olarak, uygulamanız şöyle görünebilir:
- Blueprint
- C++

Bu, bir akış ses dalgasına ses verisi eklemek için temel bir kod örneğidir.
Örnek, EXAMPLEMODULE modülü içindeki UAppendAudioClassExample sınıfında bulunan AppendAudioExample işlevini kullanır.
Not: Örneği başarıyla çalıştırmak için, RuntimeAudioImporter modülünü .Build.cs dosyasındaki PublicDependencyModuleNames veya PrivateDependencyModuleNames listesine ve ayrıca projenizin .uproject dosyasına eklediğinizden emin olun.
#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
OnPopulateAudioState temsilcisi, OnPopulateAudioData ile benzer şekilde çalışır ancak doldurulan ses verilerini yayınlamaz. Bu, doldurulan ses verilerinin bir dizisini geçirmeden ses verilerinin ne zaman doldurulduğunu takip etmek istediğinizde kullanışlı olabilir ve bu performansı artırabilir.
- 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 Verileriyle Çalışma
Oynatma sırasında PCM verilerine gerçek zamanlı erişim için bkz. PCM Veri İşleme.