与 @Sophomores 折腾了一轮 CCTV / 央视频的播放和下载链路, 最后稳定跑通
战绩:
- 点播
- 直播 (央视频 1080p 直播)
- 回放
脚本:
scripts.zip (21.4 KB)
整体思路:
- CCTV 点播: 从 MSE 后置边界拿 clean 数据
cctv.com 点播这条, 直接抓源站 HLS 容易花屏. 一些看起来像最终地址的 hls_h5e_url / hls_enc_url, 直接下载并不稳定.
稳定方案是:
-
浏览器打开官方点播页面.
-
让官方播放器正常完成调度和媒体处理.
-
在
SourceBuffer.appendBuffer附近接管 MSE 后置数据. -
按 seek 分段捕获.
-
用
ffmpeg -c copy拼接成 MP4. -
用 decode log 做最终验证.
这条已经验证过大熊猫那个点播视频, 720p clean, decode log 为 0.
- 央视频直播: 1080p 可以, 但当前仍需要浏览器链路
央视频 1080p 直播目前稳定做法是浏览器后置接管:
-
浏览器打开央视频直播页.
-
官方播放器完成鉴权, 调度, 清晰度选择和媒体处理.
-
本地脚本接管 MSE 后置音视频片段.
-
用 ffmpeg 重新封装成本地 HLS.
-
PotPlayer 或 ffmpeg 访问本地 HLS.
本地播放地址类似:
http://127.0.0.1:8899/live.m3u8
PotPlayer 打开这个地址就能播放. ffmpeg 打这个地址就能保存当前直播.
直播保存是实时录制当前直播, 不是下载过去回放.
直播 1080p 链路里的调度, 鉴权, cKey, 清晰度选择, 解密或解封装仍由官方播放器动态完成. 我没有独立复刻整套播放器算法, 而是在它产出可播放媒体后接管.
- 央视频历史回看: 反而可以不用浏览器
历史回看一开始也试过 Web/H5 路线, 但 Web 侧基本只暴露当前直播信息:
-
PC 页面主要给当前直播.
-
player-api返回当前直播playurl. -
给当前 HLS 加 timeshift 参数无效.
-
部分 timeshift 地址 403.
-
Web 侧没有稳定暴露历史媒体 URL.
后来换方向看 Android App, 找到 App-native JCE 接口.
关键接口是:
POST https://jacc.ysp.cctv.cn
cmd = 25312
name = PidTimeShift
请求核心字段:
pid
sid
starttime
endtime
stream
以 CCTV1 为例:
pid = 600001859
sid = 2024078201
stream = fhd
stream=fhd 时服务端返回历史 VOD m3u8, 实测是 1080p 线路, 类似:
2024078203.m3u8
这个 m3u8 是标准历史 HLS, 里面能看到:
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-PROGRAM-DATE-TIME
所以历史回看这条不需要浏览器状态, 不需要登录, 不需要 cookie, 不需要 localStorage. 拿到历史 m3u8 后直接交给 ffmpeg remux 就行.
我这边已经验证过过去 24h 到过去 23h 的 20min 1080p 样本:
-
h264
-
1920x1080
-
25fps
-
aac
-
decode log 为 0
目前脚本:
能力/功能 当前状态 备注cctv.com 点播下载
已实现
已验证 720p clean
央视频直播 1080p 下载
已实现
实时保存, 不是回放
央视频历史回看下载
已实现
可指定过去时间窗口, 已验证 1080p
PotPlayer 播放直播
已实现
本地 HLS 地址播放
安装教程 (由AI总结):
INSTALL.zip (804 字节)
感言:
在此我们感谢 GPT 5.5, DeepSeek V4 Pro, DeepSeek V4 Flash, Opus 4.6 (ermm, 算了给他面子),感谢 Claude Code, JSHOOK 等等吧,还有人类的我们 @dkly2004 和 @Sophomores
1 个帖子 - 1 位参与者