Ses İçeri Aktar
Genel Bakış
Çalışma zamanında ses içe aktarma işlemi birkaç adıma ayrılabilir:
- Bir Runtime Audio Importer oluşturun
- Gerekli temsilcilere bağlanın (OnProgress ve OnResult)
- Bir dosyadan veya tampondan ses içe aktarın
- OnResult temsilcisinden elde edilen içe aktarılmış ses dalgasını çalın (daha fazla bilgi burada)
Hem Runtime Audio Importer hem de Sound Wave örneklerinin erken çöp toplama tarafından temizlenmemesini sağlamak için, onlara UPROPERTY(), TStrongObjectPtr veya nesnenin yok edilmesini engelleyen herhangi başka bir yöntem kullanarak ayrı değişkenlere atayarak sabit bir referans tutun.
Desteklenen Ses Formatları
Runtime Audio Importer aşağıdaki ses formatlarını içe aktarmayı destekler:
| Format | Açıklama |
|---|---|
| MP3 | MPEG-1/2/2.5 Audio Layer I/II/III |
| WAV | Waveform Audio File Format |
| FLAC | Free Lossless Audio Codec |
| OGG VORBIS | Vorbis sesli Ogg kapsayıcısı |
| OGG OPUS | Opus sesli Ogg kapsayıcısı |
| BINK | Bink Audio |
| RAW (PCM) | Sıkıştırılmamış Pulse-Code Modulation ses verisi (Int8, UInt8, Int16, UInt16, Int32, UInt32, Float32) |
Ses içe aktarırken, formatı açıkça belirtebilir veya dosya uzantısına veya içeriğine dayalı otomatik format algılamayı kullanabilirsiniz.
Akış Ses İçe Aktarmaları
Ses verilerinin artımlı olarak alındığı (örneğin, bir sunucudan, gerçek zamanlı yakalamadan veya ağ akışlarından) akış senaryoları için Streaming Sound Waves kullanmayı düşünün.
Bu yöntem, ses verilerini aynı ses dalgasının tamponuna eklemek için sürekli bir yol sağlar ve canlı yayınlar veya parçalar halinde işlenen büyük dosyalar için uygundur. Daha fazla ayrıntı için Streaming Sound Wave belgelerine bakın.
Temel Uygulama Adımları
1. Runtime Audio Importer Oluştur
İlk olarak, bir Runtime Audio Importer nesnesi oluşturmanız gerekir. Çöp toplayıcı tarafından güçlü bir referans olarak ele alındığından emin olmalısınız.
- Blueprint
- C++

