Compartilhar via


Início Rápido: Inscrever-se em fluxos de áudio de uma chamada em andamento

Importante

A funcionalidade descrita neste documento está em versão prévia privada. A versão prévia privada inclui o acesso a SDKs e à documentação para fins de teste que ainda não estão disponíveis publicamente. Candidate-se a tornar-se um usuário pioneiro preenchendo o formulário para acesso em versão prévia aos Serviços de Comunicação do Azure.

Comece a usar fluxos de áudio por meio da API de streaming de mídia dos Serviços de Comunicação do Azure. Este início rápido pressupõe que você já esteja familiarizado com as APIs de Automação de Chamadas para criar uma solução automatizada de roteamento de chamadas.

Pré-requisitos

Configurar um servidor WebSocket

Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP. Opcionalmente, é possível usar os Aplicativos Web do Azure dos serviços do Azure para criar um aplicativo que receba fluxos de áudio sobre uma conexão WebSocket. Siga este início rápido.

Estabelecer uma chamada

Ele pressupõe que você já esteja familiarizado com a realização de chamadas. Para saber como iniciar e estabelecer chamadas, siga nosso início rápido. Nele, você passará pelo processo de iniciar um streaming de mídia para chamadas de entrada e saída.

Iniciar o streaming de mídia: chamadas de entrada

Seu aplicativo começará a receber fluxos de mídia assim que você atender a chamada e fornecer aos Serviços de Comunicação do Azure as informações do WebSocket.

var mediaStreamingOptions = new MediaStreamingOptions(
    new Uri("wss://testwebsocket.webpubsub.azure.com/client/hubs/media?accesstoken={access_token}"),
      MediaStreamingTransport.WebSocket,
      MediaStreamingContent.Audio,
      MediaStreamingAudioChannel.Mixed,
    );
    var answerCallOptions = new AnswerCallOptions(incomingCallContext, callbackUri: new Uri(callConfiguration.AppCallbackUrl)) {
      MediaStreamingOptions = mediaStreamingOptions
    };
    var response = await callingServerClient.AnswerCallAsync(answerCallOptions);

Iniciar o streaming de mídia: chamadas de saída

Seu aplicativo começará a receber fluxos de mídia depois que você criar a chamada e fornecer aos Serviços de Comunicação do Azure as informações do WebSocket.

var mediaStreamingOptions = new MediaStreamingOptions(
  new Uri("wss://{yourwebsocketurl}"),
  MediaStreamingTransport.WebSocket,
  MediaStreamingContent.Audio,
  MediaStreamingAudioChannel.Mixed,
);
var createCallOptions = new CreateCallOptions(callSource, new List < PhoneNumberIdentifier > {
  target
}, new Uri(callConfiguration.AppCallbackUrl)) {
  MediaStreamingOptions = mediaStreamingOptions
};
var createCallResult = await client.CreateCallAsync(createCallOptions);

Lidar com fluxos de mídia no servidor WebSocket

O exemplo a seguir demonstra como ouvir o fluxo de mídia usando o servidor WebSocket

HttpListener httpListener = new HttpListener();
httpListener.Prefixes.Add("http://localhost:80/");
httpListener.Start();
while (true)
{
    HttpListenerContext httpListenerContext = await httpListener.GetContextAsync();
    if (httpListenerContext.Request.IsWebSocketRequest)
    {
        WebSocketContext websocketContext;
        try
        {
            websocketContext = await httpListenerContext.AcceptWebSocketAsync(subProtocol: null);
        }
        catch (Exception ex)
        {
            return;
        }
        WebSocket webSocket = websocketContext.WebSocket;
        try
        {
            while (webSocket.State == WebSocketState.Open || webSocket.State == WebSocketState.CloseSent)
            {
                byte[] receiveBuffer = new byte[2048];
                var cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(60)).Token;
                WebSocketReceiveResult receiveResult = await webSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), cancellationToken);
                if (receiveResult.MessageType != WebSocketMessageType.Close)
                {
                    var data = Encoding.UTF8.GetString(receiveBuffer).TrimEnd('\0');
                    try
                    {
                        var eventData = JsonConvert.DeserializeObject<AudioBaseClass>(data);
                        if (eventData != null)
                        {
                            if(eventData.kind == "AudioMetadata")
                            {
                                //Process audio metadata
                            }
                            else if(eventData.kind == "AudioData") 
                            {
                                //Process audio data
                                var byteArray = eventData.audioData.data;
                               //use audio byteArray as you want
                            }
                        }
                    }
                    catch { }
                }
            }
        }
        catch (Exception ex) { }
    }
}

