我们在每天使用新闻的时候大都会以CCTV发布的新闻为准,我们的每天新闻收视率最高的还是我们的总台,大家闲来无事可能也会看一下央视网提供视频直播吧,看看还可以,但是我们可以发现我们完全解析不了,大家看一看便知道了
打开CCTV直播,我们会看到当前直播的栏目
我们可以通过抓包软件直接获取直播的地址
这不是特别容易吗?一下就可以获取到我们的真实地址了呀!
WAIT,我们先去解析一下我们的代码
可是,当我们在PotPlayer里面打开之后发现,我们预期出现的画面并没有出来。那么这种情况肯定就是CCTV进行播放加密了。那我们该如何处理这种问题呢?
我们先尝试着把这四个播放地址全部播放一遍,说不定可以呢?
名称 | 地址 |
---|---|
index.m3u8 | https://cctvcncw.v.wscdns.com/live/cctv1_1/index.m3u8?adapt=0&BR=pub |
index.m3u8 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1/index.m3u8 |
cdrmcctv1_1_md.m3u8 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_md.m3u8 |
cdrmcctv1_1_td.m3u8 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_td.m3u8 |
我们一个一个尝试一下,尝试如下表所示
名称 | 地址 | 是否成功 | 显示页面 |
---|---|---|---|
index.m3u8 | https://cctvcncw.v.wscdns.com/live/cctv1_1/index.m3u8?adapt=0&BR=pub | 否 | 否 |
index.m3u8 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1/index.m3u8 | 是 | 否 |
cdrmcctv1_1_md.m3u8 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_md.m3u8 | 是 | 否 |
cdrmcctv1_1_td.m3u8 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_td.m3u8 | 是 | 否 |
我们可以发现,第二个链接可以选择清晰度,而第三第四个链接则是选择清晰度之后的视频地址。
在这里插入图片描述
我们多次切换后发现,我们出现了几个清晰度不同的链接
清晰度 | 链接 |
---|---|
流畅 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_md.m3u8 |
标清 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_hd.m3u8 |
高清 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_ud.m3u8 |
超清 | https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_td.m3u8 |
可是这些都无法播放啊!!!!
网上很多人都有各种不同的方法,之前我去一个非常著名的一个论坛就看到了我们如何去播放CCTV的直播,但是方法却十分狗血。 就是去寻找我们网上的一些大神所给我们的M3U8新地址,大多都是在阿里上的。虽然这些也能用,但是毕竟可能会有一种期限,我们不能保证它在任何时候都能够访问,失效了也说不定对吧?所以我们去下载CCTV的视频是最好的。
现在就给大家推荐一个解析网站,当然它不提供存储,仅仅是解析罢了
我们可以看到的是,我们已经打开了我们的网页了,然后我们直接输入这样的网址https://tv.cctv.com/live/cctv10/
,点击开始我们可以看到这样的界面
点击最新的日期,我们会看到这样的东西
我们再随便点击一个试一下,就会发现这样的链接
原来这就是最后的链接,原来这就是最终的东西
于是我们将这个东西发到我们的地址栏中进行测试,没想到真的成功了呀!
于是我们再次看一下我们的视频,都是五分钟的视频,那么也就说我们一个小时之中就有十二个小片段,那么这样子我们就可以开展爬取了。
那我们就开始咯,我们再来看一看这里边的延迟,我现在的时间是九点十三分
那么如果这样算的话,我们的视频应该是在002这样的节点上
果然证明我们的猜想,这是可以播放的。那么我们再试一试003呢?
由于我现在本地时间已经到十七分了,所以我们尝试004,发现果然无法访问,那么就是说我们可能会有十分钟的延迟
然后我们开始要我们在分钟的片段上面进行研究,于是就可以写出这样的IF语句,我们为了各种情况都做出了充足的准备!
我们这个时候打印以下这个self.section_all这个对象,如果可以出现当时候的数字编码的话就证明我们逻辑成功了
import time
# 定义一个StreamIng类
class StreamIng():
def __init__(self,num):
self.num = num
# 开始运行程序
self.get_local_time()
def get_local_time(self):
# 获取转换后的时间戳
localtime = time.localtime()
# print(localtime)
# 获取现在的年,月,日,小时,分钟
self.year = time.strftime("%Y",localtime)
self.month = time.strftime("%m",localtime)
self.day = time.strftime("%d",localtime)
self.hour = time.strftime("%H",localtime)
self.minute = time.strftime("%M",localtime)
# 获取分段的片段
section = int(int(self.minute) / 5)
# print(section)
# 如果当时间不超过05分时,播放上一时刻视频
if section == 0:
self.hour = int(self.hour)-1
self.section_all = "012"
# 如果时间不超过50分,播放本时刻00段视频
elif section < 10:
self.section_all = "00"+ str(section)
# 播放0段视频
else:
self.section_all = "0"+ str(section)
print(self.section_all)
StreamIng(10)
接下来我们就要来使用FFplay来播放视频了,逻辑十分简单。首先我们先要下载FFplay这个模块,大家可以直接到FFmpeg官网下载,也可以使用我在这里提供给大家的直接解压使用的,点击下载
然后将我们的FFpay这个放在和代码文件同一目录当中
def play_stream_video(self):
path = 'http://cntv.vod.cdn.myqcloud.com/flash/live_back/nettv_cctv'+str(self.num)+"/cctv"+str(self.num)+"-"+str(self.year)+"-"+str(self.month)+"-"+str(self.day)+"-"+str(self.hour)+"-"+str(self.section_all)+".mp4"
print(path)
# 使用FFplay播放视频
os.popen("ffplay -i "+path)
这是我们拼接视频的代码,然后我们直接使用FFplay进行播放
于是我们就可以播放了
我们接下来就是要开始进行直播的逻辑分析了,我们现在的想法是播放完一个视频,然后立马去播放下一个视频。这是我们的一个思路,但是我们该如何实现呢?
我们再来一个循环,这是一个无限循环,循环的时间是5分钟那么也就是300秒
import time
import os
import requests
# 定义一个StreamIng类
class StreamIng():
def __init__(self,num):
self.num = num
# 开始运行程序
self.get_local_time()
def get_local_time(self):
# 获取转换后的时间戳
localtime = time.localtime()
# print(localtime)
# 获取现在的年,月,日,小时,分钟
self.year = time.strftime("%Y",localtime)
self.month = time.strftime("%m",localtime)
self.day = time.strftime("%d",localtime)
self.hour = time.strftime("%H",localtime)
self.minute = time.strftime("%M",localtime)
# 获取分段的片段
section = int(int(self.minute) / 5)
# print(section)
# 如果当时间不超过05分时,播放上一时刻视频
if section == 0:
self.hour = int(self.hour)-1
self.section_all = "012"
# 如果时间不超过50分,播放本时刻00段视频
elif section < 10:
self.section_all = "00"+ str(section)
# 播放0段视频
else:
self.section_all = "0"+ str(section)
# print(self.section_all)
self.play_stream_video()
def play_stream_video(self):
self.path = 'http://cntv.vod.cdn.myqcloud.com/flash/live_back/nettv_cctv'+str(self.num)+"/cctv"+str(self.num)+"-"+str(self.year)+"-"+str(self.month)+"-"+str(self.day)+"-"+str(self.hour)+"-"+str(self.section_all)+".mp4"
# print(path)
# -window_title : 设置窗口标题
self.window_title = "CCTV"+str(self.num)+"直播播放"+str(self.hour)+str(self.section_all)+".mp4"
# -autoexit : 播放完成后自动退出
# 使用FFplay播放视频
os.popen("ffplay "+" -window_title "+self.window_title+" -autoexit "+self.path)
if __name__ == '__main__':
while True:
StreamIng(10)
time.sleep(300)
我们的程序就大致完工了,这是不是很好呢?
这个我还真不知道怎么弄,主要是我本地也没有这样的环境,没有时间去操作,所以这就只能是遗憾了。我在这里呢就介绍一下下载的代码,其实很简单
我们获取地址,然后我们再获取,然后再写入文件,那么就成功了
import time
import os
import requests
# 定义一个StreamIng类
class StreamIng():
def __init__(self,num):
self.num = num
# 开始运行程序
self.get_local_time()
def get_local_time(self):
# 获取转换后的时间戳
localtime = time.localtime()
# print(localtime)
# 获取现在的年,月,日,小时,分钟
self.year = time.strftime("%Y",localtime)
self.month = time.strftime("%m",localtime)
self.day = time.strftime("%d",localtime)
self.hour = time.strftime("%H",localtime)
self.minute = time.strftime("%M",localtime)
# 获取分段的片段
section = int(int(self.minute) / 5)
# print(section)
# 如果当时间不超过05分时,播放上一时刻视频
if section == 0:
self.hour = int(self.hour)-1
self.section_all = "012"
# 如果时间不超过50分,播放本时刻00段视频
elif section < 10:
self.section_all = "00"+ str(section)
# 播放0段视频
else:
self.section_all = "0"+ str(section)
# print(self.section_all)
self.play_stream_video()
def play_stream_video(self):
self.path = 'http://cntv.vod.cdn.myqcloud.com/flash/live_back/nettv_cctv'+str(self.num)+"/cctv"+str(self.num)+"-"+str(self.year)+"-"+str(self.month)+"-"+str(self.day)+"-"+str(self.hour)+"-"+str(self.section_all)+".mp4"
# print(path)
# -window_title : 设置窗口标题
self.window_title = "CCTV"+str(self.num)+"直播播放"+str(self.hour)+str(self.section_all)+".mp4"
# -autoexit : 播放完成后自动退出
# 使用FFplay播放视频
os.popen("ffplay "+" -window_title "+self.window_title+" -autoexit "+self.path)
self.download_video()
def download_video(self):
video = requests.get(self.path)
with open("./"+self.window_title,"wb+")as video_write:
video_write.write(video.content)
video_write.close()
if __name__ == '__main__':
while True:
StreamIng(10)
time.sleep(300)
如果播放有问题,那么我们就直接下载
这样我们解析CCTV的直播就OK了
博客在2021年5月16日首发自CSDN,如需转载,请附上原文链接:无法找到CCTV直播MP4地址?七十行代码,简单使用FFplay直接观看还是下载CCTV栏目都轻松搞定(Python利用FLVCD硕鼠解析CCTV直播,FFplay播放并下载视频)