将 SCTE-35 发送至 Stream 服务器

SCTE 标记主要用于向视频输出中插入广告,通过向接收端(例如 Streaming 服务器)发送信号,指定在何时插入广告以及广告的时长。这使得第三方系统能够从数据库中动态选择广告。 您可以进一步了解 SCTE-35 的相关信息 在本网站上.

本文内容:
引言
SCTE-35 标记示例
在本地测试 SCTE-35 标记
在 Nimble Streamer 中测试 SCTE-35 标记
其他信息


引言

我们还推荐 我们关于SCTE的概述文章.

您可以在 PLAYDECK 中将 SCTE 标记附加到 4 个不同的对象上:
– 片段(任意位置)
– 区块(起始和结束)
– 覆盖层(显示和隐藏)
– 操作按钮

我们没有为您提供预定义的 SCTE 标记,而是采取了另一种方法:您需要自行编写 SCTE 标记。这可能需要一些学习过程,但最终会带来更大的灵活性。 其优势在于,您的标记将始终与所有接收器兼容。为了获取片段时长及其他“变量”,我们提供了特定的“占位符”。.

请注意,必须在您的 Stream 选项中启用 SCTE:


SCTE-35 标记示例

让我们来看一些 SCTE-35 的示例。它展示了 SCTE-35 最常用的形式,即“拼接”。.

注: 本文介绍的 SCTE-35 格式与 Nimble Streamer 配合使用效果最佳(见下文)。根据您使用的 Stream 服务器不同,该格式可能会有所差异。请咨询您的服务提供商。.

这将插入一条广告,并在指定时长结束后自动返回您的节目。PLAYDECK 会根据您当前正在播放的片段自动设置该时长。您也可以使用 {blockduration} 或手动输入的数值来替换该时长。 若选择手动设置时长,计算公式为:片段时长乘以90000,并进行四舍五入。 这样设置的原因在于,90000是大多数SCTE系统使用的默认时间尺度。例如:若片段时长为12.4秒,则SCTE时长应为1116000。.

除了发送时长信息外,您还可以发送两个独立的 SCTE 标记来控制广告的开始和结束。它们分别称为 CUE-OUT(从节目切入广告)和 CUE-IN(切回节目)。.

正如您可能已经注意到的,唯一的区别在于“outOfNetworkIndicator”的值是1(CUE-OUT)还是0(CUE-IN)。SCTE系统会根据“spliceEventId”将这两个标记配对。.

注: 支持的占位符包括:{timestamp} {timestampunix} {airtimenext} {airtimenextunix} {plannednext} {plannednextunix} {clipid} {blockid} {blockduration} {clipduration}


在本地测试 SCTE-35 标记

打开 PLAYDECK。目前无需加载任何片段。右键单击任意“操作”按钮,创建一个新操作,然后选择“命令/SCTE”:

点击 SCTE-35 插入 SCTE-35 示例标签。点击“确定”(两次)关闭弹出窗口:

我们现在可以将 SCTE-35 标签发送至任何兼容的 Stream(UDP、DVB、SRT)。如果您现在点击“操作”,则不会发生任何变化,因为我们目前还没有 Stream。.

让我们创建一个名为“Test UDP Stream”的测试项目,在此项目中,我们只需将输出写入文件,这样(目前)就无需费心处理服务器相关事宜。请复制以下设置,然后点击“START NOW”启动 Stream。 别忘了通过“参数”启用 SCTE-35:

我们现在想将“Sample SCTE-35”标签发送至“Stream”。请关闭“设置”界面,点击“操作”按钮数次,然后返回“设置”界面,通过“立即停止”功能停止“Stream”。.

您的 SCTE-35 标签已由 PLAYDECK 记录。您可以通过返回“操作按钮”上的 SCTE-35 代码,然后点击“打开事件日志”来查看日志:

