与 @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 侧基本只暴露当前直播信息:
后来换方向看 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