aminyazdanpanah/php-shaka

Shaka PHP 是一个库,使用 Shaka Packager 进行 DASH 和 HLS 打包和加密,支持 Widevine 和其他 DRM 系统的通用加密。

v1.0.4 2020-10-25 15:13 UTC

This package is auto-updated.

Last update: 2024-09-06 11:10:51 UTC


README

Build Status Build status

Shaka PHP 是一个库,使用 Shaka Packager 进行 DASH 和 HLS 打包和加密,支持 Widevine 和其他 DRM 系统的通用加密。

内容

需求

  1. 本软件包版本仅与 PHP 7.2 或更高版本兼容。

  2. 此库需要一个工作的 Shaka Packager 二进制文件。二进制文件可以位于系统 PATH 中以自动在 PHP 中获取二进制文件。您也可以在加载时指定二进制文件路径。

获取 Shaka Packager

您可以通过多种方式获取 Shaka Packager。

对于获取预构建二进制文件的用户:请将 packager-'OS' 重命名为 packager 并将 Shaka Packager 的路径添加到您的系统 PATH 中。(例如,将 'packager-win.exe' 重命名为 'packager.exe')

安装

使用 Composer 从 Packagist 安装此库

从您的项目目录运行以下命令以添加依赖项

composer require aminyazdanpanah/php-shaka

或者,直接将依赖项添加到您的 composer.json 文件中

"require": {
    "aminyazdanpanah/php-shaka": "^1.0"
}

使用

了解如何使用此库的最佳方法是查看 示例 并浏览源代码,因为它是自文档化的。

强烈建议阅读 Shaka Packager 文档

基本使用

初始化

Shaka PHP 自动检测 packager 二进制文件。还可以通过传递一个关联数组配置到 initialize 方法,以明确给出二进制文件路径和超时。

$config = [
    'packager.binaries' => 'path/to/packager/binary',
    'timeout'           =>  3600
];

$shaka = \Shaka\Shaka::initialize($config);

可以有多个来自同一“文件”或多个不同“文件”的“流”。

$stream1 = \Shaka\Options\Streams\Stream::input('/the/path/to/the/file');
$stream2 = \Shaka\Options\Streams\Stream::input('/the/path/to/the/file');
//...

您可以为您的流添加选项

$stream1->streamSelector('video')
        ->output('video.mp4');
流选项

媒体文件分析

它可以用来检查媒体文件的内容并输出基本流信息

$export = $shaka->streams($stream)
    ->mediaFileAnalysis()
    ->export();

$exportStreamCollection 的实例。有关更多信息,请参阅 示例

基本转封装

它可以用来提取流,可选地将流从一种容器格式转换为另一种容器格式。

$stream1 = Stream::input('/the/path/to/the/file')
    ->streamSelector('video')
    ->output('video.mp4');

$stream2 = Stream::input('/the/path/to/the/file')
    ->streamSelector('audio')
    ->output('audio.mp4');

$export = $shaka->streams($stream1, $stream2)
            ->mediaPackaging()
            ->export();

基本使用示例

请参阅 examples/Basic 以获取详细信息。

DASH

动态自适应HTTP流(DASH)是一种自适应比特率流技术,它允许通过HTTP传输高质量的多媒体内容。

DASH流选项

除了 流选项DRM流选项 之外,您还可以将 DASHRoles() 方法添加到您的 DASHStream 对象中。您可以传递角色到该方法。角色可以由冒号或分号分隔。值应该是以下之一:字幕、副标题、主要、替代、补充、解说和配音。请参阅 DASH (ISO/IEC 23009-1) 规范以获取详细信息。

$stream1 = $stream1 = DASHStream::input('/the/path/to/the/file')
                        //->other options

DASH打包

此库支持DASH内容打包。

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->DASH('output.mpd')
    ->export();

您可以使用回调方法为您的DASH对象添加选项

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->DASH('output.mpd', function ($options) {
        return $options->generateStaticLiveMpd();
            //->other options;
    })
    ->export();

DASH选项

