SDK em PHP da Video API da Vonage

O SDK do OpenTok para PHP oferece métodos para:

Instalação

Compositor (recomendado):

O Composer ajuda a gerenciar dependências em projetos PHP. Saiba mais aqui: http://getcomposer.org

Adicione este pacote (opentok/opentok) ao seu composer.json arquivo ou execute o seguinte na linha de comando:

composer require opentok/opentok ^4.0

Uso

Inicializando

Este pacote segue o PSR-4 padrão de carregamento automático. Se você estiver usando o Composer para a instalação, basta incluir o autoloader gerado:

require "<projectpath>/vendor/autoload.php";

Depois que os arquivos do SDK forem carregados, você inicializa um OpenTok\OpenTok objeto com sua própria API Chave e segredo da API.

use OpenTok\OpenTok;

$opentok = new OpenTok($apiKey, $apiSecret);

Opções de inicialização

O OpenTok\OpenTok O objeto permite apenas algumas substituições de valores quando surgem necessidades especiais, como, por exemplo, a necessidade de indicar um datacenter diferente ou alterar o tempo limite do cliente HTTP subjacente. Para essas situações, é possível passar um array de opções adicionais como terceiro parâmetro.

Oferecemos as seguintes opções:

  • apiUrl - Alterar o domínio para o qual o SDK aponta. Útil quando for necessário selecionar um datacenter específico ou apontar para uma versão simulada da API para fins de teste
  • client - Cliente de API personalizado que herda de OpenTok\Utils\Client, útil para personalizar um cliente HTTP
  • timeout - Altere o tempo limite padrão do HTTP, que por padrão é indefinido. Você pode especificar um número de segundos para alterar o tempo limite.
use OpenTok\OpenTok;
use MyCompany\CustomOpenTokClient;

$options = [
    'apiUrl' => 'https://custom.domain.com/',
    'client' => new CustomOpenTokClient(),
    'timeout' => 10,
]
$opentok = new OpenTok($apiKey, $apiSecret, $options);

Criação de sessões

Para criar uma sessão do OpenTok, use o createSession($options) método do OpenTok\OpenTok classe. A $options O parâmetro é um array opcional usado para especificar o seguinte:

  • Definir se a sessão utilizará o OpenTok Media Router ou tentará enviar transmissões diretamente entre os clientes.

  • Definir se a sessão criará arquivos automaticamente (isso implica o uso de uma sessão roteada)

  • Especificando uma sugestão de localização.

O getSessionId() método do OpenTok\Session A instância retorna o ID da sessão, que você usa para identificar a sessão nas bibliotecas do cliente OpenTok.

use OpenTok\MediaMode;
use OpenTok\ArchiveMode;

// Create a session that attempts to use peer-to-peer streaming:
$session = $opentok->createSession();

// A session that uses the OpenTok Media Router, which is required for archiving:
$session = $opentok->createSession(array( 'mediaMode' => MediaMode::ROUTED ));

// A session with a location hint:
$session = $opentok->createSession(array( 'location' => '12.34.56.78' ));

// An automatically archived session:
$sessionOptions = array(
    'archiveMode' => ArchiveMode::ALWAYS,
    'mediaMode' => MediaMode::ROUTED
);
$session = $opentok->createSession($sessionOptions);


// Store this sessionId in the database for later use
$sessionId = $session->getSessionId();

Geração de tokens

Depois que uma sessão for criada, você poderá começar a gerar tokens para os clientes usarem ao se conectarem a ela. Você pode gerar um token chamando a função generateToken($sessionId, $options) método do OpenTok\OpenTok classe ou chamando o generateToken($options) método no OpenTok\Session instância após criá-la. A $options O parâmetro é um array opcional usado para definir a função, o tempo de validade e os dados de conexão do token. Para controle de layout em arquivos e transmissões, também é possível definir a lista inicial de classes de layout das transmissões publicadas a partir de conexões que utilizam esse token.

use OpenTok\Session;
use OpenTok\Role;

// Generate a Token from just a sessionId (fetched from a database)
$token = $opentok->generateToken($sessionId);
// Generate a Token by calling the method on the Session (returned from createSession)
$token = $session->generateToken();

// Set some options in a token
$token = $session->generateToken(array(
    'role'       => Role::MODERATOR,
    'expireTime' => time()+(7 * 24 * 60 * 60), // in one week
    'data'       => 'name=Johnny',
    'initialLayoutClassList' => array('focus')
));

Trabalhando com fluxos

É possível obter informações sobre um fluxo chamando a função getStream($sessionId, $streamId) método do OpenTok\OpenTok classe.

use OpenTok\Session;