您还可以将录制的 Stream 文件中的 SCTE-35 标签显示出来。为此,我们需要一个名为“DVBInspector”的独立工具。该工具还需要 JAVA 运行时环境,因此请同时下载以下两项:

此工具需要 Java 运行时环境。如果尚未安装,您可以在此处下载:
https://www.oracle.com/java/technologies/downloads/

现在解压“DVBinspector-1.18.0-dist.zip”(或类似文件名),并运行“DVBinspector-1.18.0.jar”。然后将您的 TS 文件拖放到应用程序上。按以下步骤展开树形结构,查看您的 SCTE 标记。.


在 Nimble Streamer 中测试 SCTE-35 标记

Nimble Streamer 是我们首选的 Streaming 服务。它不仅性价比高、易于部署和维护,同时还具备满足高级应用场景所需的深度和复杂性:

https://softvelum.com/nimble/

将 Nimble 的 14 天试用版安装到与 PLAYDECK 运行在同一台机器上。虽然这不是必须的,但这样会更简单,因为您无需进行网络设置。 Nimble 还会提示您在 WMSPanel 上创建一个账户,WMSPanel 是 Nimble 的基于 Web 的配置工具,因为 Nimble Streamer 本身在安装时不带用户界面。.

信息: 若要在正式环境中测试此 SCTE-35 示例,您无需安装“Nimble Live Transcoder”或“Nimble Advertizer”插件。在试用版安装中,这些插件默认处于禁用状态。.

让 Nimble 运行起来后,还有一项配置需要手动完成。请在此处打开 Nimble 服务器配置文件:
c:\Program Files\Nimble Streamer\conf\nimble.conf

在该文件末尾添加以下几行,然后保存文件。.

scte35_processing_enabled = true 
scte35_forwarding_enabled = true 
hls_ad_scte35_forwarding_enabled = true
hls_ad_marker_format = cue
hls_ad_splice_out_cont_marker_enabled = true

重要提示: 您现在需要重启 Nimble,方法是重启电脑,或者手动重启 Windows 服务“Nimble Streamer”。.

以下是这些代码行,但添加了注释供您参考(请勿使用这些代码):

scte35_processing_enabled = true  // 启用 SCTE 模块。这是所有其他选项的必要条件
scte35_forwarding_enabled = true  // 允许通过 Live Transcoder 转发 SCTE-35 标记
hls_ad_scte35_forwarding_enabled = true  // 启用将 SCTE-35 标记转发至 HLS 流的功能
hls_ad_marker_format = cue  // 设置 Nimble 使用 CUE-OUT 和 CUE-IN 标记
hls_ad_splice_out_cont_marker_enabled = true  // 启用自动插入 EXT-X-CUE-OUT-CONT

现在,让我们在 WMSPanel 中配置您的 Streams:
首先,我们将定义传入的 Stream 流。在菜单中进入“Nimble Streamer”,选择“MPEGTS In”,点击“添加 UDP 流”按钮,然后按如下方式添加传入流。 如果端口 5001 已被占用,您可以使用任何其他端口。.

接下来,我们将设置输出流格式。 这里我们将使用 HLS 来演示 SCTE 标记从 UDP 到 HLS 的转换。在同一页面中,转到“MPEGTS 输出”部分,点击“添加输出流”按钮,然后按如下方式添加。请确保将输入流选为视频和音频源。.

接下来,我们继续在 PLAYDECK 中进行设置。进入 Stream 输出设置,将 Stream 的 URL 更改为“udp://127.0.0.1:5001”。.

信息: 您可以选择任何喜欢的视频编解码器。在此示例中,我选择了 H.264,以便让我的 NVIDIA GPU 进行编码,从而降低 CPU 占用率。此外,请在“参数”中启用 SCTE-35。.

