التقاط الصوت في Pixel Streaming
Pixel Streaming هو إضافة لمحرك Unreal Engine تقوم ببث الإطارات المُصَورة وتزامن الإدخال/الإخراج عبر WebRTC. التطبيق يعمل على جانب الخادم، بينما يتعامل جانب العميل مع التصيير وتفاعل المستخدم. لمزيد من التفاصيل حول Pixel Streaming والإعداد، راجع توثيق Pixel Streaming.
Pixel Streaming مقابل Pixel Streaming 2
هذه الإضافة تدعم كلا الإصدارين المتاحين من Pixel Streaming في محرك Unreal Engine:
- Pixel Streaming - الإضافة الأصلية، المتاحة منذ UE 5.2 ولا تزال مستخدمة بنشاط في إصدارات المحرك الحالية
- Pixel Streaming 2 - أُدخل في UE 5.5 كتنفيذ من الجيل التالي بهيكل داخلي محسن. اعرف المزيد عن Pixel Streaming 2
كلا الإصدارين مدعومان بالكامل ومتاحان في أحدث إصدارات Unreal Engine. اختر الإصدار الذي يتطابق مع إعداد Pixel Streaming لمشروعك.
واجهة برمجة التطبيقات API لكلا الإصدارين متطابقة، والفرق الوحيد هو أن فئات ووظائف Pixel Streaming 2 تتضمن الرقم "2" في أسمائها (مثال: UPixelStreamingCapturableSoundWave مقابل UPixelStreaming2CapturableSoundWave).
التوافق
هذا الحل يعمل مع:
- البنية التحتية الرسمية لـ Pixel Streaming (التنفيذ المرجعي لـ Epic Games)
- مزودي Pixel Streaming من الطرف الثالث بما في ذلك:
- Vagon.io
- Arcane Mirage
- Eagle 3D Streaming
- حلول البث الأخرى القائمة على WebRTC
- أنظمة التشغيل: خوادم Windows و Linux
تم اختبار التنفيذ عبر هذه البيئات ويعمل بشكل صحيح بغض النظر عن حل استضافة Pixel Streaming المستخدم.
تثبيت إضافة الامتداد
هذه الميزة مقدمة كامتداد لإضافة Runtime Audio Importer. لاستخدامها، تحتاج إلى:
- التأكد من أن إضافة Runtime Audio Importer مثبتة مسبقًا في مشروعك
- تحميل إضافة الامتداد الخاصة بإصدار Pixel Streaming الخاص بك:
- Pixel Streaming: تحميل من Google Drive
- Pixel Streaming 2: تحميل من Google Drive
- استخراج المجلد من الأرشيف المُحمل إلى مجلد
Pluginsالخاص بمشروعك (أنشئ هذا المجلد إذا لم يكن موجودًا) - إعادة بناء مشروعك (هذا الامتداد يتطلب مشروعًا بلغة C++)
- هذه الإضافات مقدمة كشفرة مصدرية وتتطلب مشروع C++ لاستخدامها
- إضافة Pixel Streaming: مدعومة في UE 5.2 والإصدارات الأحدث
- إضافة Pixel Streaming 2: مدعومة في UE 5.5 والإصدارات الأحدث
- لمزيد من المعلومات حول كيفية بناء الإضافات يدويًا، راجع درس بناء الإضافات
نظرة عامة
تمتد موجة الصوت القابلة للتسجيل لـ Pixel Streaming الموجة الصوتية القياسية Capturable Sound Wave للسماح بتسجيل الصوت مباشرة من ميكروفونات عملاء Pixel Streaming. تتيح لك هذه الميزة:
- تسجيل الصوت من المتصفحات المتصلة عبر Pixel Streaming
- معالجة الصوت من لاعبين/نظائر محددين
- تنفيذ الدردشة الصوتية، أو الأوامر الصوتية، أو تسجيل الصوت من المستخدمين البعيدين
الاستخدام الأساسي
إنشاء موجة صوت قابلة للتسجيل لـ Pixel Streaming
أولاً، تحتاج إلى إنشاء كائن موجة صوت قابلة للتسجيل لـ Pixel Streaming:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
- Blueprint
- C++
استخدم عقدة Create Pixel Streaming 2 Capturable Sound Wave (نفس عقدة Pixel Streaming ولكن مع إضافة "2" في الاسم)
PixelStreamingSoundWave = UPixelStreaming2CapturableSoundWave::CreatePixelStreaming2CapturableSoundWave();
يجب أن تعامل موجة الصوت القابلة للتسجيل في Pixel Streaming كمرجع قوي لمنع التدمير المبكر (على سبيل المثال، عن طريق تعيينه لمتغير منفصل في Blueprints أو استخدام UPROPERTY() في C++).
بدء وإيقاف التسجيل
يمكنك بدء وإيقاف تسجيل الصوت باستخدام استدعاءات دالة بسيطة:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++

// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// Start capturing audio (the device ID parameter is ignored for Pixel Streaming)
PixelStreamingSoundWave->StartCapture(0);
// Stop capturing audio
PixelStreamingSoundWave->StopCapture();
- Blueprint
- C++
استخدم نفس عُقد بدء الالتقاط و إيقاف الالتقاط مع موجة الصوت القابلة للالتقاط الخاصة بـ Pixel Streaming 2
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
// Start capturing audio (the device ID parameter is ignored for Pixel Streaming 2)
PixelStreamingSoundWave->StartCapture(0);
// Stop capturing audio
PixelStreamingSoundWave->StopCapture();
يتم تجاهل المعلمة DeviceId في StartCapture لموجات الصوت القابلة للتسجيل في Pixel Streaming، حيث يتم تحديد مصدر التسجيل تلقائيًا أو من خلال معلومات اللاعب التي قمت بتعيينها.
التحقق من حالة التسجيل
يمكنك التحقق مما إذا كانت موجة الصوت تقوم حاليًا بتسجيل الصوت:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++

// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
- Blueprint
- C++
استخدم نفس عقدة Is Capturing مع Capturable Sound Wave الخاص بـ Pixel Streaming 2
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
مثال كامل
إليك مثالاً كاملاً لكيفية إعداد التقاط الصوت في Pixel Streaming:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
هذا مثال أساسي للكود لالتقاط بيانات الصوت من عميل Pixel Streaming.
يستخدم المثال الدالة CapturePixelStreamingAudioExample الموجودة في الفئة UPixelStreamingAudioExample داخل الوحدة EXAMPLEMODULE.
لتشغيل المثال بنجاح، تأكد من إضافة كل من وحدتي RuntimeAudioImporter و PixelStreaming إما إلى PublicDependencyModuleNames أو PrivateDependencyModuleNames في ملف .Build.cs، وكذلك إلى ملف المشروع .uproject.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "PixelStreamingAudioExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UPixelStreamingAudioExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void CapturePixelStreamingAudioExample();
private:
// Keep a strong reference to prevent garbage collection
UPROPERTY()
class UPixelStreamingCapturableSoundWave* PixelStreamingSoundWave;
};
#include "PixelStreamingAudioExample.h"
#include "Sound/PixelStreamingCapturableSoundWave.h"
#include "Kismet/GameplayStatics.h"
void UPixelStreamingAudioExample::CapturePixelStreamingAudioExample()
{
// Create a Pixel Streaming Capturable Sound Wave
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
// Start capturing audio
PixelStreamingSoundWave->StartCapture(0);
// Play the sound wave to hear the captured audio
UGameplayStatics::PlaySound2D(GetWorld(), PixelStreamingSoundWave);
// Set up a timer to stop capture after 30 seconds (just for demonstration)
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [this]()
{
PixelStreamingSoundWave->StopCapture();
}, 30.0f, false);
}
- Blueprint
- C++
إعداد Blueprint مطابق لـ Pixel Streaming، لكن استخدم عقدة Create Pixel Streaming 2 Capturable Sound Wave بدلاً من ذلك
هذا مثال أساسي لالتقاط بيانات الصوت من عميل Pixel Streaming 2.
يستخدم المثال الدالة CapturePixelStreaming2AudioExample الموجودة في الفئة UPixelStreaming2AudioExample داخل الوحدة EXAMPLEMODULE.
لتشغيل المثال بنجاح، تأكد من إضافة كل من وحدتي RuntimeAudioImporter و PixelStreaming2 إلى إما PublicDependencyModuleNames أو PrivateDependencyModuleNames في ملف .Build.cs، وكذلك إلى ملف المشروع .uproject.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "PixelStreaming2AudioExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UPixelStreaming2AudioExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void CapturePixelStreaming2AudioExample();
private:
// Keep a strong reference to prevent garbage collection
UPROPERTY()
class UPixelStreaming2CapturableSoundWave* PixelStreamingSoundWave;
};
#include "PixelStreaming2AudioExample.h"
#include "Sound/PixelStreaming2CapturableSoundWave.h"
#include "Kismet/GameplayStatics.h"
void UPixelStreaming2AudioExample::CapturePixelStreaming2AudioExample()
{
// Create a Pixel Streaming 2 Capturable Sound Wave
PixelStreamingSoundWave = UPixelStreaming2CapturableSoundWave::CreatePixelStreaming2CapturableSoundWave();
// Start capturing audio
PixelStreamingSoundWave->StartCapture(0);
// Play the sound wave to hear the captured audio
UGameplayStatics::PlaySound2D(GetWorld(), PixelStreamingSoundWave);
// Set up a timer to stop capture after 30 seconds (just for demonstration)
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [this]()
{
PixelStreamingSoundWave->StopCapture();
}, 30.0f, false);
}
العمل مع مشغلات البث البكسي المتعددة
في السيناريوهات التي يكون لديك فيها عدة عملاء للبث البكسي متصلين في وقت واحد، قد تحتاج إلى التقاط الصوت من مشغلات محددة. الميزات التالية تساعدك في إدارة هذا.
الحصول على مشغلات البث البكسي المتاحة
لتحديد أي مشغلات البث البكسي متصلة:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++
![]()
UPixelStreamingCapturableSoundWave::GetAvailablePixelStreamingPlayers(FOnGetAvailablePixelStreamingPlayersResultNative::CreateWeakLambda(this, [](const TArray<FPixelStreamingPlayerInfo_RAI>& AvailablePlayers)
{
// Handle the list of available players
for (const FPixelStreamingPlayerInfo_RAI& PlayerInfo : AvailablePlayers)
{
UE_LOG(LogTemp, Log, TEXT("Available player: %s on streamer: %s"), *PlayerInfo.PlayerId, *PlayerInfo.StreamerId);
}
}));
- Blueprint
- C++
استخدم عقدة Get Available Pixel Streaming 2 Players
UPixelStreaming2CapturableSoundWave::GetAvailablePixelStreaming2Players(FOnGetAvailablePixelStreaming2PlayersResultNative::CreateWeakLambda(this, [](const TArray<FPixelStreaming2PlayerInfo_RAI>& AvailablePlayers)
{
// Handle the list of available players
for (const FPixelStreaming2PlayerInfo_RAI& PlayerInfo : AvailablePlayers)
{
UE_LOG(LogTemp, Log, TEXT("Available player: %s on streamer: %s"), *PlayerInfo.PlayerId, *PlayerInfo.StreamerId);
}
}));
تعيين اللاعب للالتقاط منه
عندما تحتاج إلى الالتقاط من لاعب محدد:
- Pixel Streaming
- Pixel Streaming 2
- Blueprint
- C++

// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// and PlayerInfo is a FPixelStreamingPlayerInfo_RAI object from GetAvailablePixelStreamingPlayers
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
- Blueprint
- C++
استخدم عقدة Set Player To Capture From مع موجة الصوت القابلة للتسجيل الخاصة بـ Pixel Streaming 2
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreaming2CapturableSoundWave object
// and PlayerInfo is a FPixelStreaming2PlayerInfo_RAI object from GetAvailablePixelStreaming2Players
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
إذا تركت معرف اللاعب (Player ID) فارغًا، فستستمع موجة الصوت تلقائيًا إلى أول لاعب متاح يتصل. هذا هو السلوك الافتراضي ويعمل بشكل جيد في سيناريوهات اللاعب الفردي.
حالات الاستخدام الشائعة
تنفيذ الدردشة الصوتية
يمكنك استخدام موجات الصوت القابلة للتسجيل في Pixel Streaming لتنفيذ دردشة صوتية بين المستخدمين البعيدين واللاعبين المحليين:
- قم بإنشاء موجة صوت قابلة للتسجيل في Pixel Streaming لكل لاعب متصل
- قم بإعداد نظام لإدارة اللاعبين الذين يتحدثون حاليًا
- استخدم نظام كشف النشاط الصوتي لاكتشاف وقت تحدث المستخدمين
- قم بتحديد مكان الصوت مكانيًا باستخدام نظام الصوت في Unreal Engine إذا لزم الأمر
الأوامر الصوتية مع التعرف على الكلام
يمكنك تنفيذ التعرف على الأوامر الصوتية للمستخدمين البعيدين من خلال الجمع بين هذه الميزة والإضافة Runtime Speech Recognizer:
- قم بتسجيل الصوت من عملاء Pixel Streaming باستخدام موجة الصوت القابلة للتسجيل في Pixel Streaming
- قم بتغذية الصوت المسجل مباشرة إلى Runtime Speech Recognizer
- قم بمعالجة النص المعترف به في منطق لعبتك
ما عليك سوى استبدال موجة الصوت القابلة للتسجيل القياسية بموجة الصوت القابلة للتسجيل في Pixel Streaming (أو موجة الصوت القابلة للتسجيل في Pixel Streaming 2) في أمثلة Runtime Speech Recognizer، وستعمل بسلاسة مع إدخال الصوت من Pixel Streaming.
تسجيل الصوت من المستخدمين البعيدين
يمكنك تسجيل الصوت من المستخدمين البعيدين للتشغيل لاحقًا:
- قم بتسجيل الصوت باستخدام موجة الصوت القابلة للتسجيل في Pixel Streaming
- قم بتصدير الصوت المسجل إلى ملف باستخدام تصدير الصوت
- احفظ الملف للاستخدام أو التحليل لاحقًا