Capturable Sound Wave
Обзор
Записываемая звуковая волна (capturable sound wave) является производной от потоковой звуковой волны. Она поддерживает захват аудиоданных с входных устройств, таких как микрофон, и их воспроизведение, обладая теми же возможностями, что и импортированная звуковая волна (включая перемотку, использование в SoundCue и т.д.). Вы даже можете одновременно захватывать и воспроизводить аудио без каких-либо ограничений.
Для обнаружения голосовой активности (Voice Activity Detection, VAD) обратитесь к этой странице.
Записываемая звуковая волна автоматически запрашивает разрешения на использование микрофона на iOS и Android, как только начинается захват.
Основное использование
Создание записываемой звуковой волны
Сначала вам следует создать записываемую звуковую волну.
- Blueprint
- C++

UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Вам следует рассматривать захватываемую звуковую волну как сильную ссылку, чтобы предотвратить её преждевременное уничтожение (например, присвоив её отдельной переменной в Blueprints или используя UPROPERTY() в C++).
Получение доступных входных устройств
Чтобы использовать эту функцию, вам сначала нужно получить все доступные аудиовходные устройства, которые можно использовать для захвата.
- Blueprint
- C++

UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Запуск и остановка захвата
После получения доступных устройств вы можете начать захват аудиоданных с входного устройства и остановить его при необходимости.
- 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 — это индекс устройства в массиве доступных устройств, полученном на предыдущем шаге. Чтобы использовать устройство аудиоввода по умолчанию, передайте -1 в Blueprints или Audio::DefaultDeviceIndex в C++ (что равно INDEX_NONE), так как иногда нулевой индекс не является устройством по умолчанию.
Проверка статуса захвата
Вы можете проверить, захватывает ли Sound Wave аудио в данный момент:
- Blueprint
- C++

// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Расширенные возможности
Отключение и включение захвата звука
Вы можете отключить или включить захват звука, чтобы предотвратить накопление аудиоданных, не прерывая сам процесс захвата.
- Blueprint
- C++

// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
UE 5.3 и новее: Запуск и остановка захвата больше не вызывают просадок производительности, поэтому ToggleMute имеет тот же эффект, что и StartCapture/StopCapture. Возможно, вам вообще не понадобится использовать ToggleMute для оптимизации производительности.
UE 5.2 и более ранние: Запуск захвата через StartCapture может вызывать незначительные просадки. В этих версиях рекомендуется использовать ToggleMute для частого включения и выключения захвата. Сначала следует запустить сам захват в менее критичное время (например, на экране загрузки), а затем использовать отключение/включение звука для управления моментом фактического накопления аудиоданных.
Если вы используете UE 5.2 или более раннюю версию и хотите устранить небольшие замирания, рассмотрите возможность запуска захвата в момент, когда это замирание может быть незначительным. Например, вы можете запустить захват во время экрана загрузки вашей игры, сразу после этого отключить звук у захватываемой звуковой волны, а затем включить звук у захватываемой звуковой волны, когда потребуется захват аудиоданных без каких-либо просадок.
Полный пример
Вот полный пример реализации использования захватываемой звуковой волны:
- Blueprint
- C++

Это базовый пример кода для захвата аудиоданных с входного устройства (микрофона) с использованием захватываемой звуковой волны.
В примере используется функция CaptureAudioExample, расположенная в классе UCaptureAudioClassExample внутри модуля EXAMPLEMODULE.
Для успешного запуска примера убедитесь, что вы добавили модуль RuntimeAudioImporter либо в PublicDependencyModuleNames, либо в PrivateDependencyModuleNames в файле .Build.cs, а также в файл .uproject вашего проекта.
#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);
}