Pré-requisitos

Configurar um servidor WebSocket

Os Serviços de Comunicação do Azure exigem que o aplicativo de servidor configure um servidor WebSocket para transmitir áudios em tempo real. O WebSocket é um protocolo padronizado que fornece um canal de comunicação full-duplex sobre uma única conexão TCP. Opcionalmente, é possível usar os Aplicativos Web do Azure dos serviços do Azure para criar um aplicativo que receba fluxos de áudio sobre uma conexão WebSocket. Siga este início rápido.

Estabelecer uma chamada

Ele pressupõe que você já esteja familiarizado com a realização de chamadas. Para saber como iniciar e estabelecer chamadas, siga nosso início rápido. Nele, você passará pelo processo de iniciar um streaming de mídia para chamadas de entrada e saída.

Iniciar o streaming de mídia: chamadas de entrada

Seu aplicativo começará a receber fluxos de mídia assim que você atender a chamada e fornecer aos Serviços de Comunicação do Azure as informações do WebSocket.

var mediaStreamingOptions = new MediaStreamingOptions(
    "wss://{yourwebsocketurl}",
    MediaStreamingTransport.WebSocket,
    MediaStreamingContent.Audio,
    MediaStreamingAudioChannel.Mixed
);
var answerCallOptions = new AnswerCallOptions(“<incomingCallContext>”, callConfiguration.AppCallbackUrl).setMediaStreamingConfiguration(mediaStreamingOptions);

var answerCallResponse = callAutomationAsyncClient.answerCallWithResponse(answerCallOptions).block();

Iniciar o streaming de mídia: chamadas de saída

Seu aplicativo começará a receber fluxos de mídia depois que você criar a chamada e fornecer aos Serviços de Comunicação do Azure as informações do WebSocket.

var mediaStreamingOptions = new MediaStreamingOptions(
    "wss://{yourwebsocketurl}",
    MediaStreamingTransportType.WebSocket,
    MediaStreamingContentType.Audio,
    MediaStreamingAudioChannelType.Mixed
);
var createCallOptions = new CreateCallOptions(
    callSource,
    Collections.singletonList(target),
    callConfiguration.AppCallbackUrl 
);
createCallOptions.setMediaStreamingConfiguration(mediaStreamingOptions);
var answerCallResponse = callAutomationAsyncClient.createCallWithResponse(
    createCallOptions
).block();

Lidar com fluxos de mídia no servidor WebSocket

O exemplo abaixo demonstra como ouvir o fluxo de mídia usando o servidor WebSocket.