信息: 请注意,PLAYDECK 无法直接流式传输 HLS。如果您将“Apple HTTP Live Streaming”选为 Streaming 格式,输出内容将被写入文件。 因此,您需要将文件目标指定为“Stream URL”,例如“c:\Users\Public\Documents\stream.m3u8”。 随后,您可以使用该文件通过任何 Streaming 服务器进行流媒体传输。PLAYDECK 无法将 HLS SCTE 标签写入 HLS 清单文件(即 *.3u8 文件)中。.

接下来,我们希望PLAYDECK能够自动发送SCTE信号,不仅通过按钮触发,还要与音频片段相关联。因此,我们插入任意音频片段,点击工具栏中的“命令”图标,然后添加一个新命令,选择“播放时间 0”,最后插入SCTE-35样本:

信息: 您还可以将 SCTE 标记添加到块、叠加层和操作按钮中。.

现在让我们开始吧:在PLAYDECK设置中对片段进行“CUE”和“PLAY”操作,并启动Stream。切换到WMSPanel,从“Nimble Streamer”菜单中打开“Live Streams”选项。 此时您将看到一个正在运行的实时流。点击它,然后像这样点击最右侧的问号图标。.

在“待播放的 URL”列表中,选择以“playlist.m3u8”结尾的那个,然后点击“复制”。现在将此 URL 粘贴到任何已集成或安装了 HLS 播放器的浏览器中。在本例中,我们使用安装了以下 HLS 播放器扩展程序的 CHROME 浏览器:
https://chromewebstore.google.com/detail/hls-player-m3u8-streaming/eakdijdofmnclopcffkkgmndadhbjgka

将该网址粘贴到 Chrome 浏览器后,您会立即看到 PLAYDECK 流媒体开始播放。 现在让我向您演示如何监控 SCTE 标记。在 Chrome 中按 F12 打开开发者工具。在顶部点击“网络”选项卡。此时您会看到多个“chunks.m3u8”文件,它们是您流媒体的一部分。 点击其中一个 Chunk 文件(也称为 HLS 清单),然后选择其旁边的“预览”。此时您将看到 HLS SCTE 标签。如果未显示,请点击另一个 Chunk 文件,因为我们仅在片段开始时发送 SCTE。.

就这样!我们已经达到了测试目标。接下来还有更多值得深入了解的信息。.


其他信息

登录 PLAYDECK

我们会记录所有输入和输出的 SCTE 标签。这还让您能够通过将输出信号循环连接至输入端(包括 SDI 和 Streams),并让 PLAYDECK 检测您的 SCTE,从而测试您的输出 SCTE。 您可以通过“日志”主菜单打开日志文件:


Nimble Streamer 中的日志记录

如果出现任何问题或情况与预期不符,不妨先查看 Nimble 日志文件。在 Windows 系统中,日志位于此处:
c:\Program Files\Nimble Streamer\log

在 Nimble 试用版中,日志记录功能默认已启用,但如果您需要手动启用该功能,以下是“nimble.conf”文件中的相关配置选项。.

log_access = file
logging = debug

现在打开日志文件,查找“SCTE”。你可能会看到类似以下的内容,这表明你在 PLAYDECK 中的 SCTE 标记中存在拼写错误:

[SCTE35] [mynewapp/mynewstream] 不支持类型为 6 的拼接命令

如果您的 SCTE 标记在 Nimble 中解析成功,其显示效果如下:

[SCTE35] splice_insert: event_id=4157 oon=1 immediate=1 pts_adjustment=0 pts=0 actual_pts=202593600 duration=2707200 data=0xfc....



工具:TSDuck

这是一个包含大量工具和插件的集合,拥有庞大的库,用于处理 MPEG 传输流。借助它,您可以根据算法或其他复杂逻辑,在 PLAYDECK 之外插入 SCTE 标记。.

https://tsduck.io/


工具:x9k3

该工具还可以将UDP SCTE-35或MPEG-TS文件中的SCTE-35标记转换为HLS SCTE标签。这样,您就可以部署一台不具备SCTE-35到HLS自动转换功能的流媒体服务器。.

https://github.com/futzu/x9k3