Streaming de onda sonora
Para detecção de atividade de voz (VAD), consulte esta página.
Uma streaming de onda sonora é um tipo de onda sonora importada que suporta a adição dinâmica de dados de áudio, mesmo durante a reprodução. Ela oferece a mesma funcionalidade de uma onda sonora importada, como retroceder, e pode ser usada em SoundCues, etc.
Criando uma streaming de onda sonora
Primeiro, você deve criar uma streaming de onda sonora. Observe que você deve tratá-la como uma referência forte para evitar destruição prematura (por exemplo, atribuindo-a a uma variável separada em Blueprints ou usando UPROPERTY()
em C++).
- Blueprint
- C++
UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
Reproduzindo a onda sonora
Você pode então reproduzir essa onda sonora. No entanto, isso não é necessário fazer agora, você pode começar a reproduzir a onda sonora mais tarde.
Pré-alocação de dados de áudio
Opcionalmente, você pode pré-alocar dados de áudio (bytes) para evitar realocar todo o buffer PCM cada vez que novos dados de áudio são anexados.
- 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
}));
Anexando dados de áudio
Para adicionar dados de áudio ao final do buffer existente, use as funções apropriadas para anexar dinamicamente dados de áudio. A reprodução seguirá a sequência de fila desses anexos.
- 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);
Evitando reprodução acelerada de áudio
Frequentemente, quando você precisa transmitir dados de áudio e reproduzir simultaneamente, deve adicionar um pequeno atraso antes da reprodução para evitar áudio acelerado devido ao preenchimento muito rápido do buffer. Um atraso de aproximadamente meio segundo é geralmente recomendado.
Exemplo de uso
Por fim, sua implementação pode ficar assim:
- Blueprint
- C++
Este é um exemplo básico de código para anexar dados de áudio a uma onda sonora de streaming.
O exemplo usa a função AppendAudioExample
localizada na classe UAppendAudioClassExample
dentro do módulo EXAMPLEMODULE
.
Observação: Para executar o exemplo com sucesso, certifique-se de adicionar o módulo RuntimeAudioImporter
a PublicDependencyModuleNames
ou PrivateDependencyModuleNames
no arquivo .Build.cs, bem como ao arquivo .uproject do seu projeto.
#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);
}
On Populate Audio State
O delegado OnPopulateAudioState funciona de forma similar ao OnPopulateAudioData, mas não transmite os dados de áudio populados. Isso pode ser útil quando você deseja rastrear quando os dados de áudio são populados sem passar um array dos dados de áudio populados, o que pode melhorar o desempenho.
- 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
});
Trabalhando com Dados PCM
Para acesso em tempo real aos dados PCM durante a reprodução, consulte Manipulação de Dados PCM.