Ses İçeri Aktarma
Genel Bakış
Çalışma zamanında ses içeri aktarma işlemi birkaç adıma ayrılabilir:
- Bir Çalışma Zamanı Ses İçeri Aktarıcı oluştur
- Gerekli temsilcilere bağlan (OnProgress ve OnResult)
- Bir dosyadan veya tampondan ses içeri aktar
- OnResult temsilcisinden elde edilen içeri aktarılmış ses dalgasını çal (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 kullanarak veya nesnenin yok edilmesini engelleyen herhangi başka bir yöntemle ayrı değişkenlere atayarak sabit bir referans tutun.
Desteklenen Ses Formatları
Runtime Audio Importer aşağıdaki ses formatlarını içeri 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 konteyneri |
OGG OPUS | Opus sesli Ogg konteyneri |
BINK | Bink Audio |
RAW (PCM) | Sıkıştırılmamış Pulse-Code Modulation ses verisi (Int8, UInt8, Int16, UInt16, Int32, UInt32, Float32) |
Ses içeri aktarırken, formatı açıkça belirtebilir veya dosya uzantısına veya içeriğe dayalı otomatik format tespiti kullanabilirsiniz.
Akış Ses İçeri Aktarmaları
Ses verilerinin artımlı olarak alındığı akış senaryoları için (örneğin, bir sunucudan, gerçek zamanlı yakalamadan veya ağ akışlarından), Streaming Sound Waves kullanmayı düşünün.
Bu yöntem, ses verilerini aynı ses dalgasının tamponuna sürekli olarak eklemenin sürekli bir yolunu sağlar, bu da onu canlı yayınlar veya parçalar halinde işlenen büyük dosyalar için uygun hale getirir. 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ğlanma
Ses verilerini içe aktarma 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ğlanma
Ses verisi içe aktarma işlemi tamamlandığında bildirim almak ve ortaya çıkan ses dalgasının referansına erişmek için, OnResult
(Blueprints) / 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));
});
Garbage collector tarafından içe aktarılan ses dalgasının istenmeyen erken garbage collection'ı önlemek için güçlü bir referans olarak ele alındığından emin olun. Bu, Blueprints'te ayrı bir değişken olarak yerleştirilerek yapılabilir.
4. Ses İçe Aktarmayı Başlat
İlgili fonksiyonu çağırarak ses içe aktarma işlemini başlatın, bu fonksiyon hem sıkıştırılmış hem de sıkıştırılmamış ses veri formatlarını işleyebilir.
- 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);
Utility Fonksiyonları
Ses Dosyalarını Bulma
Desteklenen ses dosyalarını taramak için bir dizin 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 aktarma 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
fonksiyonunu kullanır.
Ö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 "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);
}