myqaa / opentok

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

v4.12.0 2022-06-30 07:05 UTC

README

Build Status Contributor Covenant

Tokbox is now known as Vonage

OpenTok PHP SDK 提供了用于以下操作的方法

安装

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

开发和贡献

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

获取帮助

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