Akış Ses Dalgası
Ses Aktivite Tespiti (VAD) için, bu sayfaya bakın.
Bir akış ses dalgası, oynatma sırasında bile ses verilerini dinamik olarak eklemeyi destekleyen bir tür içe aktarılmış ses dalgasıdır. Geri sarma gibi bir içe aktarılmış ses dalgasıyla aynı işlevselliği sunar ve SoundCues vb. içinde kullanılabilir.
Bir akış ses dalgası oluşturma
Öncelikle bir akış ses dalgası oluşturmalısınız. Lütfen erken yok edilmeyi ö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 bu ses dalgasını oynatabilirsiniz. Ancak, bunu şimdi yapmak gerekli değildir, ses dalgasını daha sonra oynatmaya başlayabilirsiniz.
Ses verilerini önceden ayırma
İsteğe bağlı olarak, her yeni ses verisi eklendiğinde tüm PCM tamponunun yeniden ayrılmasını önlemek için ses verilerini (bayt) ö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 verilerini dinamik olarak eklemeye yönelik uygun fonksiyonları kullanın. Oynatma, bu eklemelerin sıra dizisini 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ından kaçınma
Ses dalgası oynatılırken ses verilerini akış halinde aktarırken, 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ış gereken 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ı, aralıklı 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 herhangi bir zamanda doldurmayı 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 (örn., ağ bağlantı sorunları) ek tamponlama gecikmesi ekleyin.
Örnek kullanım
Son olarak, uygulamanız şu şekilde 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 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);
}
Ses Durumunu Doldurma Üzerine
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 Verileri ile Çalışma
Oynatma sırasında PCM verilerine gerçek zamanlı erişim için PCM Veri İşleme bölümüne bakın.