Onda Sonora Catturabile
Panoramica
Un'onda sonora catturabile deriva dall'onda sonora in streaming. Supporta la cattura di dati audio da dispositivi di input come un microfono e la loro riproduzione, con le stesse capacità di un'onda sonora importata (incluso il riavvolgimento, l'uso in SoundCues, ecc.). Puoi persino catturare e riprodurre audio simultaneamente senza alcuna limitazione.
Per il Rilevamento dell'Attività Vocale (VAD), consulta questa pagina.
L'onda sonora catturabile richiede automaticamente i permessi del microfono su iOS e Android una volta avviata la cattura.
Utilizzo Base
Creare un'Onda Sonora Catturabile
Per prima cosa dovresti creare un'onda sonora catturabile.
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Dovresti trattare l'onda sonora catturabile come un riferimento forte per prevenirne la distruzione prematura (ad esempio assegnandola a una variabile separata in Blueprints o usando UPROPERTY()
in C++).
Ottenere i Dispositivi di Input Disponibili
Per utilizzare questa funzionalità, devi prima ottenere tutti i dispositivi di input audio disponibili che possono essere utilizzati per la cattura.
- Blueprint
- C++
UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Avvio e Arresto della Cattura
Dopo aver ottenuto i dispositivi disponibili, puoi iniziare a catturare i dati audio dal dispositivo di input e fermarla quando necessario.
- 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 è l'indice del dispositivo nell'array dei dispositivi disponibili ottenuto dal passaggio precedente. Per utilizzare il dispositivo di input audio predefinito, passa -1
in Blueprints o Audio::DefaultDeviceIndex
in C++ (che equivale a INDEX_NONE
), poiché a volte l'indice zero non è il dispositivo predefinito.
Verifica dello Stato di Cattura
Puoi verificare se la sound wave sta attualmente catturando audio:
- Blueprint
- C++
// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Funzionalità Avanzate
Attivazione e Disattivazione del Mutecattura
Puoi scegliere di attivare o disattivare il mutecattura del suono per impedire l'accumulo di dati audio senza interrompere il processo di cattura.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
UE 5.3 e più recenti: Avviare e fermare la cattura non causa più micro-freeze, quindi ToggleMute
ha lo stesso effetto di StartCapture
/StopCapture
. Potresti non aver bisogno di usare ToggleMute
per ottimizzare le prestazioni.
UE 5.2 e precedenti: Avviare la cattura tramite StartCapture
potrebbe causare micro-freeze. In queste versioni, è raccomandato usare ToggleMute
per attivare e disattivare frequentemente la cattura. Dovresti prima avviare la cattura stessa durante un momento meno critico (come una schermata di caricamento), e poi usare mute/unmute per controllare quando i dati audio vengono effettivamente accumulati.
Se stai usando UE 5.2 o precedenti e vuoi eliminare leggeri freeze, considera di avviare la cattura durante un momento in cui questo freeze potrebbe essere trascurabile. Per esempio, potresti avviare la cattura durante la schermata di caricamento del tuo gioco, silenziare la sound wave catturabile subito dopo, e poi riattivare l'audio della sound wave catturabile quando necessario per acquisire dati audio senza alcun freeze.
Esempio Completo
Ecco un esempio completo di implementazione dell'uso di una sound wave catturabile:
- Blueprint
- C++
Questo è un esempio di codice base per catturare dati audio da un dispositivo di input (microfono) usando una sound wave catturabile.
L'esempio utilizza la funzione CaptureAudioExample
situata nella classe UCaptureAudioClassExample
all'interno del modulo EXAMPLEMODULE
.
Per eseguire con successo l'esempio, assicurati di aggiungere il modulo RuntimeAudioImporter
a PublicDependencyModuleNames
o PrivateDependencyModuleNames
nel file .Build.cs, così come al file .uproject del tuo progetto.
#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"
#include "AudioCaptureDeviceInterface.h"
void UCaptureAudioClassExample::CaptureAudioExample()
{
// Create a capturable sound wave
CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
// Capture audio data from the default input device
CapturableSoundWave->StartCapture(Audio::DefaultDeviceIndex);
// 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);
}