辽阳专业建设网站公司,做的好的响应式网站,网站备案号注销的结果,做网站优化最快的方式文章目录 前言 一、演示 二、查找网页视频流的索引文件 三、分析视频流的url和视频流索引文件的差异性 四、判断视频数据是否需要转化为ts 五、判断视频是否被加密#xff0c;如若被加密#xff0c;需要先解密 六、合并所有的ts视频#xff0c;以MP4模式输出完整视频 总结 前… 文章目录 前言 一、演示 二、查找网页视频流的索引文件 三、分析视频流的url和视频流索引文件的差异性 四、判断视频数据是否需要转化为ts 五、判断视频是否被加密如若被加密需要先解密 六、合并所有的ts视频以MP4模式输出完整视频 总结 前言 目的将网站上的m3u8视频下载到本地-----仅娱乐使用 流程 通过网页调试模式获取网页视频流的索引文件分析视频流的url和视频流索引文件的差异性通过视频流的url下载视频数据至本地判断视频数据是否需要转化为ts判断视频是否被加密如若被加密需要先解密合并所有的ts视频以MP4模式输出完整视频 一、演示 二、查找网页视频流的索引文件 F12调试模式后找到该文件双击后可直接下载视频索引文件其中存在视频片段的部分url或者完整url User-Agent 用户代理查询 代码实现如下
# 视频索引文件下载网址
m3u8_url https://v.gsuus.com/play/PdyY7qzd/index.m3u8
# User-Agent 即用户代理在网站中可以查询
hea Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0
user_agent_list [# 在这里可以写多个headers然后随机选一个进行访问这样可以防止频繁访问ip被封hea,]
headers {user-agent: random.choice(user_agent_list),Connection: close,
}resp requests.get(m3u8_url, headers, verifyFalse)
data resp.text
print(data) 三、分析视频流的url和视频流索引文件的差异性 通过分析视频流的地址来下载所有的片段视频 代码实现如下
# 视频文件下载网址
url_dow https://gs.gszyi.com:999/hls/499/20241002/2923112/plist0.ts# User-Agent 即用户代理在网站中可以查询
hea Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0
user_agent_list [# 在这里可以写多个headers然后随机选一个进行访问这样可以防止频繁访问ip被封hea,]
headers {user-agent: random.choice(user_agent_list),Connection: close,
}# url_dow下载ts视频文件的url
# headers自定义 HTTP 请求头
# timeout请求超时时间设置
res requests.get(url_dow, headers,timeout20)save_path 000.ts
# 判断页面是否正确
if res.status_code 200:data res.content# 以二进制模式打开文件写入二进制数据with open(save_path, wb) as f:f.write(data)f.flush()print(视频{}下载完毕.format(save_path)) 四、判断视频数据是否需要转化为ts 视频为ts格式则不需要进行转化如若是其他格式比如jpegjpg格式则需要转化为ts格式即是重命名文件名称用该功能函数即可实现 os.rename() 。 五、判断视频是否被加密如若被加密需要先解密 如若显示该key网址url则表示视频被加密一般所有视频都只有一个key但也有例外有些视频每个片段都会进行加密目前还在研究如何解决不过也够用了嘿嘿。 前面下载的视频打开便会显示错误则就是说明视频需要解密。注意某些情况下可能解密后视频依然无法正常打开造成原因可能是解密方法不对或者下载视频数据异常。
代码实现如下
from Crypto.Cipher import AES# 解密ts视频
def jiemi(src,dec,key):# src要解密的文件 dec解密后的文件 key、iv 从m3u8可见try:# 以二进制格式打开已下载的ts文件with open(src, rb) as f1:# 读取文件数据part f1.read() # key密钥的长度等于IV的向量长度if len(key) 16: IVb0000000000000000elif len(key) 32: IVb00000000000000000000000000000000# 解密数据cipher AES.new(key, AES.MODE_CBC,IV) plain_data cipher.decrypt(part)if part:# 创建新文件with open(dec, wb) as f2:# 将解密后的数据写入到创建的新文件中f2.write(plain_data) print(解密成功) except Exception as error:print(src)print(错误异常%s % error )print(原始异常信息{}.format(traceback.format_exc())) # 返回异常信息# src要解密的文件 dec解密后的文件 key、iv 从m3u8可见src 000.tsdec 111.ts# key文件中读取key qG6ikBmMJpJGNulz# 需要将key和iv转换为字节形式的数据key bytes(key, encodingutf-8)jiemi(src,dec,key)
实例演示 六、合并所有的ts视频以MP4模式输出完整视频 前置条件 1、需要配置ffmpeg 的运行环境【可以自行下载或者我的资源中也有安装包】 2、下载ffmpeg 完成后配置环境变量即可。 使用该命令合并视频 #file_names_file表示所有ts文件的路径 #output.mp4 输出视频名称 os.system(fffmpeg -f concat -safe 0 -i {file_names_file} -c copy output.mp4) 所以合并视频之前我们需要将file_names_file文件创造出来否则执行合并命令会失败
如下图所示这里就不写代码实现了思路就是将存放视频流的文件目录列出来然后判断是否为视频文件并将对应的路径写入到txt文件内即可。 然后我们有了这个file_names_file文件后便可直接运行合并命令视频流必须完整视频流必须与文件内的视频路径对应否则会执行失败
代码实现如下
import threading
def getvideo():# 3.2 大量 ts 文件file_names_file video.txtos.system(fffmpeg -f concat -safe 0 -i {file_names_file} -c copy output.mp4)# os.remove(file_names_file)t threading.Thread(targetgetvideo)
t.start()
t.join()
print(视频合并结束)
总结
至此整个流程完结可以下载到我们需要的视频了说实话比在网站上看要快不少还是比较有趣的。
并且请求频繁会导致资源请求失败这个也要考虑我用的是多线程速度很快所以加入了获取资源失败时会重新获取资源至少不会漏掉视频资源。
网页请求失败的话则是表示网站拒绝你的访问这个问题还待解决不解决也足够使用了反正自己使用即可。
后续完善整个工具目前只实现单个视频下载后续完成多个视频下载....