前段时间,接到一个需求,要求下载某一个网站的视频,然后自己从网上查阅了相关的资料,在这里做一个总结。

1. m3u8文件

m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求,是现在比较流行的一种加载方式。目前,很多新闻视频网站都是采用这种模式去加载视频。

M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。原视频数据分割为很多个TS流,每个TS流的地址记录在m3u8文件列表中。

下面就是m3u8文件的格式。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:15
#EXTINF:6.916667,
out000.ts
#EXTINF:10.416667,
out001.ts
#EXTINF:10.416667,
out002.ts
#EXTINF:1.375000,
out003.ts
#EXTINF:1.541667,
out004.ts
#EXTINF:7.666667,
out005.ts
#EXTINF:10.416667,

2. ts文件处理

  • 只有m3u8文件,需要下载ts文件
  • ts文件能正常播放,但太多而小,需要合并 有ts文件
  • 但因为被加密无法播放,需要解码

在这里我只记录下前两个步骤,因为,我目前研究的比较少,还没有遇到ts被加密的情况。

3. 分析举例

那么下面,我就正式举一个网站,第一财经网(直接点击)跟大家正式的讲解下。

这是该网站的视频。如下图:

点击第一个视频,这就是我们这次要爬取的视频。

然后鼠标右键点击,选择"检查" 或者按F12键,进入开发者模式,查看网页代码。
然后,点击Network ,再点击other,寻找请求地址中带有m3u8和ts标记的请求地址。

不懂,请看下图。有一点,很重要。网站通过切割后ts加载视频,并不是没有规律的,而是通过m3u8文件附带的。也就说,网站一定是先加载m3u8文件,然后根据m3u8文件,去请求ts文件。所以,如果你找不到m3u8文件的话,你可以先找第一个ts文件,然后往上面翻,一定能找到m3u8文件。

再点击这个m3u8文件,右侧对应的就是它的请求地址。

请求地址如下:

https://ycalvod.yicai.com/record/live/cbn/ca233887-1443-4bdf-b762-3b4b3a217085_LD.m3u8?auth_key=1575703722-0-0-6f09e9a156491f027a035e31c238c48c&ycfrom=yicaiwww

你可以把上面那个地址,输入浏览器地址框内,下载下来。也可以通过查看源码,找到该功能的对应的html代码。

这是下载下来的m3u8文件。


从图片可以看出来,每一个ts文件都是相对的地址,所以下面我们就需要找到绝对地址。

ts文件地址如下:

https://ycalvod.yicai.com/record/live/cbn_yld/1575111614_3446078.ts

上面,我们已经把这个网站的视频加载模式分析的很透彻,下面就开始撸代码了。

4. 获取ts文件

def getTsUrl():ts_url_list = []baseUrl = "https://ycalvod.yicai.com/record/live"with open("ca233887-1443-4bdf-b762-3b4b3a217085_LD.m3u8", "r", encoding="utf-8") as f:m3u8Contents = f.readlines()for content in m3u8Contents:if content.endswith("ts\n"):ts_Url = baseUrl + content.replace("\n", "").replace("..", "")ts_url_list.append(ts_Url)print(ts_Url)return ts_url_list

5. 下载ts文件

def download_ts_video(download_path, ts_url_list):download_path = r"C:\Users\Administrator\Desktop\AiShu\下载视频\TS视频"for i in range(len(ts_url_list)):ts_url = ts_url_list[i]try:response = requests.get(ts_url, stream=True, verify=False)except Exception as e:print("异常请求:%s" % e.args)returnts_path = download_path + "\{}.ts".format(i)with open(ts_path, "wb+") as file:for chunk in response.iter_content(chunk_size=1024):if chunk:file.write(chunk)print("TS文件下载完毕!!")

这就是我本地下载好的ts切割视频

6. 合并TS视频

def heBingTsVideo(download_path,hebing_path):all_ts = os.listdir(download_path)with open(hebing_path, 'wb+') as f:for i in range(len(all_ts)):ts_video_path = os.path.join(download_path, all_ts[i])f.write(open(ts_video_path, 'rb').read())print("合并完成!!")

最后的结果如下:

7. 完整的代码

有兴趣的小伙伴,可以研究下。

import requests,os
def getTsUrl():ts_url_list = []baseUrl = "https://ycalvod.yicai.com/record/live"with open("ca233887-1443-4bdf-b762-3b4b3a217085_LD.m3u8", "r", encoding="utf-8") as f:m3u8Contents = f.readlines()for content in m3u8Contents:if content.endswith("ts\n"):ts_Url = baseUrl + content.replace("\n", "").replace("..", "")ts_url_list.append(ts_Url)print(ts_Url)return ts_url_listdef download_ts_video(download_path, ts_url_list):download_path = r"C:\Users\Administrator\Desktop\AiShu\下载视频\TS视频"for i in range(len(ts_url_list)):ts_url = ts_url_list[i]try:response = requests.get(ts_url, stream=True, verify=False)except Exception as e:print("异常请求:%s" % e.args)returnts_path = download_path + "\{}.ts".format(i)with open(ts_path, "wb+") as file:for chunk in response.iter_content(chunk_size=1024):if chunk:file.write(chunk)print("TS文件下载完毕!!")def heBingTsVideo(download_path,hebing_path):all_ts = os.listdir(download_path)with open(hebing_path, 'wb+') as f:for i in range(len(all_ts)):ts_video_path = os.path.join(download_path, all_ts[i])f.write(open(ts_video_path, 'rb').read())print("合并完成!!")if __name__ == '__main__':download_path = r"C:\Users\Administrator\Desktop\AiShu\下载视频\TS视频"hebing_path = r"C:\Users\Administrator\Desktop\AiShu\下载视频\合并TS视频\第一财经.mp4"ts_url_list = getTsUrl()download_ts_video(download_path, ts_url_list)heBingTsVideo(download_path,hebing_path)

