带有 SCTE-35 的 HLS 分段器
项目描述
详情 | 安装| 使用| 定制 | 现场活动 | 错误 | 反馈 | 提示 | 流差异 | 边车 SCTE35
x9k3
HLS Segmenter with SCTE-35 Baked In
- Mpegts 流中的SCTE-35 提示被转换为HLS 标记。
- 根据需要在 SCTE-35 提示上拆分分段。
- M3U8清单是使用SCTE-35 HLS 标签创建的。
- 支持h264和h265以及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_out和 X9K3.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 的标签
2,Segmentation 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
查看哈希)
内置分布
x9k3-0.1.41-py3-none-any.whl
(10.0 kB
查看哈希)
关
x9k3-0.1.41.tar.gz的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 8edc586ef5517b918855847f6c06eac3773d5555b9395153add58d8d36c0ec91 |
|
| MD5 | 32c3cf1b6f714d52c5041ea7a9d4c9ae |
|
| 布莱克2-256 | 17c3ef3a2d82455b28a557a9be5f3f1324b58274b9b74270a79068facec5f14f |
关
x9k3-0.1.41 -py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 998401680460ab8f9e6ba1baf0ab8caf1fa1137330963cf6b0b58f5858c47d76 |
|
| MD5 | 21e63d489ed6891ce80965210243bb76 |
|
| 布莱克2-256 | ad666f841dd592aa258ebda50c128209bf529473bdd0f905f39c19843152d00d |