什么是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,

ts 文件一般怎么处理

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

本篇文章处理第1和第2条内容,加密部分跳过。

上面我提供的ts文件中并没有加密,也就是没有关键字key ,下载ts文件之后直接合并即可

ts文件路径获取

由于上面的m3u8文件中所有的ts文件都是相对地址,所以需要依据上篇博客中获取到的链接

{'url': 'https://videos5.jsyunbf.com/2019/02/07/iQX7y3p1dleAhIv7/playlist.m3u8', 'ext': 'dplay', 'msg': 'ok', 'playertype': None}

其中前面的部分是ts的播放地址的前缀地址


# https://videos5.jsyunbf.com/2019/02/07/iQX7y3p1dleAhIv7/out005.ts
import datetime
import requests
# m3u8是本地的文件路径
def get_ts_urls(m3u8_path,base_url):
urls = []
with open(m3u8_path,"r") as file:
lines = file.readlines()
for line in lines:
if line.endswith(".ts\n"):
urls.append(base_url+line.strip("\n")) return urls

ts文件下载

所有的路径读取完毕之后,需要对ts文件进行下载,文件的下载办法很多

def download(ts_urls,download_path):
for i in range(len(ts_urls)):
ts_url = ts_urls[i]
file_name = ts_url.split("/")[-1]
print("开始下载 %s" %file_name)
start = datetime.datetime.now().replace(microsecond=0)
try:
response = requests.get(ts_url,stream=True,verify=False)
except Exception as e:
print("异常请求:%s"%e.args)
return ts_path = download_path+"/{0}.ts".format(i)
with open(ts_path,"wb+") as file:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
file.write(chunk) end = datetime.datetime.now().replace(microsecond=0)
print("耗时:%s"%(end-start))

下载过程显示,表示下载成功,剩下的就是拼网速的时候了。



下载完毕,是一大堆ts文件,记住,只要一个可以看,就可以合并了

合并ts文件

使用copy命令 如果不清楚,就去百度即可

copy/b D:\newpython\doutu\sao\ts_files\*.ts d:\fnew.ts

代码合并

import os
from os import path
def file_walker(path):
file_list = []
for root, dirs, files in os.walk(path): # 生成器
for fn in files:
p = str(root+'/'+fn)
file_list.append(p) print(file_list)
return file_list def combine(ts_path, combine_path, file_name):
file_list = file_walker(ts_path)
file_path = combine_path + file_name + '.ts'
with open(file_path, 'wb+') as fw:
for i in range(len(file_list)): fw.write(open(file_list[i], 'rb').read()) if __name__ == '__main__':
#urls = get_ts_urls("playlist.m3u8","https://videos5.jsyunbf.com/2019/02/07/iQX7y3p1dleAhIv7/")
#download(urls,"./tsfiles")
combine("./ts_files","d:/ts","haha")

最终合并之后,形成一个ts文件,当然你还可以用软件把视频转换成mp4格式

也可以利用FFMPEG可以直接实现m3u8 转MP4

愉快的下载下来看VIP视频吧

备注部分

m3u8文件中的 m3u8标签与属性说明

#EXTM3U
每个M3U文件第一行必须是这个tag,请标示作用 #EXT-X-VERSION:3
该属性可以没有 #EXT-X-MEDIA-SEQUENCE:140651513
每一个media URI在PlayList中只有唯一的序号,相邻之间序号+1,
一个media URI并不是必须要包含的,如果没有,默认为0 #EXT-X-TARGETDURATION
指定最大的媒体段时间长(秒)。所以#EXTINF中指定的时间长度必须小于或是等于这
个最大值。这个tag在整个PlayList文件中只能出现一 次(在嵌套的情况下,一般有
真正ts url的m3u8才会出现该tag) #EXT-X-PLAYLIST-TYPE
提供关于PlayList的可变性的信息,这个对整个PlayList文件有效,是可选的,格式
如下:#EXT-X-PLAYLIST-TYPE::如果是VOD,则服务器不能改变PlayList 文件;
如果是EVENT,则服务器不能改变或是删除PlayList文件中的任何部分,但是可以向该
文件中增加新的一行内容。 #EXTINF
duration指定每个媒体段(ts)的持续时间(秒),仅对其后面的URI有效,title是
下载资源的url #EXT-X-KEY
表示怎么对media segments进行解码。其作用范围是下次该tag出现前的所有media
URI,属性为NONE 或者 AES-128。NONE表示 URI以及IV(Initialization
Vector)属性必须不存在, AES-128(Advanced EncryptionStandard)表示URI
必须存在,IV可以不存在。 #EXT-X-PROGRAM-DATE-TIME
将一个绝对时间或是日期和一个媒体段中的第一个sample相关联,只对下一个meida
URI有效,格式如#EXT-X-PROGRAM-DATE-TIME:
For example: #EXT-X-PROGRAM-DATETIME:2010-02-19T14:54:23.031+08:00 #EXT-X-ALLOW-CACHE
是否允许做cache,这个可以在PlayList文件中任意地方出现,并且最多出现一次,作
用效果是所有的媒体段。格式如下:#EXT-X-ALLOW-CACHE: #EXT-X-ENDLIST
表示PlayList的末尾了,它可以在PlayList中任意位置出现,但是只能出现一个,格
式如下:#EXT-X-ENDLIST

