Captura de Audio en Pixel Streaming
Pixel Streaming es un complemento para Unreal Engine que transmite cuadros renderizados y sincroniza la entrada/salida a través de WebRTC. La aplicación se ejecuta del lado del servidor, mientras que el cliente maneja la renderización y la interacción del usuario. Para más detalles sobre Pixel Streaming y su configuración, consulte la Documentación de Pixel Streaming.
Compatibilidad
Esta solución funciona con:
- Infraestructura oficial de Pixel Streaming (Implementación de referencia de Epic Games)
- Proveedores de Pixel Streaming de terceros incluidos:
- Vagon.io
- Arcane Mirage
- Eagle 3D Streaming
- Otras soluciones de transmisión basadas en WebRTC
- Sistemas operativos: Servidores Windows y Linux
La implementación ha sido probada en estos entornos y funciona correctamente independientemente de la solución de hospedaje de Pixel Streaming utilizada.
Instalación del Plugin de Extensión
Esta característica se proporciona como una extensión del plugin Runtime Audio Importer. Para usarlo, necesitas:
- Asegúrate de que el plugin Runtime Audio Importer ya esté instalado en tu proyecto
- Descarga la extensión del plugin de captura de audio de Pixel Streaming desde Google Drive
- Extrae la carpeta del archivo descargado en la carpeta
Plugins
de tu proyecto (crea esta carpeta si no existe) - Reconstruye tu proyecto (esta extensión requiere un proyecto C++)
- Esta extensión se proporciona como código fuente y requiere un proyecto C++ para ser utilizada
- Versiones de Unreal Engine compatibles: UE 5.2 y posteriores
- Para más información sobre cómo construir plugins manualmente, consulta el tutorial de Construcción de Plugins
Resumen
El Pixel Streaming Capturable Sound Wave amplía el estándar Capturable Sound Wave para permitir la captura de audio directamente desde los micrófonos de los clientes de Pixel Streaming. Esta función te permite:
- Capturar audio desde navegadores conectados vía Pixel Streaming
- Procesar audio de jugadores/pares específicos
- Implementar chat de voz, comandos de voz o grabación de audio de usuarios remotos
Uso Básico
Creación de un Pixel Streaming Capturable Sound Wave
Primero, necesitas crear un objeto Pixel Streaming Capturable Sound Wave:
- Blueprint
- C++
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
Debes tratar el Pixel Streaming Capturable Sound Wave como una referencia fuerte para prevenir su destrucción prematura (por ejemplo, asignándolo a una variable separada en Blueprints o usando UPROPERTY()
en C++).
Inicio y Detención de Captura
Puedes iniciar y detener la captura de audio con simples llamadas a funciones:
- 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();
El parámetro DeviceId
en StartCapture
se ignora para Pixel Streaming Capturable Sound Waves, ya que la fuente de captura se determina automáticamente o por la información del jugador que configures.
Verificación del Estado de Captura
Puedes verificar si la onda de sonido está capturando audio actualmente:
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
Ejemplo Completo
Aquí hay un ejemplo completo de cómo configurar la captura de audio de Pixel Streaming:
- Blueprint
- C++
Este es un ejemplo básico de código para capturar datos de audio desde un cliente de Pixel Streaming.
El ejemplo utiliza la función CapturePixelStreamingAudioExample
ubicada en la clase UPixelStreamingAudioExample
dentro del módulo EXAMPLEMODULE
.
Para ejecutar el ejemplo con éxito, asegúrate de añadir tanto los módulos RuntimeAudioImporter
como PixelStreaming
a PublicDependencyModuleNames
o PrivateDependencyModuleNames
en el archivo .Build.cs, así como a tu archivo .uproject del proyecto.
#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);
}
Trabajando con Múltiples Reproductores de Pixel Streaming
En escenarios donde tienes múltiples clientes de Pixel Streaming conectados simultáneamente, es posible que necesites capturar audio de jugadores específicos. Las siguientes características te ayudarán a gestionar esto.
Obteniendo Reproductores de Pixel Streaming Disponibles
Para identificar qué jugadores de Pixel Streaming están conectados:
- 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);
}
}));
Configurando el Jugador para Capturar Desde
Cuando necesites capturar desde un jugador específico:
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
// and PlayerInfo is a FPixelStreamingPlayerInfo_RAI object from GetAvailablePixelStreamingPlayers
PixelStreamingSoundWave->PlayerInfo = PlayerInfo;
Si dejas el ID del jugador vacío, la onda de sonido automáticamente escuchará al primer jugador disponible que se conecte. Este es el comportamiento predeterminado y funciona bien para escenarios de un solo jugador.
Casos de Uso Comunes
Implementación de Chat de Voz
Puedes usar Pixel Streaming Capturable Sound Waves para implementar un chat de voz entre usuarios remotos y jugadores locales:
- Crea una Pixel Streaming Capturable Sound Wave para cada jugador conectado
- Configura un sistema para gestionar qué jugadores están actualmente hablando
- Usa el sistema de Detección de Actividad de Voz para detectar cuándo los usuarios están hablando
- Espacializa el audio utilizando el sistema de audio de Unreal Engine si es necesario
Comandos de Voz con Reconocimiento de Voz
Puedes implementar reconocimiento de comandos de voz para usuarios remotos combinando esta función con el plugin Runtime Speech Recognizer:
- Captura audio de los clientes de Pixel Streaming usando Pixel Streaming Capturable Sound Wave
- Alimenta el audio capturado directamente al Runtime Speech Recognizer
- Procesa el texto reconocido en la lógica de tu juego
Simplemente reemplaza la Capturable Sound Wave estándar con una Pixel Streaming Capturable Sound Wave en los ejemplos de Runtime Speech Recognizer, y funcionará perfectamente con la entrada de audio de Pixel Streaming.
Grabación de Audio de Usuarios Remotos
Puedes grabar audio de usuarios remotos para reproducirlo más tarde:
- Captura el audio usando Pixel Streaming Capturable Sound Wave
- Exporta el audio capturado a un archivo usando Export Audio
- Guarda el archivo para uso o análisis posterior