Importar audio
El proceso de importar audio en tiempo de ejecución se puede desglosar en varios pasos:
- Crear un Runtime Audio Importer.
- Vincularse a los delegados necesarios (OnProgress y OnResult).
- Importar audio desde un archivo o un búfer.
- Reproducir la Sound Wave importada obtenida del delegado OnResult (más información aquí).
Asegúrese de que tanto Runtime Audio Importer como Sound Wave no sean recolectados por el recolector de basura antes de tiempo, manteniendo una referencia fuerte a ellos. Esto se puede lograr asignándolos a variables separadas utilizando UPROPERTY(), TStrongObjectPtr u otro método que evite que el objeto sea destruido.
Importaciones de audio en streaming
Para escenarios de transmisión donde los datos de audio se reciben de manera incremental (por ejemplo, desde un servidor, captura en tiempo real o flujos de red), considere usar Streaming Sound Waves. Este método proporciona una forma continua de agregar datos de audio al búfer de la misma Sound Wave, lo que lo hace adecuado para transmisiones en vivo o archivos grandes procesados en fragmentos. Consulte la documentación de Streaming Sound Wave para más detalles.
Formatos de audio compatibles
Runtime Audio Importer admite la importación de los siguientes formatos de audio:
- MP3 - MPEG-1/2/2.5 Audio Layer I/II/III
- WAV - Waveform Audio File Format
- FLAC - Free Lossless Audio Codec
- OGG VORBIS - Contenedor Ogg con audio Vorbis
- OGG OPUS - Contenedor Ogg con audio Opus
- BINK - Bink Audio
- RAW (PCM) - Datos de audio de modulación por impulsos codificados sin comprimir (Int8, UInt8, Int16, UInt16, Int32, UInt32, Float32)
Al importar audio, puede especificar el formato explícitamente o utilizar la detección automática según la extensión del archivo o su contenido.
Buscar archivos de audio
Puede escanear un directorio en busca de archivos de audio compatibles:
- Blueprint
- C++
URuntimeAudioUtilities::ScanDirectoryForAudioFiles(TEXT("C:/Folder/"), true,
FOnScanDirectoryForAudioFilesResultNative::CreateWeakLambda(this, [this](bool bSucceeded, const TArray<FString>& AudioFilePaths)
{
// Handle the result
}));
Ejemplos
Primero, necesitas crear un objeto Runtime Audio Importer. Debes asegurarte de que sea tratado como una referencia fuerte por el recolector de basura, lo que se puede lograr colocándolo como una variable separada en Blueprints. Esto evita 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 realizar un seguimiento del 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 enlace de 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 se complete y para acceder a la referencia de la onda sonora resultante, debes vincularte al delegado OnResult
(Blueprints) / OnResultNative
(C++). Además, asegúrate de que la onda sonora importada sea tratada como una referencia fuerte por el recolector de basura para evitar una recolección de basura prematura no deseada. 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));
});
Inicie el proceso de importación de audio llamando a la función correspondiente, que puede manejar formatos de datos de audio tanto comprimidos como sin comprimir.
- 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 se completa, la onda de sonido importada resultante se puede obtener a través del delegado OnResult
.
Ejemplo completo
- Blueprint
- C++
Este es un ejemplo de código básico 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 correctamente, asegúrate de agregar el módulo RuntimeAudioImporter
a PublicDependencyModuleNames
o PrivateDependencyModuleNames
en el archivo .Build.cs, así como a tu archivo .uproject del 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);
}