Captura de Áudio com Pixel Streaming
Pixel Streaming é um plugin para Unreal Engine que transmite frames renderizados e sincroniza entrada/saída via WebRTC. A aplicação roda no lado do servidor, enquanto o lado do cliente lida com renderização e interação com o usuário. Para mais detalhes sobre Pixel Streaming e configuração, consulte a Documentação do Pixel Streaming.
Compatibilidade
Esta solução funciona com:
- Infraestrutura oficial do Pixel Streaming (Implementação de referência da Epic Games)
- Provedores de Pixel Streaming de terceiros incluindo:
- Vagon.io
- Arcane Mirage
- Eagle 3D Streaming
- Outras soluções de streaming baseadas em WebRTC
- Sistemas operacionais: servidores Windows e Linux
A implementação foi testada nestes ambientes e funciona corretamente independentemente da solução de hospedagem do Pixel Streaming usada.
Instalação do Plugin de Extensão
Este recurso é fornecido como uma extensão para o plugin Runtime Audio Importer. Para usá-lo, você precisa:
- Garantir que o plugin Runtime Audio Importer já esteja instalado em seu projeto
- Baixar a extensão do plugin Pixel Streaming Audio Capture de Google Drive
- Extrair a pasta do arquivo baixado para a pasta
Plugins
do seu projeto (crie esta pasta se não existir) - Recompilar seu projeto (esta extensão requer um projeto em C++)
- Esta extensão é fornecida como código-fonte e requer um projeto em C++ para uso
- Versões do Unreal Engine suportadas: UE 5.2 e posteriores
- Para mais informações sobre como construir plugins manualmente, veja o tutorial de Construção de Plugins
Visão Geral
O Pixel Streaming Capturable Sound Wave estende o padrão Capturable Sound Wave para permitir a captura de áudio diretamente dos microfones dos clientes de Pixel Streaming. Este recurso permite:
- Capturar áudio de navegadores conectados via Pixel Streaming
- Processar áudio de jogadores/participantes específicos
- Implementar chat de voz, comandos de voz ou gravação de áudio de usuários remotos
Uso Básico
Criando um Pixel Streaming Capturable Sound Wave
Primeiro, você precisa criar um objeto Pixel Streaming Capturable Sound Wave:
- Blueprint
- C++
PixelStreamingSoundWave = UPixelStreamingCapturableSoundWave::CreatePixelStreamingCapturableSoundWave();
Você deve tratar o Pixel Streaming Capturable Sound Wave como uma forte referência para evitar destruição prematura (por exemplo, atribuindo-o a uma variável separada em Blueprints ou usando UPROPERTY()
em C++).
Iniciando e Parando Captura
Você pode iniciar e parar a captura de áudio com chamadas de função 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();
O parâmetro DeviceId
em StartCapture
é ignorado para Pixel Streaming Capturable Sound Waves, pois a fonte de captura é determinada automaticamente ou pelas informações do jogador que você definiu.
Verificando o Status de Captura
Você pode verificar se o sound wave está capturando áudio no momento:
- Blueprint
- C++
// Assuming PixelStreamingSoundWave is a reference to a UPixelStreamingCapturableSoundWave object
bool bIsCapturing = PixelStreamingSoundWave->IsCapturing();
Exemplo Completo
Aqui está um exemplo completo de como configurar a captura de áudio com Pixel Streaming:
- Blueprint
- C++
Este é um exemplo básico de código para capturar dados de áudio de um cliente Pixel Streaming.
O exemplo usa a função CapturePixelStreamingAudioExample
localizada na classe UPixelStreamingAudioExample
dentro do módulo EXAMPLEMODULE
.
Para executar o exemplo com sucesso, certifique-se de adicionar os módulos RuntimeAudioImporter
e PixelStreaming
em PublicDependencyModuleNames
ou PrivateDependencyModuleNames
no arquivo .Build.cs, bem como no arquivo .uproject do seu projeto.
#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);
}
Trabalhando com Múltiplos Pixel Streaming Players
Em cenários onde você tem múltiplos clientes de Pixel Streaming conectados simultaneamente, pode ser necessário capturar áudio de players específicos. As seguintes funcionalidades ajudam você a gerenciar isso.
Obtendo Pixel Streaming Players Disponíveis
Para identificar quais Pixel Streaming players estão 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);
}
}));
Definindo o Jogador para Capturar De
Quando você precisa capturar de um jogador 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;
Se você deixar o ID do Player vazio, a onda sonora ouvirá automaticamente o primeiro jogador disponível que se conectar. Este é o comportamento padrão e funciona bem para cenários de jogador único.
Casos de Uso Comuns
Implementação de Chat de Voz
Você pode usar Pixel Streaming Capturable Sound Waves para implementar chat de voz entre usuários remotos e jogadores locais:
- Crie uma Pixel Streaming Capturable Sound Wave para cada jogador conectado
- Configure um sistema para gerenciar quais jogadores estão falando atualmente
- Use o sistema Voice Activity Detection para detectar quando os usuários estão falando
- Espacialize o áudio usando o sistema de áudio do Unreal Engine, se necessário
Comandos de Voz com Reconhecimento de Fala
Você pode implementar reconhecimento de comandos de voz para usuários remotos combinando este recurso com o plugin Runtime Speech Recognizer:
- Capture áudio dos clientes Pixel Streaming usando Pixel Streaming Capturable Sound Wave
- Alimente o áudio capturado diretamente no Runtime Speech Recognizer
- Processe o texto reconhecido na lógica do seu jogo
Basta substituir a Capturable Sound Wave padrão por uma Pixel Streaming Capturable Sound Wave nos exemplos do Runtime Speech Recognizer e funcionará perfeitamente com a entrada de áudio do Pixel Streaming.
Gravação de Áudio de Usuários Remotos
Você pode gravar áudio de usuários remotos para reprodução posterior:
- Capture áudio usando Pixel Streaming Capturable Sound Wave
- Exporte o áudio capturado para um arquivo usando Export Audio
- Salve o arquivo para uso ou análise posterior