Capturable Sound Wave
Übersicht
Eine erfassbare Soundwelle wird von der Streaming-Soundwelle abgeleitet. Sie unterstützt die Erfassung von Audiodaten von Eingabegeräten wie einem Mikrofon und deren Wiedergabe, mit denselben Fähigkeiten wie eine importierte Soundwelle (einschließlich Zurückspulen, Verwendung in SoundCues usw.). Sie können sogar Audio gleichzeitig erfassen und abspielen, ohne Einschränkungen.
Für Voice Activity Detection (VAD) siehe diese Seite.
Die erfassbare Soundwelle fordert automatisch Mikrofonberechtigungen auf iOS und Android an, sobald die Erfassung gestartet wird.
Grundlegende Verwendung
Erstellen einer erfassbaren Soundwelle
Zuerst sollten Sie eine erfassbare Soundwelle erstellen.
- Blueprint
- C++

UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Sie sollten die aufnehmbare Soundwelle als starke Referenz behandeln, um eine vorzeitige Zerstörung zu verhindern (z. B. durch Zuweisung zu einer separaten Variable in Blueprints oder Verwendung von UPROPERTY() in C++).
Verfügbare Eingabegeräte abrufen
Um diese Funktion zu nutzen, müssen Sie zuerst alle verfügbaren Audio-Eingabegeräte abrufen, die für die Aufnahme verwendet werden können.
- Blueprint
- C++

UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Starten und Stoppen der Aufnahme
Nachdem Sie die verfügbaren Geräte abgerufen haben, können Sie mit der Aufnahme von Audiodaten vom Eingabegerät beginnen und diese bei Bedarf stoppen.
- 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 ist der Index des Geräts im Array der verfügbaren Geräte aus dem vorherigen Schritt. Um das Standard-Audioeingabegerät zu verwenden, übergeben Sie -1 in Blueprints oder Audio::DefaultDeviceIndex in C++ (was INDEX_NONE entspricht), da manchmal der Index Null nicht das Standardgerät ist.
Überprüfen des Aufnahmestatus
Sie können überprüfen, ob die Sound Wave gerade Audio aufnimmt:
- Blueprint
- C++

// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Funktionen für Fortgeschrittene
Stummschalten und Aufheben der Stummschaltung der Aufnahme
Sie können die Tonaufnahme stummschalten oder die Stummschaltung aufheben, um die Ansammlung von Audiodaten zu verhindern, ohne den Aufnahmeprozess zu unterbrechen.
- Blueprint
- C++

// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
UE 5.3 und neuer: Das Starten und Stoppen der Aufnahme verursacht keine Ruckler mehr, daher hat ToggleMute den gleichen Effekt wie StartCapture/StopCapture. Sie müssen ToggleMute möglicherweise überhaupt nicht für Leistungsoptimierungen verwenden.
UE 5.2 und älter: Das Starten der Aufnahme über StartCapture kann leichte Ruckler verursachen. In diesen Versionen wird empfohlen, ToggleMute für häufiges Ein- und Ausschalten der Aufnahme zu verwenden. Sie sollten die Aufnahme selbst zunächst zu einem weniger kritischen Zeitpunkt starten (z. B. während eines Ladebildschirms) und dann Stummschaltung/Stummschaltung aufheben verwenden, um zu steuern, wann Audiodaten tatsächlich akkumuliert werden.
Wenn Sie UE 5.2 oder älter verwenden und leichte Einfrieren eliminieren möchten, sollten Sie in Betracht ziehen, die Aufnahme zu einem Zeitpunkt zu starten, an dem dieses Einfrieren vernachlässigbar sein könnte. Sie könnten beispielsweise die Aufnahme während des Ladebildschirms Ihres Spiels starten, die aufnehmbare Soundwelle direkt danach stummschalten und dann die Stummschaltung der aufnehmbaren Soundwelle aufheben, wenn Sie Audiodaten ohne Ruckler aufnehmen möchten.
Vollständiges Beispiel
Hier ist ein vollständiges Implementierungsbeispiel für die Verwendung einer aufnehmbaren Soundwelle:
- Blueprint
- C++

Dies ist ein grundlegendes Codebeispiel für die Aufnahme von Audiodaten von einem Eingabegerät (Mikrofon) mithilfe einer aufnehmbaren Soundwelle.
Das Beispiel verwendet die Funktion CaptureAudioExample, die sich in der Klasse UCaptureAudioClassExample innerhalb des Moduls EXAMPLEMODULE befindet.
Um das Beispiel erfolgreich auszuführen, stellen Sie sicher, dass Sie das Modul RuntimeAudioImporter entweder zu PublicDependencyModuleNames oder PrivateDependencyModuleNames in der .Build.cs-Datei sowie zu Ihrer Projektdatei .uproject hinzufügen.
#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);
}