事情是这样的,我爷想看点中央电视台的动物世界,于是我就到央视网看了一下,确实可以免费看,而且特别全。但是电视上用浏览器看有点麻烦,而可以看这些视频的央视影音那个旧的电视盒子又没法安装,所以就想从网页中临时下几集到U盘里给他看。
但是网页没有提供下载功能,于是我想直接F12
找到网页中视频的地址然后下载下来,发现视频的地址没法看。
然后又尝试从PC端的软件中下载,先下载了一个央视影音,发现已经停止维护了。
又尝试从手机端下载,手机端的央视影音是可以看并且是可以下载的,但是手机下载到本地的文件却没办法直接用手机本地播放器打开,上网查了一下也没有能够转换本地视频(央视影音加密过的?)的现成软件。
最后还是感觉在电脑的网页中找到视频的真实地址然后下载比较方便。
获取伪地址并替换
以动物世界为例,《动物世界》 20221231 森林里的新生命(下)
- 打开
F12
- 直接搜
<video>
标签
- 找到
<video>
标签内包含的 <source>
标签,内部 src
属性的值就是视频的伪地址,直接播放这个地址将是花屏画面;
1
|
<video id="_video_player_html5_api" class="vjs-tech" tabindex="-1" autoplay="" src="blob:https://tv.cctv.com/bf9fe204-e0d6-4107-a016-21165614a5c5" data-spm-anchor-id="C52056131267.PAgOvvq0dRfD.0.i0"><source src="https://dh5.cntv.qcloudcdn.com/asp/h5e/hls/main/0303000a/3/default/9f8003b9d69e4f3082c8318e5ee0ff60/main.m3u8?maxbr=2048&contentid=15120519184043" type="application/x-mpegURL"></video>
|
- 将以上伪地址中
default/
和 /main.m3u8
中间的标识字符串9f8003b9d69e4f3082c8318e5ee0ff60
部分替换到以下链接中的 *******
处,所得即是央视网视频的真地址;
1
|
https://hls.cntv.lxdns.com/asp/hls/main/0303000a/3/default/******/main.m3u8
|
真实地址
1
|
https://hls.cntv.lxdns.com/asp/hls/main/0303000a/3/default/9f8003b9d69e4f3082c8318e5ee0ff60/main.m3u8
|
将这个真实地址粘贴到potplayer是可以播放的,就是分辨率有点低

直接获取真地址
- 浏览器打开央视网相应视频地址,
F12
打开开发者工具;
- 选择
Network(网络)
工具,在筛选栏中搜索 getHttpVideoInfo.do
;
- 搜索后如果没有内容,可以刷新一下网页,直到浏览器返回以
getHttpVideoInfo.do
开头的地址,进入该地址,点击 Preview(预览)
界面,在该界面里找到 hls_url
项,其后的地址即央视网视频的真地址,参数 maxbr=2048
表示限制最大比特率为 2048kbps

地址如下:
1
|
https://newcntv.qcloudcdn.com/asp/hls/main/0303000a/3/default/9f8003b9d69e4f3082c8318e5ee0ff60/main.m3u8?maxbr=2048
|
调整参数设置分辨率为最高(废弃)
对于上面找到的真地址中,有两个 main
参数,表示视频的分辨率,有时候直接获取的地址并不是最高画质,需要手动修改画质参数以达到相应画质,央视网对应的画质及其参数如下
流畅:480×270 参数:450 |
标清:640×360 参数:850 |
高清:1280×720 1024kbps 参数:1200 |
超清:1280×720 2048kbps 参数:2000 |
把链接中的两个 main
参数更改为 2000
即可播放超清画质的视频
1
2
|
# 超清
https://newcntv.qcloudcdn.com/asp/hls/2000/0303000a/3/default/9f8003b9d69e4f3082c8318e5ee0ff60/2000.m3u8
|
经测试已经不是最高清晰度的了,现在这个链接只能下270p的
下载m3u8视频
可以借助 ffmpeg 下载央视网视频
ffmpeg安装命令
1
2
3
|
sudo apt update
sudo apt install ffmpeg
ffmpeg -version
|
下载命令如下,其中 ******
处即央视网视频原地址,***.mp4
是下载后的视频名称及格式:
1
2
3
4
|
ffmpeg -i ****** -vcodec copy -acodec copy ***.mp4
# 示例,使用ffmpeg命令下载上述链接
ffmpeg -i https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/cc466477fdf5424bbef560d4f21c63f3/2000.m3u8 -vcodec copy -acodec copy YangShiChunWan.mp4
|
通过其它解析软件解析出的链接看什么样的链接下载的是720p的
看了一下其它软件解析的链接,和我看到的教程里的链接不太一样
1
2
3
4
5
6
|
# 原链接
https://tv.cctv.com/2022/12/31/VIDEDit1xPdXVzgypAgDg1ki221231.shtml?spm=C52056131267.PAgOvvq0dRfD.0.0
# 小滑轮解析的,720p,但是花屏,应该是加密了
https://dh5wswx01.v.cntv.cn/asp/h5e/hls/main/0303000a/3/default/9f8003b9d69e4f3082c8318e5ee0ff60/main.m3u8?maxbr=2048&contentid=15120519184043
# 直接在网页中找到的,270p但是可以看
https://hls.cntv.lxdns.com/asp/hls/main/0303000a/3/default/9f8003b9d69e4f3082c8318e5ee0ff60/main.m3u8?maxbr=2048
|
但是百度上又没有其它教程了,于是我到b站搜了一下,发现b站的教程是有用的,以下是b站教程的思路
B站教程
教程中一共给了两个下载方法
-
方案一:下载加密文件,本地解密
-
方案二:直接下载解密的视频
其中方案二依赖浏览器的油猴脚本,适合下载量小的情况,不用安FFmpeg和Node.js,纯图形化操作,和我的需求不符,所以我选择了方案一
下载原始加密的.ts文件
1
2
3
4
5
|
# 第一个****代表视频地址,第二个*****代表输出的ts文件
ffmpeg -i "******" -c:v copy -c:a copy *****.ts
# 例如
ffmpeg -i "https://dh5aliwx01.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/7197b25525e646538bfdde2b2520aa15/2000.m3u8" -c:v copy -c:a copy 《动物世界》20221130随潮水而律动_加密.ts
|
本地解密
这里参考了一位大佬的文章scz.617.cn/web/202408231518.txt
解密指令
1
|
node ts_decrypt.js 《动物世界》20221130随潮水而律动_加密.ts 《动物世界》20221130随潮水而律动.ts
|
解密后,转换成mp4格式
1
|
ffmpeg -i 《动物世界》20221130随潮水而律动.ts -c copy 《动物世界》20221130随潮水而律动.mp4
|
获取720p加密链接
上面提到我参考之前教程获取的链接不对,所以我又开F12找了一下,发现「Network(网络)」>「搜索:2000.m3u8」>「标头」>「请求URL」中的链接是我想要的