public class WebsocketServer {
    public static void main(String[] args) throws IOException {
        Socket socket = null;
        InputStreamReader inputStreamReader = null;
        OutputStreamWriter outputStreamWriter = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        ServerSocket serverSocket = null;
        serverSocket = new ServerSocket(1234);
        while (true) {
            try {
                socket = serverSocket.accept();
                inputStreamReader = new InputStreamReader(socket.getInputStream());
                outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
                bufferedReader = new BufferedReader(inputStreamReader);
                bufferedWriter = new BufferedWriter(outputStreamWriter);
                while (!socket.isClosed()) {
                    String msgFromClient = bufferedReader.readLine();
                    //You can process the message however you want
                    System.out.println("Client:" + msgFromClient);
                    bufferedWriter.write("MSG Received");
                    bufferedWriter.newLine();
                    bufferedWriter.flush();
                }
                socket.close();
                inputStreamReader.close();
                outputStreamWriter.close();
                bufferedWriter.close();
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

Esquema de mensagem

Quando os Serviços de Comunicação do Azure tiverem recebido a URL do servidor WebSocket, ele criará uma conexão com ele. Depois que os Serviços de Comunicação do Azure se conectarem com êxito ao servidor WebSocket, ele enviará o primeiro pacote de dados que contém metadados referentes aos pacotes de mídia de entrada.

{
    "kind": <string> // What kind of data this is, e.g. AudioMetadata, AudioData.
    "audioMetadata": {
        "subscriptionId": <string>, // unique identifier for a subscription request
        "encoding":<string>, // PCM only supported
        "sampleRate": <int>, // 16000 default
        "channels": <int>, // 1 default
        "length": <int> // 640 default
    }
}

Esquema de streaming de áudio

Depois de enviar por meio do pacote de metadados, os Serviços de Comunicação do Azure começarão a transmitir mídia de áudio para seu servidor WebSocket. Veja abaixo um exemplo do objeto de mídia que o servidor receberá.

{
    "kind": <string>, // What kind of data this is, e.g. AudioMetadata, AudioData.
    "audioData":{
        "data": <string>, // Base64 Encoded audio buffer data
        "timestamp": <string>, // In ISO 8601 format (yyyy-mm-ddThh:mm:ssZ) 
        "participantRawID": <string>, 
        "silent": <boolean> // Indicates if the received audio buffer contains only silence.
    }
}

Exemplo de dados de áudio sendo transmitidos

{
  "kind": "AudioData",
  "audioData": {
    "timestamp": "2022-10-03T19:16:12.925Z",
    "participantRawID": "8:acs:3d20e1de-0f28-41c5-84a0-4960fde5f411_0000000b-faeb-c708-99bf-a43a0d0036b0",
    "data": "5ADwAOMA6AD0AOIA4ADkAN8AzwDUANEAywC+ALQArgC0AKYAnACJAIoAlACWAJ8ApwCiAKkAqgCqALUA0wDWANAA3QDVAN0A8wDzAPAA7wDkANkA1QDPAPIA6QDmAOcA0wDYAPMA8QD8AP0AAwH+AAAB/QAAAREBEQEDAQoB9wD3APsA7gDxAPMA7wDpAN0A6gD5APsAAgEHAQ4BEAETARsBMAFHAUABPgE2AS8BKAErATEBLwE7ASYBGQEAAQcBBQH5AAIBBwEMAQ4BAAH+APYA6gDzAPgA7gDkAOUA3wDcANQA2gDWAN8A3wDcAMcAxwDIAMsA1wDfAO4A3wDUANQA3wDvAOUA4QDpAOAA4ADhAOYA5wDkAOUA1gDxAOcA4wDpAOEA4gD0APoA7wD9APkA6ADwAPIA7ADrAPEA6ADfANQAzQDLANIAzwDaANcA3QDZAOQA4wDXANwA1ADbAOsA7ADyAPkA7wDiAOIA6gDtAOsA7gDeAOIA4ADeANUA6gD1APAA8ADgAOQA5wDgAPgA8ADnAN8A5gDgAOoA6wDcAOgA2gDZANUAyQDPANwA3gDgAO4A8QDyAAQBEwEDAewA+gDpAN4A6wDeAO8A8QDwAO8ABAEKAQUB/gD5AAMBAwEIARoBFAEeARkBDgH8AP0A+gD8APcA+gDrAO0A5wDcANEA0QDHAM4A0wDUAM4A0wDZANQAxgDSAM4A1ADVAOMA4QDhANUA2gDjAOYA5wDrANQA5wDrAMsAxQDWANsA5wDpAOEA4QDFAMoA0QDKAMgAwgDNAMsAwgCwAKkAtwCrAKoAsACgAJ4AlQCeAKAAoQCmAKwApwCsAK0AnQCVAA==",
    "silent": false
  }
}

Parar a transmissão de áudio

A transmissão de áudio será interrompida automaticamente quando a chamada terminar ou for cancelada.

Limpar os recursos

Se quiser limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Saiba mais sobre como limpar recursos.

Próximas etapas