// Get stream info from just a sessionId (fetched from a database)
$stream = $opentok->getStream($sessionId, $streamId);

// Stream properties
$stream->id; // string with the stream ID
$stream->videoType; // string with the video type
$stream->name; // string with the name
$stream->layoutClassList; // array with the layout class list

É possível obter informações sobre todos os fluxos de uma sessão chamando a função listStreams($sessionId) método do OpenTok\OpenTok classe.

use OpenTok\Session;

// Get list of streams from just a sessionId (fetched from a database)
$streamList = $opentok->listStreams($sessionId);

$streamList->totalCount(); // total count

Trabalhando com arquivos

É possível arquivar apenas as sessões que utilizam o OpenTok Media Router (sessões com o modo de mídia definido como “routed”).

Você pode iniciar a gravação de uma sessão do OpenTok usando o startArchive($sessionId, $name) método do OpenTok\OpenTok classe. Isso retornará um OpenTok\Archive instância. O parâmetro $archiveOptions é um array opcional e é usado para atribuir um nome, definir se será gravado áudio e/ou vídeo, o modo de saída desejado para o Arquivo e a resolução desejada, se aplicável. Observe que só é possível iniciar um Arquivo em uma Sessão que tenha clientes conectados.

// Create a simple archive of a session
$archive = $opentok->startArchive($sessionId);


// Create an archive using custom options
$archiveOptions = array(
    'name' => 'Important Presentation',     // default: null
    'hasAudio' => true,                     // default: true
    'hasVideo' => true,                     // default: true
    'outputMode' => OutputMode::COMPOSED,   // default: OutputMode::COMPOSED
    'resolution' => '1280x720'              // default: '640x480'
);
$archive = $opentok->startArchive($sessionId, $archiveOptions);

// Store this archiveId in the database for later use
$archiveId = $archive->id;

Se você definir o outputMode opção de OutputMode::INDIVIDUAL, isso faz com que cada fluxo no arquivo seja gravado em seu próprio arquivo individual. Observe que não é possível especificar a resolução ao definir o outputMode opção de OutputMode::INDIVIDUAL. O OutputMode::COMPOSED Essa configuração (padrão) faz com que todos os fluxos do arquivo sejam gravados em um único arquivo (composto).

Observe que você também pode criar uma sessão arquivada automaticamente, passando ArchiveMode::ALWAYS como o archiveMode chave do options parâmetro passado para o OpenTok->createSession() método (consulte “Criação de sessões”, acima).

Você pode interromper a gravação de um arquivo já iniciado usando o stopArchive($archiveId) método do OpenTok\OpenTok objeto. Você também pode fazer isso usando o stop() método do OpenTok\Archive instância.

// Stop an Archive from an archiveId (fetched from database)
$opentok->stopArchive($archiveId);
// Stop an Archive from an Archive instance (returned from startArchive)
$archive->stop();

Para obter um OpenTok\Archive instância (e todas as informações a respeito dela) a partir de um ID de arquivo, use o getArchive($archiveId) método do OpenTok\OpenTok classe.

$archive = $opentok->getArchive($archiveId);

Para excluir um arquivo, você pode chamar a função deleteArchive($archiveId) método do OpenTok\OpenTok turma ou a delete() método de um OpenTok\Archive instância.

// Delete an Archive from an archiveId (fetched from database)
$opentok->deleteArchive($archiveId);
// Delete an Archive from an Archive instance (returned from startArchive, getArchive)
$archive->delete();

Você também pode obter uma lista de todos os arquivos que criou (até 1.000) com sua chave de API. Isso é feito usando o listArchives($offset, $count, $sessionId) método do OpenTok/OpenTok classe. Os parâmetros $offset, $count, e $sessionId são opcionais e podem ajudar você a paginar os resultados e filtrar os dados por uma sessão específica. Isso retornará uma instância do OpenTok\ArchiveList classe.

$archiveList = $opentok->listArchives();

// Get an array of OpenTok\Archive instances
$archives = $archiveList->getItems();
// Get the total number of Archives for this API Key
$totalCount = $archiveList->totalCount();

Para arquivos compostos, é possível alterar o layout dinamicamente, usando o setArchiveLayout($archiveId, $layoutType) método:

use OpenTok\OpenTok;

$layout = Layout::getPIP(); // Or use another get method of the Layout class.
$opentok->setArchiveLayout($archiveId, $layout);

É possível definir a classe de layout inicial para os fluxos de um cliente configurando o layout opção ao criar o token para o cliente, usando o OpenTok->generateToken() método ou o Session->generateToken() método. E você pode alterar as classes de layout de um stream chamando o OpenTok->updateStream() método.