于是就可以开始下载了
(已废弃)视频标题和链接
以《动物世界》为例,在https://tv.cctv.com/lm/dwsj/这个页面有全部视频
安装python库:
1
2
|
pip install selenium
pip install webdriver-manager
|
下载谷歌浏览器以及对应驱动,这个链接中是版本配套的
1
|
https://googlechromelabs.github.io/chrome-for-testing/
|
然后将ChromeDriver解压,并将其路径添加到环境变量中,我这里是D:\Program Files\chromedriver-win64
「系统变量」>「Path」>「编辑」>「新建」
完整操作
1
2
3
4
5
|
ffmpeg -i "https://dh5aliwx01.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/7197b25525e646538bfdde2b2520aa15/2000.m3u8" -c:v copy -c:a copy 《动物世界》20221130随潮水而律动_加密.ts
node ts_decrypt.js 《动物世界》20221130随潮水而律动_加密.ts 《动物世界》20221130随潮水而律动.ts
ffmpeg -i 《动物世界》20221130随潮水而律动.ts -c copy 《动物世界》20221130随潮水而律动.mp4
|
已知标题和链接的处理脚本
已知标题和链接,存储在source.txt中
1
2
3
4
5
6
7
|
《动物世界》 20221025 沙洲上的生命&https://dh5aliwx02.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/74cd8c27d19940048c728f442d95e43a/2000.m3u8
《动物世界》 20221023 勇敢的旅程(下)&https://dh5ws01.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/4c4d502804d4420daeb9de00e3cec64d/2000.m3u8
《动物世界》 20221022 勇敢的旅程(上)&https://dh5wswx02.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/4a0f3389596f4fcc97603be2c646eb14/2000.m3u8
《动物世界》 20221021 鸟儿的故事(下)&https://dh5.cntv.qcloudcdn.com/asp/h5e/hls/2000/0303000a/3/default/f72362f83e684ac3970d5953307ccbad/2000.m3u8
《动物世界》 20221020 鸟儿的故事(上)&https://dh5aliwx02.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/9c926be871494797a2557bd1e4af9ef7/2000.m3u8
《动物世界》 20221018 飞鸟日记(下)&https://dh5ws01.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/00628f8915d74ca597183fec8f5b0c1a/2000.m3u8
《动物世界》 20221016 飞鸟日记(上)&https://dh5aliwx02.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/0c35dcd0c2d4402db8104beb36ccdb63/2000.m3u8
|
将标题和链接处理成可以在终端中执行的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import os
# 定义文件路径
file_path = "source.txt"
# 存储标题和链接的字典
title_link_dict = {}
# 处理文本函数
def process_line(line):
# 分割标题和链接
title, link = line.split("&")
# 去掉标题中的空格
title = title.replace(" ", "")
# 去掉前后的空白字符
title = title.strip()
link = link.strip()
# 将标题和链接存储到字典中
title_link_dict[title] = link
# 打印处理后的标题和链接,供调试
print(f"标题: {title}")
print(f"链接: {link}")
# 格式化输出命令
command = f'ffmpeg -i "{link}" -c:v copy -c:a copy {title}_加密.ts && node ts_decrypt.js {title}_加密.ts {title}.ts && ffmpeg -i {title}.ts -c copy {title}.mp4'
# 打印处理后的命令
print(f"命令: {command}")
return command
# 检查文件是否存在
if os.path.exists(file_path):
# 读取文件并处理每一行
with open(file_path, "r", encoding="utf-8") as f:
commands = []
for line in f:
if line.strip(): # 忽略空行
command = process_line(line.strip())
commands.append(command)
# 将处理后的命令输出到一个新文件
with open("output_commands.txt", "w", encoding="utf-8") as f:
f.write("\n".join(commands))
else:
print(f"文件 {file_path} 不存在,请检查文件路径。")
|
参考
-
央视网视频下载 - luomocn - 博客园
-
scz.617.cn/web/202408231518.txt
-
CCTV央视片库花屏视频解密&最高画质视频下载(两种方法)_哔哩哔哩_bilibili