myqaa / opentok
OpenTok 是一个由 TokBox 创建的实时流视频应用平台。
Requires
- php: ^7.2|^8.0
- ext-json: *
- ext-xml: *
- firebase/php-jwt: ^5.0
- guzzlehttp/guzzle: ~6.0|~7.0
- johnstevenson/json-works: ~1.1
Requires (Dev)
- helmich/phpunit-json-assert: ^3.0.0
- phing/phing: ~2.16.0
- php-http/guzzle7-adapter: ^1.0
- php-http/mock-client: ^1.4
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^7.4|^8.0
- rector/rector: ^0.8
- squizlabs/php_codesniffer: ^3.1
- dev-main
- v4.12.0
- v4.11.0
- v4.10.0
- v4.9.1
- v4.9.0
- v4.8.0
- v4.7.0
- v4.6.3
- v4.6.2
- v4.6.1
- v4.6.0
- v4.5.0
- v4.4.1
- v4.4.0
- v4.3.0
- v4.2.0
- v4.1.1
- v4.1.0
- v4.0.0
- v4.0.0-alpha.1
- v3.1.1
- v3.1.0
- v3.0.0
- v2.5.1
- v2.5.0
- v2.4.0
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v1.0
- dev-fix_sip_observeforcemute
- dev-whitesource-remediate/firebase-php-jwt-6.x
- dev-dev
- dev-bug/observe-force-mute-sip
- dev-feature/dvr-low-latency
- dev-feature/manual-stream-mode-minimal
- dev-feature/mute-all-minimal
- dev-feature/241-list-broadcasts
- dev-feature/observe-force-mute
- dev-feature/add-manual-stream-mode-for-broadcast-and-archive
- dev-feature/add-mute-all
- dev-enhancement/ci-tooling-docs-changes
- dev-feature/sip-enhancements
- dev-feature/devx-4270-archive-layout-options
- dev-bug/280-utils-test-in-wrong-namespace
- dev-bug/devx-5140-remove-composer-names
- dev-bug/276-improper-handling-of-signal-failures
- dev-4.6.0-release
- dev-php-7.4-updates-and-cleanup
- dev-php71-upgrade
- dev-4.5.0-version-bump
This package is auto-updated.
Last update: 2024-09-26 12:49:56 UTC
README
OpenTok PHP SDK 提供了用于以下操作的方法
- 生成 会话 和 令牌,适用于在 .NET 平台上运行的 OpenTok 应用程序
- 处理 OpenTok 归档
- 处理 OpenTok 实时流广播
- 处理 OpenTok SIP 互连
- 向会话中的客户端发送信号
- 从会话中断开客户端连接
- 强制会话中的客户端断开连接或静音发布的音频
安装
Composer(推荐)
Composer 帮助管理 PHP 项目的依赖项。更多信息请访问:https://getcomposer.org.cn
将此包(opentok/opentok
)添加到您的 composer.json
文件中,或在命令行中运行以下命令
$ composer require opentok/opentok ^4.0
用法
初始化
此包遵循 PSR-4 自动加载标准。如果您使用 composer 进行安装,只需引入生成的自动加载器即可
require "<projectpath>/vendor/autoload.php";
一旦加载了 SDK 的文件,您就可以使用自己的 API 密钥和 API 密码初始化一个 OpenTok\OpenTok
对象。
use OpenTok\OpenTok; $opentok = new OpenTok($apiKey, $apiSecret);
初始化选项
当出现特殊需求时,例如需要指向不同的数据中心或更改底层 HTTP 客户端的超时,OpenTok\OpenTok
对象仅允许覆盖一些值。对于这些情况,您可以作为第三个参数传递一个包含附加选项的数组。
我们允许以下选项
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,您可以使用它在 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 媒体路由器(媒体模式设置为路由)的会话。
您可以使用 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::ALWAYS
作为 OpenTok->createSession()
方法中 options
参数的 archiveMode
键传入来创建一个自动存档的会话(请参阅“创建会话”)。
您可以使用 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();
您还可以使用 OpenTok/OpenTok
类的 listArchives($offset, $count, $sessionId)
方法获取您创建的所有存档的列表(最多 1000 个)。这是通过使用 $offset
、$count
和 $sessionId
参数来完成的,这些参数是可选的,可以帮助您分页浏览结果,并按特定会话子集数据。这将返回一个 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
参数是一个数组,用于定义广播流,分配布局、最大持续时间、分辨率等广播选项。
// 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;
您可以使用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);
您也可以通过在布局对象上调用setScreenshareType()
方法来设置屏幕共享布局。
$layout = Layout::getBestFit(); // Other types are not currently supported $layout->setScreenshareType(Layout::LAYOUT_VERTICAL);
您可以通过设置令牌的 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.forceMuteStream($sessionId, $stream)
方法强制特定流的发布者停止发布音频。
您可以使用Opentok.forceMuteAll($sessionId, $excludedStreamIds)
方法强制会话中所有流的发布者(除了可选的流列表)停止发布音频。然后,您可以通过调用Opentok.DisableForceMute(sessionId)
或Opentok.DisableForceMuteAsync(sessionId)
方法来禁用会话的静音状态。
发送信号
会话创建后,您可以向会话中的每个人或特定连接发送信号。您可以通过调用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互连功能添加来自外部第三方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互连开发指南。
示例
此存储库包含三个示例应用程序。要尽快开始,请克隆整个存储库并按照教程操作
文档
参考文档可在https://tokbox.com/developer/sdks/php/reference/index.html找到。
要求
您需要一个OpenTok API密钥和API密钥,您可以通过登录您的Vonage Video API帐户来获取。
OpenTok PHP SDK需要PHP 7.2或更高版本。
发行说明
有关每个版本的详细信息,请参阅发行页面。
自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目录中的文档。
运行代码质量工具
此库使用了两个代码质量工具,以及一个完整的PHPUnit测试套件。
要运行phpcs,请在命令行中输入以下内容
$ composer run phpcs
要运行phpstan,请在命令行中输入以下内容
$ composer run phpstan
要运行PhpUnit,请在命令行中输入以下内容
$ composer run test
开发和贡献
获取帮助
我们很高兴听到您的声音,如果您有任何问题、评论或在项目中发现错误,请告诉我们!您可以选择以下方式
- 在此存储库中打开问题
- 有关支持选项,请参阅https://support.tokbox.com/
- 在Twitter上@我们!我们是在@VonageDev
- 或者 加入Vonage开发者社区Slack