Python通过m3u8文件下载合并ts视频相关推荐

  1. python合并ts视频_python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频

    最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 "一出好戏" . ...

  2. python合并ts视频(三种方法)

    前言:最近在爬取某个网站的视频,但是里面的视频数据是以ts文件的形式给出的.一个大的视频被切分成了很多小的ts视频,所以,合并这些ts视频就成为必要的了.我在网上搜到了三种方法,现在整理出来分享给大家 ...

  3. 用qt合并ts视频文件

    一般来说视频app离线缓冲的视频都是TS格式的,并且是多个文件碎片的形式,通过播放列表进行播放.如果想在其他平台看视频就不太容易了,因此做了个小程序,把这些碎片化的视频文件合并成一个文件. win10 ...

  4. Win10 使用python和ffmpeg批量合并音视频

    将m4a文件和mp4文件合并为MP4 具体代码如下 import os,sys import io import subprocess #在vscode运行时输出内容含中文不乱码,其他软件运行未知 s ...

  5. m3u8文件下载合并的一种方法

    现在很多视频网站都把整个视频文件拆分成一个个视频流文件(ts),这些视频流文件的下载地址会放在一个文件中,通常叫做*.m3u8. 我们要想下载整个视频文件可以先把这些视频片段下载下来,然后进行拼接,合 ...

  6. Python解析m3u8拼接下载mp4视频文件

    一.关于m3u8: m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I ...

  7. 批处理命令html文件合并,cmd命令行无损合并批处理TS视频文件

    有时,当我们从Internet下载一些视频文件时,我们发现某些视频格式为.ts格式,并且被分成N个以上的小文件. 特别是,某些视频以.ts格式(MPEG2-TS流)播放. 因此,如果要下载此视频,则需 ...

  8. m3u8格式下载合并mp4视频

    m3u8解析.ts视频块解密合并mp4 今天客户有个批量下载视频得需求.拿到链接一顿分析.发现视频是m3u8文件分块.然后有KEY加密.aes-128 下面开始处理流程: 1 先取出key链接.这里得 ...

  9. m3u8.sqlite文件转视频工具(开源免费)

    m3u8.sqlite文件转视频工具(开源免费) 我个人在txkt有相关课程,但是想下载下来放在离线设备上看.但是发现txkt的app下载下来的文件是m3u8.sqlite.然后就在网上找解密转码工具 ...

最新文章

  1. runtime系统的Cello
  2. 一个“退学生”到CTO的逆袭之路
  3. AI在医疗行业的最新进展
  4. 从配置文件到分布式配置管理QConf
  5. 释放skb buffer指针引出的指针传递问题
  6. c语言算法竞赛入门经典百度云,《算法竞赛入门经典》CH-2(C语言)
  7. ER TO SQL语句
  8. ‘cnpm‘ 不是内部或外部命令,也不是可运行的程序
  9. 常量与变量的区别(详细说明)(学习笔记3--变量与常量)
  10. 征服Java面试官!mysql索引树结构
  11. Dalvik 虚拟机操作码
  12. php的数组操作,PHP的数组操作
  13. Git学习系列之Debian或Ubuntu上安装Git详细步骤(图文详解)
  14. HTML:内存溢出和内存泄漏
  15. key-list类型内存数据引擎介绍及使用场景
  16. /bin/sh: 1: tclsh: not found
  17. JAVA获取汉字拼音首字母
  18. html 圣诞节贺卡模板,圣诞节立体贺卡模板大全
  19. 高效能人士的七个习惯及亚马逊十四条领导力准则
  20. python对象不可订阅_python - TypeError:'int'对象不可订阅 - 尝试创建csv文件时 - SO中文参考 - www.soinside.com...

热门文章

  1. 第十一课:磁场和洛伦兹力
  2. idea中打开maven的setting.xml
  3. 极简Python语法(5)
  4. Javaweb_文件上传
  5. pytonh mysql_python操作Mysql实例代码教程(查询手册)
  6. 腾讯云服务器nginx安装配置
  7. 短视频询盘获客系统/源码搭建
  8. 计算机考研专业课各题分占比,考研计算机常见的6个问题!
  9. 基于爱奇艺HCDN视频分发网络的开放缓存
  10. VMware安装centos7