Onde sonore capturable
Aperçu
Une onde sonore capturable est dérivée de l'onde sonore en streaming. Elle permet de capturer des données audio depuis des périphériques d'entrée comme un microphone et de les lire, avec les mêmes fonctionnalités qu'une onde sonore importée (y compris le rembobinage, l'utilisation dans des SoundCues, etc.). Vous pouvez même capturer et lire l'audio simultanément sans aucune limitation.
Pour la détection d'activité vocale (VAD), consultez cette page.
L'onde sonore capturable demande automatiquement les permissions du microphone sur iOS et Android une fois que la capture est démarrée.
Utilisation de base
Création d'une onde sonore capturable
Vous devez d'abord créer une onde sonore capturable.
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Vous devez traiter l'onde sonore capturable 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++).
Obtenir les périphériques d'entrée disponibles
Pour utiliser cette fonctionnalité, vous devez d'abord obtenir tous les périphériques audio d'entrée disponibles qui peuvent être utilisés pour la capture.
- Blueprint
- C++
UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Démarrage et arrêt de la capture
Après avoir obtenu les périphériques disponibles, vous pouvez commencer à capturer les données audio depuis le périphérique d'entrée et l'arrêter lorsque nécessaire.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
// Start capturing audio data from the input device with the specified device ID (0 in this case)
CapturableSoundWave->StartCapture(0);
// Stop capturing audio data
CapturableSoundWave->StopCapture();
DeviceId correspond à l'index du périphérique dans le tableau des périphériques disponibles obtenu à l'étape précédente.
Fonctionnalités avancées
Activer/Désactiver la capture audio
Vous pouvez choisir de couper ou rétablir la capture audio pour éviter l'accumulation de données audio sans interrompre le processus de capture.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
Ceci est utile lors de changements fréquents de capture, car démarrer l'enregistrement via StartCapture
peut causer des micro-lags côté moteur. Vous devriez d'abord démarrer la capture elle-même, puis seulement la mettre en sourdine ou la réactiver.
Si votre objectif est d'éliminer un léger freeze, vous pourriez envisager de démarrer la capture durant un moment où ce freeze serait négligeable. Par exemple, vous pourriez démarrer la capture pendant l'écran de chargement de votre jeu, mettre en sourdine la sound wave capturable juste après, puis la réactiver lorsque nécessaire pour capturer des données audio sans aucun lag.
Exemple complet
Voici un exemple complet d'implémentation utilisant une sound wave capturable :
- Blueprint
- C++
Ceci est un exemple de code basique pour capturer des données audio depuis un périphérique d'entrée (microphone) en utilisant une sound wave capturable.
L'exemple utilise la fonction CaptureAudioExample
située dans la classe UCaptureAudioClassExample
au sein du module EXAMPLEMODULE
.
Pour exécuter l'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 "CaptureAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UCaptureAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void CaptureAudioExample();
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 UCapturableSoundWave* CapturableSoundWave;
};
#include "CaptureAudioClassExample.h"
#include "Sound/StreamingSoundWave.h"
void UCaptureAudioClassExample::CaptureAudioExample()
{
// Create a capturable sound wave
CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
// Capture audio data from the input device with the specified device ID (0 in this case)
CapturableSoundWave->StartCapture(0);
// Delay for 5 seconds, just for demonstration purposes
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [this]()
{
// Stop capturing audio data
CapturableSoundWave->StopCapture();
// Play the sound wave
UGameplayStatics::PlaySound2D(GetWorld(), CapturableSoundWave);
}, 5, false);
}