kevinkorb / opentok
OpenTok 是一个由 TokBox 创建的实时流媒体视频应用平台。
Requires
- php: >=5.6.0
- firebase/php-jwt: ^5.0
- guzzlehttp/guzzle: ~6.0
- johnstevenson/json-works: ~1.1
Requires (Dev)
- phing/phing: ~2.16.0
- phpunit/phpunit: ~5.7
README
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目录中的文档。
开发和贡献
获取帮助
我们很高兴听到您的反馈,如果您有任何问题、评论或在该项目中发现错误,请告诉我们!您可以选择
- 在本存储库中打开一个问题
- 有关支持选项,请参阅https://support.tokbox.com/
- 给我们发推文!我们在推特上是@VonageDev
- 或加入Vonage开发者社区Slack