Przechwytywalna Fala Dźwiękowa
Przegląd
Przechwytywalna fala dźwiękowa pochodzi od strumieniowej fali dźwiękowej. Obsługuje przechwytywanie danych audio z urządzeń wejściowych, takich jak mikrofon, i ich odtwarzanie, z takimi samymi możliwościami jak zaimportowana fala dźwiękowa (w tym przewijanie, użycie w SoundCues, itp.). Możesz nawet jednocześnie przechwytywać i odtwarzać dźwięk bez żadnych ograniczeń.
W celu wykrywania aktywności głosowej (VAD), zapoznaj się z tą stroną.
Przechwytywalna fala dźwiękowa automatycznie żąda uprawnień do mikrofonu na iOS i Android po rozpoczęciu przechwytywania.
Podstawowe Użycie
Tworzenie Przechwytywalnej Fali Dźwiękowej
Najpierw należy utworzyć przechwytywalną falę dźwiękową.
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Należy traktować przechwytywaną falę dźwiękową jako silną referencję, aby zapobiec przedwczesnemu zniszczeniu (np. przypisując ją do osobnej zmiennej w Blueprints lub używając UPROPERTY()
w C++).
Pobieranie dostępnych urządzeń wejściowych
Aby użyć tej funkcji, musisz najpierw pobrać wszystkie dostępne urządzenia wejściowe audio, które mogą być używane do przechwytywania.
- Blueprint
- C++
UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Rozpoczynanie i Zatrzymywanie Przechwytywania
Po uzyskaniu dostępnych urządzeń, możesz rozpocząć przechwytywanie danych audio z urządzenia wejściowego i zatrzymać je, gdy zajdzie taka potrzeba.
- 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 to indeks urządzenia w tablicy dostępnych urządzeń uzyskanej z poprzedniego kroku. Aby użyć domyślnego urządzenia wejścia audio, przekaż -1
w Blueprints lub Audio::DefaultDeviceIndex
w C++ (co równa się INDEX_NONE
), ponieważ czasami indeks zero nie jest domyślnym urządzeniem.
Sprawdzanie Statusu Przechwytywania
Możesz sprawdzić, czy fala dźwiękowa aktualnie przechwytuje audio:
- Blueprint
- C++
// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Zaawansowane Funkcje
Wyciszanie i Włączanie Dźwięku Przechwytywania
Możesz wybrać wyciszenie lub włączenie dźwięku przechwytywania, aby zapobiec gromadzeniu danych audio bez przerywania procesu przechwytywania.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
UE 5.3 i nowsze: Rozpoczynanie i zatrzymywanie przechwytywania nie powoduje już zacinania, więc ToggleMute
ma taki sam efekt jak StartCapture
/StopCapture
. Możesz w ogóle nie potrzebować używać ToggleMute
do optymalizacji wydajności.
UE 5.2 i starsze: Rozpoczęcie przechwytywania przez StartCapture
może powodować niewielkie zacinanie. W tych wersjach zaleca się używanie ToggleMute
do częstego włączania i wyłączania przechwytywania. Najpierw należy uruchomić samo przechwytywanie w mniej krytycznym momencie (np. na ekranie ładowania), a następnie używać wyciszania/odciszania, aby kontrolować, kiedy dane audio są faktycznie gromadzone.
Jeśli używasz UE 5.2 lub starszej i chcesz wyeliminować lekkie zamrożenia, rozważ rozpoczęcie przechwytywania w czasie, gdy to zamrożenie może być pomijalne. Na przykład możesz rozpocząć przechwytywanie podczas ekranu ładowania gry, wyciszyć przechwytywalną falę dźwiękową zaraz potem, a następnie odciszyć przechwytywalną falę dźwiękową, gdy jest potrzebna do przechwytywania danych audio bez żadnych zaciąć.
Kompletny przykład
Oto kompletny przykład implementacji użycia przechwytywalnej fali dźwiękowej:
- Blueprint
- C++
To podstawowy przykład kodu do przechwytywania danych audio z urządzenia wejściowego (mikrofonu) przy użyciu przechwytywalnej fali dźwiękowej.
Przykład używa funkcji CaptureAudioExample
znajdującej się w klasie UCaptureAudioClassExample
w module EXAMPLEMODULE
.
Aby pomyślnie uruchomić przykład, upewnij się, że dodałeś moduł RuntimeAudioImporter
do PublicDependencyModuleNames
lub PrivateDependencyModuleNames
w pliku .Build.cs, a także do pliku .uproject twojego projektu.
#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);
}