无法找到CCTV直播MP4地址?七十行代码,简单使用FFplay直接观看还是下载CCTV栏目都轻松搞定(Python利用FLVCD硕鼠解析CCTV直播,FFplay播放并下载视频)

我们在每天使用新闻的时候大都会以CCTV发布的新闻为准,我们的每天新闻收视率最高的还是我们的总台,大家闲来无事可能也会看一下央视网提供视频直播吧,看看还可以,但是我们可以发现我们完全解析不了,大家看一看便知道了

错误演示

打开CCTV直播,我们会看到当前直播的栏目CCTV直播
我们可以通过抓包软件直接获取直播的地址
在这里插入图片描述
这不是特别容易吗?一下就可以获取到我们的真实地址了呀!
WAIT,我们先去解析一下我们的代码

在这里插入图片描述
可是,当我们在PotPlayer里面打开之后发现,我们预期出现的画面并没有出来。那么这种情况肯定就是CCTV进行播放加密了。那我们该如何处理这种问题呢?
在这里插入图片描述
我们先尝试着把这四个播放地址全部播放一遍,说不定可以呢?

名称地址
index.m3u8https://cctvcncw.v.wscdns.com/live/cctv1_1/index.m3u8?adapt=0&BR=pub
index.m3u8https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1/index.m3u8
cdrmcctv1_1_md.m3u8https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_md.m3u8
cdrmcctv1_1_td.m3u8https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_td.m3u8

我们一个一个尝试一下,尝试如下表所示

名称地址是否成功显示页面
index.m3u8https://cctvcncw.v.wscdns.com/live/cctv1_1/index.m3u8?adapt=0&BR=pub
index.m3u8https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1/index.m3u8
cdrmcctv1_1_md.m3u8https://cctvtxyh5c.liveplay.myqcloud.com/live/cdrmcctv1_1_md.m3u8
cdrmcctv1_1_td.m3u8https://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)

Windows的伙伴们

接下来我们就要来使用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播放并下载视频)

ffmpeg是一个开源的跨平台音视频处理工具,ffplay则是ffmpeg项目中的一个简单实用的音视频播放器。下面是对ffmpegffplay源码的简要解析ffmpeg源码结构复杂,其中最核心的模块是libavcodec和libavformat,分别负责音视频编解码和封装格式处理。在ffmpeg源码中,可以找到大量针对各种编码标准(如H.264、AAC等)的编解码算法实现,以及支持各种封装格式(如MP4FLV等)的封装和解封装算法。 ffplay则是使用ffmpeg库实现的一个命令视频播放器。源码中主要包含以下几个模块:主函数模块、基础数据结构模块、事件处理模块、音视频渲染模块等。主函数模块是整个程序的入口,它完成了程序的初始化、命令参数解析视频播放器的创建等工作。基础数据结构模块包含了几个重要的结构体,如视频帧结构体、音频帧结构体等,用于保存解码后的音视频数据。事件处理模块负责监听和处理用户的输入事件,如鼠标点击、键盘输入等。音视频渲染模块则是使用底层的音视频渲染库来将解码后的音视频数据进播放。 在解析ffplay源码时,需要了解ffmpeg中的音视频解码和渲染原理,以及常见的音视频编码标准和封装格式。同时也需要了解音视频播放相关的基本概念和原理,如音频采样率、视频帧率等等。通过仔细阅读源码,可以了解到ffplay是如何使用ffmpeg库进视频解码、数据处理和渲染的。同时,源码中也包含了一些音视频播放器的基本功能实现,如播放、暂停、快进、倍速播放等。 综上所述,ffmpeg是一个功能强大的音视频处理工具,ffplay则是基于ffmpeg库实现的一个简单实用的音视频播放器。通过仔细阅读ffmpegffplay的源码,可以深入了解音视频处理和播放的原理和实现方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地摊主老袁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值