Захватываемая звуковая волна
Обзор
Захватываемая звуковая волна является производной от потоковой звуковой волны. Она поддерживает захват аудиоданных с входных устройств, таких как микрофон, и их воспроизведение с теми же возможностями, что и у импортированной звуковой волны (включая перемотку, использование в SoundCues и т.д.). Вы даже можете одновременно захватывать и воспроизводить аудио без каких-либо ограничений.
Для обнаружения голосовой активности (VAD) обратитесь к этой странице.
Захватываемая звуковая волна автоматически запрашивает разрешения на использование микрофона на iOS и Android при начале захвата.
Базовое использование
Создание захватываемой звуковой волны
Сначала необходимо создать захватываемую звуковую волну.
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Вам следует рассматривать захватываемую звуковую волну как сильную ссылку (strong reference), чтобы предотвратить преждевременное уничтожение (например, присвоив её отдельной переменной в 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 - это индекс устройства в массиве доступных устройств, полученный на предыдущем шаге.
Проверка статуса захвата
Вы можете проверить, происходит ли в данный момент захват аудио звуковой волной:
- 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);
Это полезно при частом переключении захвата, так как запуск записи через StartCapture
может вызывать незначительные подвисания на стороне движка. Сначала следует начать сам захват, и только затем отключать/включать звук.
Если ваша цель — устранить небольшой фриз, можно рассмотреть запуск захвата в момент, когда этот фриз будет незначителен. Например, можно начать захват во время загрузочного экрана вашей игры, отключить записываемую звуковую волну сразу после этого, а затем включить её снова, когда потребуется захват аудиоданных без подвисаний.
Полный пример
Вот полный пример реализации использования записываемой звуковой волны:
- 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"
void UCaptureAudioClassExample::CaptureAudioExample()
{
// Create a capturable sound wave
CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
// Capture audio data from the input device with the specified device ID (0 in this case)
CapturableSoundWave->StartCapture(0);
// 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);
}