Diffusion d'onde sonore en continu
Pour la détection d'activité vocale (VAD), consultez cette page.
Une onde sonore diffusée en continu est un type d'onde sonore importée qui permet d'ajouter des données audio dynamiquement, même pendant la lecture. Elle offre les mêmes fonctionnalités qu'une onde sonore importée, comme le rembobinage, et peut être utilisée dans des SoundCues, etc.
Création d'une onde sonore en continu
Vous devez d'abord créer une onde sonore diffusée en continu. Notez que vous devez la traiter comme une référence forte pour éviter une destruction prématurée (par exemple en l'assignant à une variable séparée dans Blueprints ou en utilisant UPROPERTY()
en C++).
- Blueprint
- C++
UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
Lecture de l'onde sonore
Vous pouvez ensuite lire cette onde sonore. Cependant, ce n'est pas nécessaire de le faire maintenant, vous pouvez commencer à lire l'onde sonore plus tard.
Pré-allocation des données audio
Optionnellement, vous pouvez pré-allouer les données audio (en octets) pour éviter de réallouer l'intégralité du buffer PCM à chaque fois que de nouvelles données audio sont ajoutées.
- 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
}));
Ajout de données audio
Pour ajouter des données audio à la fin du tampon existant, utilisez les fonctions appropriées pour ajouter dynamiquement des données audio. La lecture suivra la séquence de file d'attente de ces ajouts.
- 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);
Éviter la lecture audio accélérée
Souvent, lorsque vous devez diffuser des données audio et les lire simultanément, vous devriez ajouter un léger délai avant la lecture pour éviter une audio accélérée due à un remplissage trop rapide du buffer. Un délai d'environ une demi-seconde est généralement recommandé.
Exemple d'utilisation
Finalement, votre implémentation pourrait ressembler à ceci :
- Blueprint
- C++
Ceci est un exemple de code basique pour ajouter des données audio à une onde sonore en streaming.
L'exemple utilise la fonction AppendAudioExample
située dans la classe UAppendAudioClassExample
au sein du module EXAMPLEMODULE
.
Note : Pour exécuter cet exemple avec succès, assurez-vous d'ajouter le module RuntimeAudioImporter
soit à PublicDependencyModuleNames
ou à PrivateDependencyModuleNames
dans le fichier .Build.cs, ainsi qu'au fichier .uproject de votre projet.
#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
Le délégué OnPopulateAudioState fonctionne de manière similaire à OnPopulateAudioData mais ne diffuse pas les données audio peuplées. Cela peut être utile lorsque vous souhaitez suivre quand les données audio sont peuplées sans transmettre un tableau des données audio peuplées, ce qui peut améliorer les performances.
- 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
});
Travailler avec les données PCM
Pour un accès en temps réel aux données PCM pendant la lecture, consultez Gestion des données PCM.