将 SCTE-35 发送至流媒体服务器

SCTE标记主要用于向视频输出中插入广告,其作用是向接收端(例如流媒体服务器)发送信号,告知应在何时插入广告以及广告时长。这使得第三方系统能够从数据库中动态选择广告。您可以进一步了解SCTE-35的总体情况 在本网站上.

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


引言

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

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

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

请注意,您需要在“流”选项中启用 SCTE:


SCTE-35 标记示例

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

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

这将插入一条广告,并在指定时长结束后自动返回您的节目。时长将由 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 样本标签。点击“确定”(两次)关闭弹出窗口:

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

让我们创建一个测试 UDP 流,我们将输出直接写入文件,这样(暂时)就不用费心处理服务器相关的事务了。请复制以下设置,然后点击“立即开始”启动流。别忘了在“参数”中启用 SCTE-35:

现在,我们要将 SCTE-35 示例标签发送至直播流。请关闭“设置”界面,点击操作按钮数次,然后返回“设置”界面,通过“立即停止”停止直播。.

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

您还可以显示录制流中的 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 是我们首选的流媒体服务。它不仅经济实惠、易于部署和维护,同时还具备满足高级应用场景所需的深度和复杂性:

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 中设置您的流媒体:
首先,我们将定义输入流。在菜单中选择“Nimble Streamer”,然后选择“MPEGTS In”,点击“添加 UDP 流”按钮,接着按如下方式添加输入流。如果端口 5001 已被占用,您可以使用其他任何端口。.

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

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

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

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

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

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

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

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

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

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


其他信息

登录 PLAYDECK

我们会记录所有输入和输出的 SCTE 标签。这还让您能够通过将输出信号(包括 SDI 和流媒体)循环回输入端,让 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流或MPEG-TS文件中的SCTE-35标记转换为HLS SCTE标签。这样,您就可以部署一个不具备自动将SCTE-35转换为HLS功能的流媒体服务器。.

https://github.com/futzu/x9k3