Skip to main content

带有 SCTE-35 的 HLS 分段器

项目描述

详情 | 安装| 使用| 定制 | 现场活动 | 错误 | 反馈 | 提示 | 流差异 | 边车 SCTE35

x9k3

图片

HLS Segmenter with SCTE-35 Baked In

  • Mpegts 流中的SCTE-35 提示被转换为HLS 标记
  • 根据需要在 SCTE-35 提示上拆分分段。
  • M3U8清单是使用SCTE-35 HLS 标签创建的。
  • 支持h264h265以及mpeg2视频。
  • 多协议。文件、Http(s)多播Udp
  • 支持直播_
  • 可定制的 广告中断条件
  • SCTE-35 提示现在可以从边车文件中加载
  • 带有视频循环演示的假直播。ffplay https://slo.me/index.m3u8

Details

  • 在 iframe 上切割段。

  • 段大小为 2 秒或更长,由 GOP 大小决定。

  • 段被命名为 seg1.ts seg2.ts 等等...

  • 对于 SCTE-35,视频片段在第一个 iframe >= 拼接点 pts 处被剪切。

  • 如果 SCTE-35 提示中不存在 pts 时间,则在下一个 iframe 处剪切该片段。

  • SCTE-35 提示在收到时添加。

  • 添加了所有 SCTE35 提示命令。

# Time Signal
#EXT-X-SCTE35:CUE="/DC+AAAAAAAAAP/wBQb+W+M4YgCoAiBDVUVJCW3YD3+fARFEcmF3aW5nRlJJMTE1V0FCQzUBAQIZQ1VFSQlONI9/nwEKVEtSUjE2MDY3QREBAQIxQ1VFSQlw1HB/nwEiUENSMV8xMjEwMjExNDU2V0FCQ0dFTkVSQUxIT1NQSVRBTBABAQI2Q1VFSQlw1HF/3wAAFJlwASJQQ1IxXzEyMTAyMTE0NTZXQUJDR0VORVJBTEhPU1BJVEFMIAEBhgjtJQ==" 
#EXTINF:2.085422,
seg1.ts

SCTE-35 cues with a preroll are inserted again at the splice point

# Splice Point @ 17129.086244
#EXT-X-SCTE35:CUE="/DC+AAAAAAAAAP/wBQb+W+M4YgCoAiBDVUVJCW3YD3+fARFEcmF3aW5nRlJJMTE1V0FCQzUBAQIZQ1VFSQlONI9/nwEKVEtSUjE2MDY3QREBAQIxQ1VFSQlw1HB/nwEiUENSMV8xMjEwMjExNDU2V0FCQ0dFTkVSQUxIT1NQSVRBTBABAQI2Q1VFSQlw1HF/3wAAFJlwASJQQ1IxXzEyMTAyMTE0NTZXQUJDR0VORVJBTEhPU1BJVEFMIAEBhgjtJQ==" 
#EXTINF:0.867544,
seg2.ts

CUE-OUT ans CUE-IN are added at the splice point

#EXT-X-SCTE35:CUE="/DAxAAAAAAAAAP/wFAUAAABdf+/+zHRtOn4Ae6DOAAAAAAAMAQpDVUVJsZ8xMjEqLYemJQ==" CUE-OUT=YES
#EXTINF:1.668334,
seg13.ts

VOD

  • x9k3 默认为 VOD 风格的播放列表生成。
  • 所有段都列在 m3u8 文件中。

Live

  • --live由、--delete--replay开关或通过设置激活X9K3.live=True

--live

  • 与 VOD 类似,除了:
    • 每次写入段时都会重新生成 M3u8 清单
    • 使用非实时源模拟实时流时,段创建受到限制。(如 ffmpeg 的“-re”)
    • 5 WINDOW_SLOTS的滑动窗口
    • 在广告插播期间,将提示继续标记添加到清单中的第一段。

--delete

  • 暗示--live
  • 当它们移出 m3u8 的滑动窗口时删除它们。

--replay

  • 暗示--live
  • 暗示--delete
  • 循环视频文件并限制片段创建以伪造实时流。

Stream Diff

  • stream diff 是流的播放时间与 x9k3 生成段之间的差异。

  • 持续时间为 2 秒且生成时间为 0.5 秒的段将具有 1.5 的流差异。

  • 在默认模式下,stream_diff 是播放列表生成的基准。

a@debian:~/x9k3$ time x9k3  -i local-vid.ts 
./seg0.ts	start:  3.545000	duration:  2.112000	stream diff:  2.094049
./seg1.ts	start:  5.593000	duration:  2.048000	stream diff:  4.133058
  ...
  
./seg77.ts	start:  163.011667	duration:  2.176000	stream diff:  161.307591
./seg78.ts	start:  165.187667	duration:  2.176000	stream diff:  163.482903 <-- big stream diff

