Записываемая Звуковая Волна
Обзор
Записываемая звуковая волна является производной от потоковой звуковой волны. Она поддерживает захват аудиоданных с входных устройств, таких как микрофон, и их воспроизведение, с теми же возможностями, что и импортированная звуковая волна (включая перемотку, использование в SoundCues и т.д.). Вы даже можете одновременно записывать и воспроизводить аудио без каких-либо ограничений.
Для обнаружения голосовой активности (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
), так как иногда нулевой индекс не является устройством по умолчанию.
Проверка статуса захвата
Вы можете проверить, захватывает ли звуковая волна аудио в данный момент:
- 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
для частого переключения захвата. Сначала следует запустить сам захват в менее критичное время (например, на экране загрузки), а затем использовать mute/unmute для управления моментом фактического накопления аудиоданных.
Если вы используете UE 5.2 или более раннюю версию и хотите устранить небольшие замирания, рассмотрите возможность запуска захвата в момент, когда это замирание может быть незначительным. Например, вы можете запустить захват во время экрана загрузки вашей игры, сразу после этого заглушить capturable sound wave, а затем включить звук capturable sound wave, когда потребуется захват аудиоданных без каких-либо задержек.
Полный пример
Вот полный пример реализации использования capturable sound wave:
- Blueprint
- C++
Это базовый пример кода для захвата аудиоданных с входного устройства (микрофона) с использованием capturable sound wave.
В примере используется функция 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);
}