تدفق موجة الصوت
لاكتشاف نشاط الصوت (VAD)، يُرجى الرجوع إلى هذه الصفحة.
موجة الصوت المتدفقة هي نوع من موجات الصوت المستوردة التي تدعم إضافة بيانات الصوت ديناميكيًا، حتى أثناء التشغيل. توفر نفس الوظائف مثل موجة الصوت المستوردة، مثل إعادة التشغيل، ويمكن استخدامها في SoundCues، إلخ.
إنشاء موجة صوت متدفقة
أولاً يجب عليك إنشاء موجة صوت متدفقة. يرجى ملاحظة أنه يجب التعامل معها كمرجع قوي لمنع التدمير المبكر (على سبيل المثال، عن طريق تعيينها لمتغير منفصل في Blueprints أو استخدام UPROPERTY()
في C++).
- Blueprint
- C++
UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
تشغيل موجة الصوت
يمكنك بعد ذلك تشغيل موجة الصوت تلك. ومع ذلك، ليس من الضروري القيام بذلك الآن، يمكنك بدء تشغيل موجة الصوت لاحقًا.
تخصيص بيانات الصوت مسبقًا
اختياريًا، يمكنك تخصيص بيانات الصوت (بايت) مسبقًا لتجنب إعادة تخصيص مخزن PCM بالكامل في كل مرة يتم فيها إلحاق بيانات صوتية جديدة.
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->PreAllocateAudioData(12582912, FOnPreAllocateAudioDataResultNative::CreateWeakLambda(this, [StreamingSoundWave](bool bSucceeded)
{
// Handle the result
}));
إلحاق بيانات الصوت
لإضافة بيانات الصوت إلى نهاية المخزن المؤقت الحالي، استخدم الدوال المناسبة للإلحاق الديناميكي لبيانات الصوت. سيتابع التشغيل تسلسل الطابور لهذه الإلحاقات.
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
// Example of appending encoded audio data
TArray<uint8> AudioData = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(AudioData, ERuntimeAudioFormat::Auto);
// Or, if you have raw audio data
TArray<uint8> RawAudioData = ...; // Fill with raw audio data
StreamingSoundWave->AppendAudioDataFromRAW(RawAudioData, ERuntimeRAWAudioFormat::Float32, 44100, 2);
تجنب تشغيل الصوت المسرع
في كثير من الأحيان، عندما تحتاج إلى بث بيانات الصوت والتشغيل في نفس الوقت، يجب إضافة تأخير بسيط قبل التشغيل لتجنب تسارع الصوت بسبب ملء المخزن المؤقت بسرعة كبيرة. يُوصى عادةً بتأخير يبلغ حوالي نصف ثانية.
مثال على الاستخدام
في النهاية، قد يبدو تنفيذك كما يلي:
- Blueprint
- C++
هذا مثال أساسي لإلحاق بيانات الصوت بموجة صوتية متدفقة.
يستخدم المثال الدالة AppendAudioExample
الموجودة في الفئة UAppendAudioClassExample
داخل الوحدة النمطية EXAMPLEMODULE
.
ملاحظة: للتشغيل الناجح للمثال، تأكد من إضافة وحدة RuntimeAudioImporter
إلى إما PublicDependencyModuleNames
أو PrivateDependencyModuleNames
في ملف .Build.cs، وكذلك إلى ملف .uproject الخاص بمشروعك.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "AppendAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UAppendAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void AppendAudioExample();
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 UStreamingSoundWave* StreamingSoundWave;
};
#include "AppendAudioClassExample.h"
#include "Sound/StreamingSoundWave.h"
void UAppendAudioClassExample::AppendAudioExample()
{
// Create a streaming sound wave
StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
// Append audio data
TArray<uint8> StreamedAudioDataToAdd = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(StreamedAudioDataToAdd, ERuntimeAudioFormat::Auto);
// Play the sound wave
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
}
عند ملء حالة الصوت
تعمل المفوضة OnPopulateAudioState بشكل مشابه لـ OnPopulateAudioData ولكنها لا تبث بيانات الصوت المملوءة. يمكن أن يكون هذا مفيدًا عندما تريد تتبع وقت ملء بيانات الصوت دون تمرير مصفوفة لبيانات الصوت المملوءة، مما قد يحسن الأداء.
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this]()
{
// Handle the result
});
العمل مع بيانات PCM
للوصول إلى بيانات PCM في الوقت الفعلي أثناء التشغيل، راجع معالجة بيانات PCM.