Erfassbare Schallwelle
Übersicht
Eine erfassbare Schallwelle wird von der Streaming-Schallwelle abgeleitet. Sie unterstützt das Erfassen von Audiodaten von Eingabegeräten wie einem Mikrofon und deren Wiedergabe, mit den gleichen Fähigkeiten wie eine importierte Schallwelle (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 Schallwelle fordert automatisch Mikrofonberechtigungen auf iOS und Android an, sobald die Erfassung gestartet wird.
Grundlegende Verwendung
Erstellen einer erfassbaren Schallwelle
Zuerst sollten Sie eine erfassbare Schallwelle erstellen.
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Sie sollten die aufnehmbare Schallwelle als starke Referenz behandeln, um 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
}));
Aufnahme starten und stoppen
Nachdem Sie die verfügbaren Geräte abgerufen haben, können Sie die Aufnahme von Audiodaten vom Eingabegerät starten und 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, die im vorherigen Schritt erhalten wurden. Um das Standard-Audioeingabegerät zu verwenden, übergeben Sie -1
in Blueprints oder Audio::DefaultDeviceIndex
in C++ (was INDEX_NONE
entspricht), da manchmal der Null-Index nicht das Standardgerät ist.
Überprüfen des Aufnahmestatus
Sie können überprüfen, ob die Soundwelle derzeit Audio aufnimmt:
- Blueprint
- C++
// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Erweiterte Funktionen
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
. Möglicherweise müssen Sie ToggleMute
überhaupt nicht für die Leistungsoptimierung verwenden.
UE 5.2 und älter: Das Starten der Aufnahme über StartCapture
kann geringfügige Ruckler verursachen. In diesen Versionen wird empfohlen, ToggleMute
für das häufige Ein- und Ausschalten der Aufnahme zu verwenden. Sie sollten die Aufnahme selbst zunächst zu einer weniger kritischen Zeit (wie einem Ladebildschirm) starten 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 Schallwelle direkt danach stummschalten und dann die Stummschaltung der aufnehmbaren Schallwelle aufheben, wenn Sie benötigte Audiodaten ohne Ruckler aufnehmen möchten.
Vollständiges Beispiel
Hier ist ein vollständiges Implementierungsbeispiel für die Verwendung einer aufnehmbaren Schallwelle:
- Blueprint
- C++
Dies ist ein grundlegendes Codebeispiel zum Erfassen von Audiodaten von einem Eingabegerät (Mikrofon) mithilfe einer aufnehmbaren Schallwelle.
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);
}