Python爬虫入门教程 51-100 Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作的更多相关文章

  1. Python爬虫入门教程 47-100 mitmproxy安装与安卓模拟器的配合使用-手机APP爬虫部分

    1. 准备下载软件 介绍一款爬虫辅助工具mitmproxy ,mitmproxy 就是用于MITM的proxy,MITM中间人攻击.说白了就是服务器和客户机中间通讯多增加了一层.跟Fiddler和Ch ...

  2. Python爬虫入门教程 37-100 云沃客项目外包网数据爬虫 scrapy

    爬前叨叨 2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒 数据分析 官方网址为 https://www.clouderwor ...

  3. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  4. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  5. Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy

    爬前叨叨 2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我 ...

  6. 2019-03-22 Python Scrapy 入门教程 笔记

    Python Scrapy 入门教程 入门教程笔记: # 创建mySpider scrapy startproject mySpider # 创建itcast.py cd C:\Users\theDa ...

  7. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  8. Python爬虫入门教程 50-100 Python3爬虫爬取VIP视频-Python爬虫6操作

    爬虫背景 原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过 ...

  9. Python爬虫入门教程 2-100 妹子图网站爬取

    妹子图网站爬取---前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情.希望可以做好. 为了写好爬虫,我们 ...

随机推荐

  1. Python使用Socket写一个简单聊天程序

    b2b模式的聊天工具 服务端: # 链接 while True: print('等待连接...') sock,adr = server_socket.accept() while True: try: ...

  2. Python中从SQL型数据库读写dataframe型数据

    Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将sql数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到sq ...

  3. com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定

    转自: http://blog.csdn.net/superdangbo/article/details/78732700 com.mysql.jdbc.Driver 和 com.mysql.cj.j ...

  4. 【Homework】LCA&RMQ

    我校是神校,作业竟然选自POJ,难道不知道“珍爱生命 勿刷POJ”么? 所有注明模板题的我都十分傲娇地没有打,于是只打了6道题(其实模板题以前应该打过一部分但懒得找)(不过感觉我模板还是不够溜要找个时 ...

  5. 国内第一本micropython的书出版《机器人Python极客编程入门与实战》

    第一本micropython的书<机器人Python极客编程入门与实战>. 购买地址:https://item.taobao.com/item.htm?spm=2013.1.w4018-1 ...

  6. Matlab实现画柱状图坐标标签旋转

    引言: 在用matlab画柱状图或者其他图的时候,你是否碰到下图这种情况: 乍一看这个柱状图画的有馍有洋的,but,仔细一看你会发现,横坐标标签如果再长一点就不好看啦,甚至会重叠,就像这样: 这样的图 ...

  7. Postman----基础使用篇(没有接口文档的情况下如何着手做接口测试)

    [备注说明]内文中的图片由于页面的限制,图片显示不清晰,为了能更加的看清图片,请点击"图片",点击"右键"选择"在新标签页中打开图片",可查 ...

  8. 从壹开始 [Admin] 之四 || NetCore + SignalR 实现日志消息推送

    缘起 哈喽大家周一好呀,感觉好久没有写文章了,上周出差了一次,感觉还是比坐办公室好的多,平时在读一本书<时生>,感兴趣的可以看看

  9. 【转】W3C中国与百度联合组织移动网页加速技术研讨会

    2017 年 8 月 30 日,W3C 会员百度在北京中关村软件园国际会议中心主办了 "移动网页加速技术研讨会",W3C 中国以及腾讯.阿里巴巴及 UC.搜狗.小米.傲游.中国移动 ...

  10. Scala 编码习惯

    1. 不用var.var是可以被不断修改的,而val是不能被修改的.使用val而不是var能让你的程序更强壮,bug更少,更好调试,更容易测试,在并发条件下,更容易调优而获得更好的性能.数学证明我们不 ...