kevinkorb / opentok

OpenTok 是一个由 TokBox 创建的实时流媒体视频应用平台。

v4.5.0 2020-04-27 14:26 UTC

README

Build Status Contributor Covenant

Tokbox is now known as Vonage

OpenTok PHP SDK 允许您为 OpenTok 应用程序生成 会话令牌,并 存档 会话。它还包括处理 OpenTok 存档、处理 OpenTok SIP 互连 以及从会话中断开客户端连接的 方法

安装

Composer(推荐)

Composer 帮助管理 PHP 项目的依赖项。更多信息请访问:https://getcomposer.org.cn

将此包(opentok/opentok)添加到您的 composer.json 文件中,或者在命令行中运行以下命令

$ ./composer.phar require opentok/opentok 4.4.x

手动

Releases 页面下载最新发布的 opentok.phar 文件。

opentok.phar 放入 include_path 或在使用 OpenTok\* 类的任何脚本中 require 它。

用法

初始化

此包遵循 PSR-4 自动加载标准。如果您使用 composer 安装,只需 require 生成的自动加载器即可。

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

一旦加载了 SDK 的文件,您就可以使用自己的 API 密钥和 API 密码初始化一个 OpenTok\OpenTok 对象。

use OpenTok\OpenTok;

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

初始化选项

OpenTok\OpenTok 对象仅允许在出现特殊需求时覆盖一些值,例如需要指向不同的数据中心或更改底层 HTTP 客户端的超时。在这些情况下,您可以传递一个包含额外选项的数组作为第三个参数。

我们允许以下选项

  • apiUrl - 更改 SDK 指向的域名。在需要选择特定数据中心或指向用于测试的 API 的模拟版本时很有用。
  • client - 自定义 API 客户端,继承自 OpenTok\Utils\Client,用于自定义 HTTP 客户端。
  • timeout - 更改默认的 HTTP 超时,默认为无限期。您可以传递秒数来更改超时。
use OpenTok\OpenTok;
use MyCompany\CustomOpenTokClient;

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

创建会话

要创建 OpenTok 会话,请使用 OpenTok\OpenTok 类的 createSession($options) 方法。参数 $options 是一个可选的数组,用于指定以下内容

  • 设置会话是否使用 OpenTok 媒体路由器或尝试在客户端之间直接发送流。

  • 设置会话是否自动创建存档(意味着使用路由会话)。

  • 指定位置提示。

OpenTok\Session 实例的 getSessionId() 方法返回会话 ID,您可以使用该 ID 在 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();

生成令牌

一旦创建会话,您就可以为客户端生成用于连接的令牌。您可以通过调用OpenTok\OpenTok类的generateToken($sessionId, $options)方法,或者创建会话后,通过调用OpenTok\Session实例上的generateToken($options)方法来生成令牌。$options参数是一个可选的数组,用于设置令牌的角色、过期时间和连接数据。对于存档和广播中的布局控制,还可以设置使用此令牌从连接发布的流的基本布局类列表。

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')
));

处理流

您可以通过调用OpenTok\OpenTok类的getStream($sessionId, $streamId)方法来获取有关流的信息。

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

您可以通过调用OpenTok\OpenTok类的listStreams($sessionId)方法来获取会话中所有流的信息。

use OpenTok\Session;

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

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

处理存档

您只能存档使用OpenTok媒体路由器(媒体模式设置为routed)的会话。

您可以使用OpenTok\OpenTok类的startArchive($sessionId, $name)方法开始录制OpenTok会话。这将返回一个OpenTok\Archive实例。参数$archiveOptions是一个可选的数组,用于指定名称、是否录制音频和/或视频、存档的期望输出模式以及适用的期望分辨率。请注意,您只能在已连接客户端的会话上开始存档。

// 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;