此外,您还可以将一些 分块MP4输出 选项添加到您的DASH对象中(在使用这些选项之前,请阅读 描述

分块和MP4输出选项

实现基于ISO/IEC 23009-1:2014中描述的基于模板的段URL构建。

段模板格式化

  • 注意:此版本不支持标识符和。如果您希望支持它们,请提交问题。

DASH示例

请参阅 examples/DASH 以获取详细信息。

HLS

HTTP实时流(也称为HLS)是苹果公司作为其QuickTime、Safari、OS X和iOS软件的一部分实现的基于HTTP的媒体流通信协议。它与MPEG-DASH相似,因为它通过将整个流分解为一系列小的基于HTTP的文件下载来工作,每个下载加载整体潜在无界传输流的一个短段。随着流的播放,客户端可以从包含以各种数据速率编解码的相同材料的多个替代流中进行选择,允许流会话适应可用的数据速率。在流会话开始时,HLS下载包含各种子流元数据的扩展M3U播放列表。

HLS流选项

除了 流选项DRM流选项 之外,您还可以添加以下选项

$stream1 = $stream1 = HLSStream::input('/the/path/to/the/file')
                        //->other options

HLS打包

此库支持HLS内容打包。

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->HLS('output.m3u8')
    ->export();

您可以使用回调方法为您的HLS对象添加选项

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->HLS('output.m3u8', function ($options) {
        return $options->HLSMasterPlaylistOutput();
            //->other options;
    })
    ->export();

HLS选项

此外,您还可以将一些 分块和MP4输出选项 添加到您的HLS对象中(在使用这些选项之前,请阅读 描述)。

  • 注意:您还可以在输出中使用 段模板格式化

  • 注意:DASH和HLS选项都可以同时指定以输出DASH和HLS清单。请注意,它仅适用于MP4输出。

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->HLS('hls.m3u8')
    ->DASH('dash.mpd')
    ->export();

HLS示例

请参阅 examples/HLS 以获取详细信息。

直播

一个典型的直播源是UDP组播,这是目前唯一直接支持的直播协议打包器。

对于其他不受支持的协议,您可以使用FFmpeg进行输入管道。有关详细信息,请参阅 FFmpeg管道

UDP文件选项

UDP文件格式为

udp://<ip>:<port>[?<option>[&<option>]...]

示例

udp://224.1.2.30:88?interface=10.11.12.13&reuse=1

HLS示例

有关详细信息,请参阅 examples/Live

DRM

Shaka Packager支持从Widevine密钥服务器和PlayReady密钥服务器获取加密密钥。Shaka Packager还支持原始密钥,其中密钥直接提供给Shaka Packager。

无论您使用哪个密钥服务器,都可以指示Shaka Packager在密钥服务器原生的保护系统之外生成其他保护系统。这可以轻松地生成多DRM内容。

DRM流选项

除了 流选项 外,您还可以添加以下选项

通用加密选项

Widevine 密钥服务器

生成Widevine受保护内容的最简单方法是使用Widevine云服务。

Shaka Packager可以与实现 Widevine DRM通用加密API 的Widevine云服务或任何密钥服务器通信,以获取加密密钥。

Widevine通用加密API支持使用AES或RSA进行请求验证。

启用与Widevine密钥服务器的加密。用户应提供AES签名密钥(aesSigningKey()aesSigningIv())或RSA签名密钥(rsaSigningKeyPath())。

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->DRM('widevine', function ($options) {
        return $options->keyServerUrl('https://license.uat.widevine.com/cenc/getcontentkey/widevine_test')**
            ->//other options
    })
    ->HLS('hls.m3u8')
    ->DASH('dash.mpd')
    ->export();

Widevine选项

除了 通用加密选项 外,您还可以添加以下选项

Widevine示例

有关详细信息,请参阅 examples/DRM/Widevine

PlayReady 密钥服务器

此库可以与实现 AcquirePackagingData Web方法规范 的PlayReady密钥服务器通信,以获取加密密钥。

如果您对生成多DRM内容感兴趣,请参阅 DRM

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->DRM('playReady', function ($options) {
        return $options->playreadyServerUrl('http://playready.get.key')
            ->//other options
    })
    ->HLS('hls.m3u8')
    ->DASH('dash.mpd')
    ->export();

PlayReady选项

除了 通用加密选项 外,您还可以添加以下选项

原始密钥服务器

此库支持原始密钥,其中密钥和key_ids直接提供给Shaka Packager。

这通常用于您自己管理加密密钥的情况。它还允许您通过提供自定义PSSHs来支持多DRM。

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->DRM('raw', function ($options) {
        return $options->keys('...keys')
            ->//other options
    })
    ->HLS('hls.m3u8')
    ->DASH('dash.mpd')
    ->export();

原始选项

除了 通用加密选项 外,您还可以添加以下选项

pssh-box(用于生成PSSH框的实用工具)

https://github.com/google/shaka-packager/tree/master/packager/tools/pssh

原始示例

有关详细信息,请参阅 examples/DRM/Raw

广告插入

此包不直接进行广告插入,但它可以为Google Ad Manager的 动态广告插入 准备内容。

支持DASH和HLS。

$export = $shaka->streams($stream1, $stream2, ...)
    ->mediaPackaging()
    ->HLS('hls.m3u8', function ($options) {
        return $options->adCues('600;1800;3000');
    })
    ->DASH('dash.mpd', function ($options) {
        return $options->adCues('600;1800;3000');
    })
    ->export();

广告插入示例

有关详细信息,请参阅 examples/adInsertion

多个开源播放器

贡献和报告错误

我很乐意您的帮助,以改进、纠正或添加到规范。请 提交问题提交拉取请求

  • 有关更多信息,请参阅 贡献文件
  • 如果您有任何问题或想要报告错误,请只需 提交问题
  • 如果您在此软件包中发现安全漏洞,请参阅 安全文件 获取更多帮助信息。

注意:如果您对这款软件包或Shaka Packager有任何疑问,请 不要 给我发送电子邮件(或在我的网站上提交联系方式)。与这些问题相关的电子邮件 将被忽略

致谢

许可证

MIT许可证(MIT)。请参阅 许可文件 获取更多信息。