موجة صوتية قابلة للالتقاط
نظرة عامة
موجة الصوت القابلة للالتقاط مشتقة من موجة الصوت المتدفقة. وهي تدعم التقاط بيانات الصوت من أجهزة الإدخال مثل الميكروفون وتشغيلها، مع نفس إمكانيات موجة الصوت المستوردة (بما في ذلك إعادة التشغيل، الاستخدام في 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) هو مؤشر الجهاز في مصفوفة الأجهزة المتاحة التي تم الحصول عليها من الخطوة السابقة. :::
التحقق من حالة التقاط الصوت
يمكنك التحقق مما إذا كانت موجة الصوت تقوم حاليًا بتسجيل الصوت:
- 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);
}