如果将outputMode选项设置为OutputMode::INDIVIDUAL,则会导致存档中的每个流被录制到其自己的单独文件中。请注意,当将outputMode选项设置为OutputMode::INDIVIDUAL时,不能指定分辨率。OutputMode::COMPOSED设置(默认设置)会导致存档中的所有流被录制到单个(组合)文件中。

请注意,您还可以通过将archiveMode键设置为ArchiveMode::ALWAYS,将options参数传递给OpenTok->createSession()方法(见“创建会话”部分)来创建自动存档会话。

您可以使用OpenTok\OpenTok对象的stopArchive($archiveId)方法停止已开始的存档录制。您也可以使用OpenTok\Archive实例的stop()方法来做到这一点。

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

要从存档ID获取OpenTok\Archive实例(及其所有信息),请使用OpenTok\OpenTok类的getArchive($archiveId)方法。

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

要删除存档,您可以调用OpenTok\OpenTok类的deleteArchive($archiveId)方法或OpenTok\Archive实例的delete()方法。

// 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();

您还可以使用您的API密钥获取您创建的所有存档列表(最多1000个)。这是通过使用OpenTok/OpenTok类的listArchives($offset, $count)方法完成的。参数$offset$count是可选的,可以帮助您分页浏览结果。这将返回一个OpenTok\ArchiveList类的实例。

$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();

对于组合存档,您可以使用setArchiveLayout($archiveId, $layoutType)方法动态更改布局。

use OpenTok\OpenTok;

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

您可以通过在创建客户端令牌时设置layout选项来设置客户端流的初始布局类,使用OpenTok->generateToken()方法或Session->generateToken()方法。您还可以通过调用OpenTok->updateStream()方法来更改流的布局类。

设置组合存档的布局是可选的。默认情况下,组合存档使用“最佳适配”布局(请参阅自定义组合存档的视频布局)。

有关存档的更多信息,请参阅OpenTok存档开发者指南。

处理广播

您只能为使用OpenTok媒体路由器(媒体模式设置为路由)的会话启动直播广播。

使用OpenTok\OpenTok类的startBroadcast($sessionId, $options)方法开始OpenTok会话的直播广播。这将返回一个OpenTok\Broadcast实例。$options参数是一个可选数组,用于指定广播选项,例如布局、最大持续时间、分辨率等。

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


// Start a live streaming broadcast of a session, using broadcast options
$options = array(
    'layout' => Layout::getBestFit(),
    'maxDuration' => 5400,
    'resolution' => '1280x720'
);
$broadcast = $opentok->startBroadcast($sessionId, $options);

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

您可以使用OpenTok\OpenTok对象的stopBroadcast($broadcastId)方法停止直播广播。您还可以使用OpenTok\Broadcast实例的stop()方法来做这件事。

// 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();

要从广播ID获取OpenTok\Broadcast实例(及其所有信息),请使用OpenTok\OpenTok类的getBroadcast($broadcastId)方法。

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

您可以使用OpenTok->updateBroadcastLayout($broadcastId, $layout)方法动态更改布局。

use OpenTok\OpenTok;

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

您可以使用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);

您可以通过在创建客户端令牌时设置layout选项来设置客户端流的初始布局类,使用OpenTok->generateToken()方法或Session->generateToken()方法。您还可以通过调用OpenTok->updateStream()方法来更改流的布局类。

设置直播广播的布局是可选的。默认情况下,广播使用“最佳匹配”布局(请参阅为OpenTok直播广播配置视频布局)。

有关直播广播的更多信息,请参阅OpenTok直播广播开发者指南

强制客户端断开连接

您的应用程序服务器可以通过调用OpenTok\OpenTok类的forceDisconnect($sessionId, $connectionId)方法从OpenTok会话中断开客户端。

use OpenTok\OpenTok;

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

发送信号

会话创建后,您可以向会话中的所有人或特定连接发送信号。您可以通过调用OpenTok\OpenTok类的signal($sessionId, $payload, $connectionId)方法发送信号。