// UPROPERTY() is used here to prevent the object from being prematurely garbage collected
UPROPERTY()
class URuntimeAudioImporterLibrary* Importer;
Importer = URuntimeAudioImporterLibrary::CreateRuntimeAudioImporter();
2. OnProgress Temsilcisine Bağlanın
Ses verisi içe aktarma işleminin ilerlemesini takip etmek için, OnProgress (Blueprint'ler) / OnProgressNative (C++) temsilcisine bağlanabilirsiniz.
- Blueprint
- C++

// Assuming Importer is a UE reference to a URuntimeAudioImporterLibrary object
// AddWeakLambda is used just as an example. You can use any other method to bind the delegate, such as AddUObject, AddUFunction, etc.
Importer->OnProgressNative.AddWeakLambda(this, [](int32 Percentage)
{
UE_LOG(LogTemp, Log, TEXT("Import progress: %d"), Percentage);
});
Bu, ilerlemeyi izlemenize ve örneğin bir yükleme ekranı uygulamanıza olanak tanır.
3. OnResult Temsilcisine Bağlanın
Ses verisi içe aktarma işlemi tamamlandığında bildirilmek ve ortaya çıkan ses dalgasının referansına erişmek için, OnResult (Blueprint'ler) / OnResultNative (C++) temsilcisine bağlanmalısınız.
- Blueprint
- C++

// Assuming Importer is a UE reference to a URuntimeAudioImporterLibrary object
// AddWeakLambda is used just as an example. You can use any other method to bind the delegate, such as AddUObject, AddUFunction, etc.
Importer->OnResultNative.AddWeakLambda(this, [](URuntimeAudioImporterLibrary* Importer, UImportedSoundWave* ImportedSoundWave, ERuntimeImportStatus Status)
{
UE_LOG(LogTemp, Log, TEXT("Import result: %s"), *UEnum::GetValueAsString(Status));
});
İçe aktarılan ses dalgasının, istenmeyen erken çöp toplamayı önlemek için çöp toplayıcı tarafından güçlü bir referans olarak ele alındığından emin olun. Bu, onu Blueprints'te ayrı bir değişken olarak yerleştirerek yapılabilir.
4. Ses İçe Aktarmayı Başlat
Sıkıştırılmış ve sıkıştırılmamış ses veri formatlarının her ikisini de işleyebilen ilgili işlevi çağırarak ses içe aktarma işlemini başlatın.
- Blueprint
- C++

// Assuming Importer is a UE reference to a URuntimeAudioImporterLibrary object
// Import audio from a file
Importer->ImportAudioFromFile(TEXT("C:/Folder/AudioFile.mp3"), ERuntimeAudioFormat::Auto);
// Import audio from a buffer
TArray<uint8> AudioData = ...; // Fill the array with your audio data
Importer->ImportAudioFromBuffer(MoveTemp(AudioData), ERuntimeAudioFormat::OggVorbis);
// Import audio from a RAW file
Importer->ImportAudioFromRAWFile(TEXT("C:/Folder/AudioFile.raw"), ERuntimeRAWAudioFormat::Int8, 44100, 2);
// Import audio from a RAW buffer
TArray<uint8> RAWBuffer = ...; // Fill the array with your PCM int 16-bit audio data
Importer->ImportAudioFromRAWBuffer(MoveTemp(RAWBuffer), ERuntimeRAWAudioFormat::Int16, 44100, 2);
Yardımcı Fonksiyonlar
Ses Dosyalarını Bulma
Desteklenen ses dosyalarını bulmak için bir dizini tarayabilirsiniz:
- Blueprint
- C++

URuntimeAudioUtilities::ScanDirectoryForAudioFiles(TEXT("C:/Folder/"), true,
FOnScanDirectoryForAudioFilesResultNative::CreateWeakLambda(this, [this](bool bSucceeded, const TArray<FString>& AudioFilePaths)
{
// Handle the result
}));
Tam Örnek
İşte ses içe aktarmak için tam bir uygulama örneği:
- Blueprint
- C++

Bu, bir dosyadan ses içe aktarmak için temel bir kod örneğidir.
Örnek, EXAMPLEMODULE modülü içindeki UImportAudioClassExample sınıfında bulunan ImportAudioExample işlevini kullanır.
Örneği başarıyla çalıştırmak için, RuntimeAudioImporter modülünü hem .Build.cs dosyasındaki PublicDependencyModuleNames veya PrivateDependencyModuleNames listesine, hem de projenizin .uproject dosyasına eklediğinizden emin olun.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "ImportAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UImportAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void ImportAudioExample();
private:
// Please pay attention to making the RuntimeAudioImporter a hard reference, such as using UPROPERTY(), to prevent it from being prematurely garbage collected
UPROPERTY()
class URuntimeAudioImporterLibrary* RuntimeAudioImporter;
};
#include "ImportAudioClassExample.h"
#include "RuntimeAudioImporterLibrary.h"
void UImportAudioClassExample::ImportAudioExample()
{
RuntimeAudioImporter = URuntimeAudioImporterLibrary::CreateRuntimeAudioImporter();
if (!IsValid(RuntimeAudioImporter))
{
UE_LOG(LogTemp, Error, TEXT("Failed to create audio importer"));
return;
}
RuntimeAudioImporter->OnProgressNative.AddWeakLambda(this, [](int32 Percentage)
{
UE_LOG(LogTemp, Log, TEXT("Audio importing percentage: %d"), Percentage);
});
RuntimeAudioImporter->OnResultNative.AddWeakLambda(this, [this](URuntimeAudioImporterLibrary* Importer, UImportedSoundWave* ImportedSoundWave, ERuntimeImportStatus Status)
{
if (Status == ERuntimeImportStatus::SuccessfulImport)
{
UE_LOG(LogTemp, Warning, TEXT("Successfully imported audio with sound wave %s"), *ImportedSoundWave->GetName());
// Here you can handle ImportedSoundWave playback, like "UGameplayStatics::PlaySound2D(GetWorld(), ImportedSoundWave);"
}
else
{
UE_LOG(LogTemp, Error, TEXT("Failed to import audio"));
}
RuntimeAudioImporter = nullptr;
});
RuntimeAudioImporter->ImportAudioFromFile(TEXT("C:/Folder/Example.mp3"), ERuntimeAudioFormat::Auto);
}