Pixel Streaming Audio Capture
Pixel Streaming est un plugin pour Unreal Engine qui diffuse des images rendues et synchronise les entrées/sorties via WebRTC. L'application s'exécute côté serveur, tandis que le côté client gère le rendu et l'interaction utilisateur. Pour plus de détails sur Pixel Streaming et la configuration, consultez la Documentation Pixel Streaming.
Compatibilité
Cette solution fonctionne avec :
- Infrastructure officielle Pixel Streaming (Implémentation de référence Epic Games)
- Fournisseurs tiers de Pixel Streaming y compris :
- Vagon.io
- Arcane Mirage
- Eagle 3D Streaming
- Autres solutions de streaming basées sur WebRTC
- Systèmes d'exploitation : serveurs Windows et Linux
L'implémentation a été testée dans ces environnements et fonctionne correctement quel que soit la solution d'hébergement Pixel Streaming utilisée.
Installation du Plugin d'Extension
Cette fonctionnalité est fournie comme une extension au plugin Runtime Audio Importer. Pour l'utiliser, vous devez :
- Vous assurer que le plugin Runtime Audio Importer est déjà installé dans votre projet
- Télécharger l'extension du plugin Pixel Streaming Audio Capture depuis Google Drive
- Extraire le dossier de l'archive téléchargée dans le dossier
Plugins
de votre projet (créez ce dossier s'il n'existe pas) - Reconstruire votre projet (cette extension nécessite un projet C++)
- Cette extension est fournie en tant que code source et nécessite un projet C++ pour être utilisée
- Versions d'Unreal Engine supportées : UE 5.2 et versions ultérieures
- Pour plus d'informations sur la façon de compiler les plugins manuellement, voir le tutoriel de construction de plugins
Aperçu
Le Pixel Streaming Capturable Sound Wave étend le standard Capturable Sound Wave pour permettre la capture audio directement depuis les microphones des clients Pixel Streaming. Cette fonctionnalité vous permet de :
- Capturer l'audio des navigateurs connectés via Pixel Streaming
- Traiter l'audio de joueurs/peers spécifiques
- Mettre en œuvre le chat vocal, les commandes vocales, ou l'enregistrement audio des utilisateurs distants
Utilisation de Base
Création d'un Pixel Streaming Capturable Sound Wave
Tout d'abord, vous devez créer un objet Pixel Streaming Capturable Sound Wave :
- Blueprint
- C++
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
Vous devriez traiter le Pixel Streaming Capturable Sound Wave comme une référence forte pour éviter une destruction prématurée (par exemple, en l'assignant à une variable distincte dans Blueprints ou en utilisant UPROPERTY()
en C++).
Lancement et Arrêt de la Capture
Vous pouvez démarrer et arrêter la capture audio avec des appels de fonction simples :
- 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();
Le paramètre DeviceId
dans StartCapture
est ignoré pour Pixel Streaming Capturable Sound Waves, car la source de capture est déterminée automatiquement ou par les informations du joueur que vous avez définies.
Vérification du statut de capture
Vous pouvez vérifier si l'onde sonore capture actuellement l'audio :
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
Exemple Complet
Voici un exemple complet de configuration de la capture audio Pixel Streaming :
- Blueprint
- C++
Ceci est un exemple de code basique pour capturer des données audio d'un client Pixel Streaming.
L'exemple utilise la fonction CapturePixelStreamingAudioExample
située dans la classe UPixelStreamingAudioExample
au sein du module EXAMPLEMODULE
.
Pour exécuter correctement l'exemple, assurez-vous d'ajouter les modules RuntimeAudioImporter
et PixelStreaming
à PublicDependencyModuleNames
ou PrivateDependencyModuleNames
dans le fichier .Build.cs, ainsi qu'au fichier .uproject de votre projet.
#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);
}
Travailler avec plusieurs lecteurs de Pixel Streaming
Dans des scénarios où vous avez plusieurs clients de Pixel Streaming connectés simultanément, vous pouvez avoir besoin de capturer l'audio de joueurs spécifiques. Les fonctionnalités suivantes vous aident à gérer cela.
Obtenir les joueurs de Pixel Streaming disponibles
Pour identifier quels joueurs de Pixel Streaming sont connectés :
- 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);
}
}));
Définir le Joueur à Capturer
Quand vous devez capturer depuis un joueur spécifique :
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// and PlayerInfo is a FPixelStreamingPlayerInfo_RAI object from GetAvailablePixelStreamingPlayers
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
Si vous laissez l'ID du joueur vide, l'onde sonore écoutera automatiquement le premier joueur disponible qui se connecte. C'est le comportement par défaut et fonctionne bien pour les scénarios solo.
Cas d'utilisation courants
Implémentation de chat vocal
Vous pouvez utiliser Pixel Streaming Capturable Sound Waves pour implémenter le chat vocal entre les utilisateurs distants et les joueurs locaux :
- Créez un Pixel Streaming Capturable Sound Wave pour chaque joueur connecté
- Mettez en place un système pour gérer quels joueurs parlent actuellement
- Utilisez le système Voice Activity Detection pour détecter quand les utilisateurs parlent
- Spatialisez l'audio en utilisant le système audio d'Unreal Engine si nécessaire
Commandes vocales avec reconnaissance vocale
Vous pouvez implémenter la reconnaissance de commandes vocales pour les utilisateurs distants en combinant cette fonctionnalité avec le plugin Runtime Speech Recognizer :
- Capturez l'audio des clients Pixel Streaming en utilisant Pixel Streaming Capturable Sound Wave
- Alimentez directement l'audio capturé au Runtime Speech Recognizer
- Traitez le texte reconnu dans votre logique de jeu
Remplacez simplement le Capturable Sound Wave standard par un Pixel Streaming Capturable Sound Wave dans les exemples du Runtime Speech Recognizer, et cela fonctionnera parfaitement avec l'entrée audio Pixel Streaming.
Enregistrement de l’audio des utilisateurs distants
Vous pouvez enregistrer l'audio des utilisateurs distants pour une lecture ultérieure :
- Capturez l'audio en utilisant Pixel Streaming Capturable Sound Wave
- Exportez l'audio capturé vers un fichier en utilisant Export Audio
- Enregistrez le fichier pour une utilisation ou une analyse ultérieure