A configuração do layout dos arquivos compostos é opcional. Por padrão, os arquivos compostos utilizam o layout “best fit” (consulte Personalização do layout do vídeo para arquivos compostos).

Para obter mais informações sobre arquivamento, consulte o Arquivamento do OpenTok guia do desenvolvedor.

Trabalhando com transmissões

Você só pode iniciar transmissões ao vivo para sessões que utilizem o OpenTok Media Router (sessões com o modo de mídia definido como “routed”).

Inicie a transmissão ao vivo de uma sessão do OpenTok usando o startBroadcast($sessionId, $options) método do OpenTok\OpenTok classe. Isso retornará um OpenTok\Broadcast instância. O $options O parâmetro é um array usado para definir os fluxos de transmissão e atribuir opções de transmissão, como layout, maxDuration, resolução e outras.

// Define options for the broadcast
$options = [
  'layout' => Layout::getBestFit(),
  'maxDuration' => 5400,
  'resolution' => '1280x720',
  'output' => [
    'hls' => [
      'dvr' => true,
      'lowLatency' => false
    ],
    'rtmp' => [
      [
        'id' => 'foo',
        'serverUrl' => 'rtmps://myfooserver/myfooapp',
        'streamName' => 'myfoostream'
      ],
      [
        'id' => 'bar',
        'serverUrl' => 'rtmps://myfooserver/mybarapp',
        'streamName' => 'mybarstream'
      ],
    ]
  ]
];

// Start a live streaming broadcast of a session
$broadcast = $opentok->startBroadcast($sessionId, $options);

// Store the broadcast ID in the database for later use
$broadcastId = $broadcast->id;

Você pode interromper a transmissão ao vivo usando o stopBroadcast($broadcastId) método do OpenTok\OpenTok objeto. Você também pode fazer isso usando o stop() método do OpenTok\Broadcast instância.

// Stop a broadcast from an broadcast ID (fetched from database)
$opentok->stopBroadcast($broadcastId);

// Stop a broadcast from an Broadcast instance (returned from startBroadcast)
$broadcast->stop();

Para obter um OpenTok\Broadcast instância (e todas as informações a respeito dela) a partir de um ID de transmissão, use o getBroadcast($broadcastId) método do OpenTok\OpenTok classe.

$broadcast = $opentok->getBroadcast($broadcastId);

Você pode alterar o layout dinamicamente, usando o OpenTok->updateBroadcastLayout($broadcastId, $layout) método:

use OpenTok\OpenTok;

$layout = Layout::getPIP(); // Or use another get method of the Layout class.
$opentok->updateBroadcastLayout($broadcastId, $layout);

Você pode usar o Layout classe para definir os tipos de layout: Layout::getHorizontalPresentation(), Layout::getVerticalPresentation(), Layout::getPIP(), Layout::getBestFit(), Layout::createCustom().

$layoutType = Layout::getHorizontalPresentation();
$opentok->setArchiveLayout($archiveId, $layoutType);

// For custom Layouts, you can do the following
$options = array(
    'stylesheet' => 'stream.instructor {position: absolute; width: 100%;  height:50%;}'
);

$layoutType = Layout::createCustom($options);
$opentok->setArchiveLayout($archiveId, $layoutType);

Você também pode definir o layout do compartilhamento de tela chamando a função setScreenshareType() método em um objeto de layout.

$layout = Layout::getBestFit(); // Other types are not currently supported
$layout->setScreenshareType(Layout::LAYOUT_VERTICAL);

É possível definir a classe de layout inicial para os fluxos de um cliente configurando o layout opção ao criar o token para o cliente, usando o OpenTok->generateToken() método ou o Session->generateToken() método. E você pode alterar as classes de layout de um stream chamando o OpenTok->updateStream() método.

A configuração do layout das transmissões ao vivo é opcional. Por padrão, as transmissões utilizam o layout “melhor ajuste” (consulte Configurando o layout de vídeo para transmissões ao vivo do OpenTok transmissões).

Para obter mais informações sobre transmissões ao vivo, consulte o Transmissões ao vivo do OpenTok guia do desenvolvedor.

Forçar um cliente a se desconectar

Seu servidor de aplicativos pode desconectar um cliente de uma sessão do OpenTok chamando a função forceDisconnect($sessionId, $connectionId) método do OpenTok\OpenTok classe.

use OpenTok\OpenTok;

// Force disconnect a client connection
$opentok->forceDisconnect($sessionId, $connectionId);

Forçar os clientes em uma sessão a silenciar o áudio publicado

Você pode forçar o emissor de um stream específico a interromper a transmissão de áudio usando o Opentok.forceMuteStream($sessionId, $stream) método.