real	0m0.482s             <--  fast segmenting for VOD
user	0m0.334s
sys	0m0.128s
  • stream_diff 与--liveor--delete--replay

    • stream_diff 自动限制非实时流以进行实时播放。
    • stream_diff 使分割和滑动窗口保持同步。
a@debian:~/x9k3$ time x9k3 -i local-vid.ts --live
./seg0.ts	start:  1.433000	duration:  2.112000	stream diff:  1.749682
./seg1.ts	start:  3.545000	duration:  2.048000	stream diff:  1.664505
./seg2.ts	start:  5.593000	duration:  2.005333	stream diff:  1.604484
./seg3.ts	start:  7.598333	duration:  2.026667	stream diff:  1.608694

...

./seg76.ts	start:  158.617000	duration:  2.218667	stream diff:  0.151273
./seg77.ts	start:  160.835667	duration:  2.176000	stream diff:  0.101823
./seg78.ts	start:  163.011667	duration:  2.176000	stream diff:  0.100369  <-- small stream diff

real	2m44.775s   <-- real time segmenting to sync live stream sliding window
user	0m0.678s
sys	0m0.169s

Requires

Install

  • 使用 pip 安装 x9k3 库和可执行脚本 x9k3
# python3

python3 -mpip install x9k3

# pypy3 

pypy3 -mpip install x9k3

How to Use

图片

Example Usage

local file as input

   x9k3 -i video.mpegts

multicast stream as input with a live sliding window

x9k3 --live -i udp://@235.35.3.5:3535

use ffmpeg to read multicast stream as input and x9k3 to segment

  with a sliding window, and  expiring old segments.
   --delete implies --live
 ffmpeg  -re -copyts -i udp://@235.35.3.5:3535 -map 0 -c copy -f mpegts - | x9k3 --delete

https stream for input, and writing segments to an output directory

  directory will be created if it does not exist.
 x9k3 -i https://so.slo.me/longb.ts --output_dir /home/a/variant0

using stdin as input

cat video.ts | x9k3

load scte35 cues from a text file

Sidecar Cues will be handled the same as SCTE35 cues from a video stream.

line format for text file : pts, cue

pts is the insert time for the cue, A four second preroll is standard. 

cue can be base64,hex, int, or bytes
a@debian:~/x9k3$ cat sidecar.txt

38103.868589, /DAxAAAAAAAAAP/wFAUAAABdf+/+zHRtOn4Ae6DOAAAAAAAMAQpDVUVJsZ8xMjEqLYemJQ== 
38199.918911, /DAsAAAAAAAAAP/wDwUAAABef0/+zPACTQAAAAAADAEKQ1VFSbGfMTIxIxGolm0= 

    
x9k3 -i  noscte35.ts  -s sidecar.txt 

In Live Mode you can do dynamic cue injection

touch sidecar.txt

x9k3 -i vid.ts -s sidecar.txt -l 

# Open another terminal and printf cues into sidecar.txt

printf '38103.868589, /DAxAAAAAAAAAP/wFAUAAABdf+/+zHRtOn4Ae6DOAAAAAAAMAQpDVUVJsZ8xMjEqLYemJQ==\n' > sidecar.txt

FAQ

Q.

如何自定义 CUE-OUT 和 CUE-IN 广告插播事件?

A.

覆盖X9K3.scte35.is_cue_outX9K3.scte35.is_cue_in静态方法。

X9K3 类具有三个可以覆盖自定义静态方法

@静态方法 参数 返回值 细节
mk_cue_tag 提示 文本 调用以生成 scte35 hls 标签
is_cue_out 提示 布尔 如果提示是 CUE-OUT,则返回 True
is_cue_in 提示 布尔 如果提示是 CUE-IN,则返回 True

Example


  • 覆盖静态方法X9K3.scte35.is_cue_out(cue)
  • 要求
    • 类型的拼接命令6时间信号
    • 类型为 Splice Descriptor 的标签2Segmentation Descriptor
    • 分段类型 ID 为0x22" Break Start"
def my_cue_out(cue):
    """
    my_cue_out returns True 
    if the splice command is a time signal
    """
    if cue.command.command_type == 6: # time signal
        for d in cue.descriptors:      # cue.descriptors is always list
            if d.tag ==2:              # Segmentation Descriptor tag
                if d.segmentation_type_id == 0x22:  # Break Start
                    return True
    return False
  • 创建X9K3实例_
from x9k3 import X9K3
x9 = X9K3("vid.ts")
  • 将 is_cue_out 设置为您的自定义函数
x9.scte35.is_cue_out = my_cue_out
x9.decode()

图片

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

x9k3-0.1.41.tar.gz (9.9 kB 查看哈希

已上传 source

内置分布

x9k3-0.1.41-py3-none-any.whl (10.0 kB 查看哈希

已上传 py3