Importar audio
El proceso de importar audio en tiempo de ejecución se puede desglosar en varios pasos:
- Crear un Runtime Audio Importer.
- Vincular a los delegados necesarios (OnProgress y OnResult).
- Importar audio desde un archivo o un buffer.
- Reproducir la onda de sonido importada obtenida del delegado OnResult (más información aquí).
Asegúrese de que tanto las instancias de Runtime Audio Importer como de Sound Wave no sean recolectadas por el recolector de basura antes de tiempo manteniendo una referencia fuerte a ellas, lo cual se puede lograr asignándolas a variables separadas utilizando UPROPERTY(), TStrongObjectPtr, o cualquier otro método que previene que el objeto sea destruido.
Ejemplo en planos
Primero, necesitas crear un objeto Runtime Audio Importer. Debes asegurarte de que sea tratado como una referencia fuerte por el recolector de basura, lo cual se puede lograr colocándolo como una variable separada en los planos. Esto previene la destrucción prematura del objeto.
- Blueprint
- C++
// UPROPERTY() is used here to prevent the object from being prematurely garbage collected
UPROPERTY()
class URuntimeAudioImporterLibrary* Importer;
Importer = URuntimeAudioImporterLibrary::CreateRuntimeAudioImporter();
Para rastrear el progreso de la importación de datos de audio, puedes enlazar al delegado OnProgress
(Blueprints) / OnProgressNative
(C++). Esto te permitirá monitorear el progreso y, por ejemplo, implementar una pantalla de carga. Para enlazar a este delegado, simplemente puedes extraer el pin de evento desde el nodo de enlazar evento.
- 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);
});
Para ser notificado cuando el proceso de importación de datos de audio esté completo y para acceder a la referencia de la onda de sonido resultante, debes vincularte al delegado OnResult
(Blueprints) / OnResultNative
(C++). Además, asegúrate de que la onda de sonido importada sea tratada como una referencia fuerte por el recolector de basura para prevenir una recolección de basura no deseada y prematura. Esto se puede lograr colocándola como una variable separada en Blueprints.
- 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));
});
Inicia el proceso de importación de audio llamando a la función correspondiente, que puede manejar formatos de datos de audio tanto comprimidos como no comprimidos.
- 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);
Una vez que el proceso de importación esté completo, la onda de sonido importada resultante se puede obtener a través del delegado OnResult
.
Ejemplo completo
- Blueprint
- C++
Este es un ejemplo básico de código para importar audio desde un archivo.
El ejemplo utiliza la función ImportAudioExample
ubicada en la clase UImportAudioClassExample
dentro del módulo EXAMPLEMODULE
.
Nota: Para ejecutar el ejemplo con éxito, asegúrate de agregar el módulo RuntimeAudioImporter
a PublicDependencyModuleNames
o PrivateDependencyModuleNames
en el archivo .Build.cs, así como en el archivo .uproject de tu proyecto.
#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);
}