É possível forçar o emissor de todos os fluxos em uma sessão (exceto uma lista opcional de fluxos) a interromper a transmissão de áudio usando o Opentok.forceMuteAll($sessionId, $excludedStreamIds) método. Em seguida, você pode desativar o estado de mudo da sessão chamando o Opentok.DisableForceMute(sessionId) ou Opentok.DisableForceMuteAsync(sessionId) método.

Enviando sinais

Depois que uma sessão for criada, você poderá enviar sinais para todos os participantes da sessão ou para uma conexão específica. Você pode enviar um sinal chamando o signal($sessionId, $payload, $connectionId) método do OpenTok\OpenTok classe.

O $sessionId O parâmetro é o ID da sessão.

O $payload O parâmetro é um array associativo usado para definir o seguinte:

  • data (string) — A string de dados do sinal. É possível enviar no máximo 8 kB.

  • type (string) -- — (Opcional) A string que define o tipo do sinal. É possível enviar no máximo 128 caracteres, sendo permitidos apenas os seguintes: A-Z, a-z, Numbers (0-9), '-', '_' e '~'.

O $connectionId O parâmetro é uma string opcional usada para especificar o ID de conexão de um cliente conectado à sessão. Se você especificar esse valor, o sinal será enviado ao cliente especificado. Caso contrário, o sinal será enviado a todos os clientes conectados à sessão.

use OpenTok\OpenTok;

// Send a signal to a specific client
$signalPayload = array(
    'data' => 'some signal message',
    'type' => 'signal type'
);
$connectionId = 'da9cb410-e29b-4c2d-ab9e-fe65bf83fcaf';
$opentok->signal($sessionId, $signalPayload, $connectionId);

// Send a signal to everyone in the session
$signalPayload = array(
    'data' => 'some signal message',
    'type' => 'signal type'
);
$opentok->signal($sessionId, $signalPayload);

Para obter mais informações, consulte o Guia do desenvolvedor de sinalização do OpenTok.

Trabalhando com interconexão SIP

É possível adicionar um fluxo somente de áudio proveniente de um gateway SIP externo de terceiros utilizando o recurso de interconexão SIP. Para isso, é necessário um URI SIP, o ID da sessão à qual você deseja adicionar o fluxo somente de áudio e um token para se conectar a esse ID de sessão.

Para iniciar uma chamada SIP, ligue para o dial($sessionId, $token, $sipUri, $options) método do OpenTok\OpenTok classe:

$sipUri = 'sip:user@sip.partner.com;transport=tls';

$options = array(
  'headers' =>  array(
    'X-CUSTOM-HEADER' => 'headerValue'
  ),
  'auth' => array(
    'username' => 'username',
    'password' => 'password'
  ),
  'secure' => true,
  'from' => 'from@example.com'
);

$opentok->dial($sessionId, $token, $sipUri, $options);

Para obter mais informações, consulte o Guia do desenvolvedor do OpenTok SIP Interconnect.

Trabalhando com o Audio Connector

Você pode iniciar um Conector de áudio WebSocket chamando o connectAudio() método do OpenTok\OpenTok classe.

Requisitos

Você precisa de uma chave de API e de um segredo de API do OpenTok, que podem ser obtidos ao fazer login na sua Account da Video API da Vonage.

O SDK do OpenTok para PHP requer o PHP 7.2 ou superior.

Notas de lançamento

Veja o Comunicados página para mais detalhes.

Alterações importantes desde a versão 2.2.0

Alterações na versão 2.2.1:

A configuração padrão para o createSession() O método consiste em criar uma sessão com o modo de mídia definido como “relayed”. Nas versões anteriores do SDK, a configuração padrão era utilizar o OpenTok Media Router (modo de mídia definido como “routed”). Em uma sessão retransmitida, os clientes tentarão enviar fluxos diretamente entre si (ponto a ponto); se os clientes não conseguirem se conectar devido a restrições de firewall, a sessão utiliza o servidor TURN do OpenTok para retransmitir os fluxos de áudio e vídeo.

Alterações na versão 2.2.0:

Esta versão do SDK inclui suporte para trabalhar com arquivos do OpenTok.

Os nomes de muitos métodos da API foram alterados. Muitos nomes de métodos passaram a usar o formato “camel case”, incluindo os seguintes:

  • \OpenTok\OpenTok->createSession()
  • \OpenTok\OpenTok->generateToken()

Observe também que o options parâmetro do OpenTok->createSession() O método tem um mediaMode propriedade em vez de um p2p propriedade.

A classe API_Config foi removida. Armazene sua chave e seu segredo da API do OpenTok no código, fora dos arquivos do SDK.