$sessionId参数是会话的会话ID。

$payload参数是一个关联数组,用于设置以下内容

  • data(字符串)-- 信号的数据字符串。您可以发送最大8KB的数据。

  • type(字符串)-- (可选)信号的类型字符串。您可以发送最大128个字符,并且只允许以下字符:A-Z、a-z、数字(0-9)、'-'、'_'和'~'。

$connectionId参数是一个可选的字符串,用于指定连接到会话的客户端的连接ID。如果您指定此值,则信号将发送到指定的客户端。否则,信号将发送到会话中连接的所有客户端。

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);

有关更多信息,请参阅OpenTok信号开发者指南

使用SIP互连

您可以使用SIP Interconnect功能添加来自外部第三方SIP网关的音频流。这需要一个SIP URI、您希望添加音频流的会话ID以及连接到该会话ID的令牌。

要发起SIP呼叫,请调用OpenTok\OpenTok类的dial($sessionId, $token, $sipUri, $options)方法

$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);

有关更多信息,请参阅OpenTok SIP互连开发者指南

强制断开连接

您的应用程序服务器可以通过调用OpenTok\OpenTok类的forceDisconnect($sessionId, $connectionId)方法从OpenTok会话中断开客户端。

use OpenTok\OpenTok;

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

发送信号

会话创建后,您可以向会话中的所有人或特定连接发送信号。您可以通过调用OpenTok\OpenTok类的signal($sessionId, $payload, $connectionId)方法发送信号。

$sessionId参数是会话的会话ID。

$payload参数是一个关联数组,用于设置以下内容

  • data(字符串)-- 信号的数据字符串。您可以发送最大8KB的数据。

  • type(字符串)-- (可选)信号的类型字符串。您可以发送最大128个字符,并且只允许以下字符:A-Z、a-z、数字(0-9)、'-'、'_'和'~'。

$connectionId参数是一个可选的字符串,用于指定连接到会话的客户端的连接ID。如果您指定此值,则信号将发送到指定的客户端。否则,信号将发送到会话中连接的所有客户端。

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);

有关更多信息,请参阅OpenTok信号开发者指南

示例

此存储库中包含三个示例应用程序。要尽快开始,请克隆整个存储库并按照说明进行操作

文档

参考文档可在以下网址找到:https://tokbox.com/developer/sdks/php/reference/index.html

要求

您需要一个OpenTok API密钥和API密钥,您可以通过登录您的TokBox账户来获取。

OpenTok PHP SDK需要PHP 5.6+或PHP 7+

对于PHP 5.5及以下版本,请使用PHP SDK v2.5

版本说明

有关每个版本详细信息的说明,请参阅版本页面。

自v2.2.0以来的重要变更

v2.2.1中的变更

createSession()方法的默认设置是创建一个设置为中继的媒体模式的会话。在SDK的早期版本中,默认设置是使用OpenTok媒体路由器(媒体模式设置为路由)。在中继会话中,客户端将尝试直接相互发送流(点对点);如果由于防火墙限制而无法连接,会话将使用OpenTok TURN服务器来中继音频视频流。

v2.2.0中的变更

本版本的SDK包括与OpenTok存档一起工作的支持。

API的许多方法名称已更改。许多方法名称已更改为使用驼峰命名法,包括以下内容

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

请注意,OpenTok->createSession()方法的options参数具有mediaMode属性而不是p2p属性。

已删除API_Config类。请将您的OpenTok API密钥和API密钥保存在SDK文件之外的代码中。

请参阅参考文档http://www.tokbox.com/opentok/libraries/server/php/reference/index.html以及SDK的docs目录中的文档。

开发和贡献

有兴趣贡献吗?我们喜欢合并请求!请参阅开发贡献指南。

获取帮助

我们很高兴听到您的反馈,如果您有任何问题、评论或在该项目中发现错误,请告诉我们!您可以选择