Python解析m3u8拼接下载mp4视频文件的示例代码


Posted in Python onMarch 03, 2021

一、关于m3u8:

m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求。

示例:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:9,
http://data.video.iqiyi.com/videos/vts/20210301/69/b8/73ad4ef04fde4586ef2799ecd67241ce.ts?qypid=2645242154145600_04000000001000000000_96&start=496696&end=779448&contentlength=282752&sd=20200&qdv=1&qd_uid=0&qd_tvid=2645242154145600&qd_vip=0&qd_src=02029022240000000000&qd_tm=1614590393988&qd_ip=0&qd_p=0&qd_k=4eb685f1966cbd08e6a9648fe0b8c007&ve=&sgti=&dfp=&qd_sc=f9a4f133a622871b6739734615ef178d
#EXTINF:9,
http://data.video.iqiyi.com/videos/vts/20210301/69/b8/73ad4ef04fde4586ef2799ecd67241ce.ts?qypid=2645242154145600_04000000001000000000_96&start=779448&end=1008432&contentlength=228984&sd=29200&qdv=1&qd_uid=0&qd_tvid=2645242154145600&qd_vip=0&qd_src=02029022240000000000&qd_tm=1614590393988&qd_ip=0&qd_p=0&qd_k=4eb685f1966cbd08e6a9648fe0b8c007&ve=&sgti=&dfp=&qd_sc=f9a4f133a622871b6739734615ef178d
#EXTINF:9,
http://data.video.iqiyi.com/videos/vts/20210301/69/b8/73ad4ef04fde4586ef2799ecd67241ce.ts?qypid=2645242154145600_04000000001000000000_96&start=5934408&end=6141020&contentlength=206612&sd=198733&qdv=1&qd_uid=0&qd_tvid=2645242154145600&qd_vip=0&qd_src=02029022240000000000&qd_tm=1614590393988&qd_ip=0&qd_p=0&qd_k=4eb685f1966cbd08e6a9648fe0b8c007&ve=&sgti=&dfp=&qd_sc=f9a4f133a622871b6739734615ef178d
#EXT-X-ENDLIST

预览器打开会出现下载ts文件

Python解析m3u8拼接下载mp4视频文件的示例代码

我们想要的mp4文件就是一个个ts文件按照顺序拼接成的,废话不多说直接上代码。

# -*- coding:utf-8 -*- 
"""
Author:SPIDERMAN
Time: 2021/3/1 
Software: PyCharm
"""
import logging
import os
from glob import iglob
import requests
import m3u8
from urllib.parse import urljoin
from concurrent.futures import ThreadPoolExecutor
from natsort import natsorted

class M3u8Download:
 def __init__(self,m3u8_url):
  self.m3u8_url = m3u8_url
  self.headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
  }
  self.threadpool = ThreadPoolExecutor(max_workers=10)
  self.file_name = 'weibo.mp4'
  logging.basicConfig(format='[%(asctime)s][*%(levelname)s]:%(message)s',
       level=logging.INFO)
 def get_ts_url(self,m3u8_url):
  """
  解析ts_url
  :param m3u8_url:
  :return:
  """
  m3u8_obj = m3u8.load(m3u8_url)
  base_uri = m3u8_obj.base_uri
  logging.info('[*]get_base_uri'+base_uri)
  for seg in m3u8_obj.segments:
   yield urljoin(base_uri, seg.uri)

 def download__ts(self, urlinfo):
  """
  下载ts文件
  :param urlinfo:
  :return:
  """
  url, ts_name = urlinfo
  res = requests.get(url, headers=self.headers)
  with open(ts_name, 'wb') as fp:
   fp.write(res.content)
  logging.info('[*download]'+ts_name)


 def download_all_ts(self):
  """
  下载所有函数
  :return:
  """
  ts_urls = self.get_ts_url(self.m3u8_url)
  logging.info('[*download]download:'+self.m3u8_url)
  for index, ts_url in enumerate(ts_urls):
   print(ts_url)
   self.threadpool.submit(self.download__ts, [ts_url, f'{index}.ts'])
  self.threadpool.shutdown()

 def remove_ts(self,ts_path):
  """
  删除ts文件
  :param ts_path:
  :return:
  """
  for ts in iglob(ts_path):
   os.remove(ts)
  logging.info('[*remove]remove all *.ts')

 def run(self):
  self.download_all_ts()
  ts_path = '*.ts'
  all_ts = iglob(ts_path)
  with open(self.file_name, 'wb') as fn:
   #根据ts排序
   for ts in natsorted(all_ts):
    #读ts写mp4
    with open(ts, 'rb') as ft:
     scline = ft.read()
     fn.write(scline)
  self.remove_ts(ts_path)

if __name__ == '__main__':
 m3u8Download = M3u8Download('https://cache.m.iqiyi.com/mus/1618469868576801/a34fec3fc63db2c1bb4c15f53cd513e1/afbe8fd3d73448c9/0/20210301/69/b8/670962cfd6b9166c87a21728808fe6a2.m3u8?qd_originate=tmts_py&tvid=2645242154145600&bossStatus=0&qd_vip=0&px=&src=02029022240000000000&prv=&previewType=&previewTime=&from=&qd_time=1614590979725&qd_p=0&qd_asc=636bb14ab52facec684335546d2d60ec&qypid=2645242154145600_04000000001000000000_96&qd_k=4eb685f1966cbd08e6a9648fe0b8c007&isdol=0&code=2&ff=f4v&iswb=1&vf=2198359907d7f173fed0b6eabca18b29&np_tag=nginx_part_tag&pt_sc=d855f47d523c5a4fab67f5b10be3c475&pt=180&pt_tag_tm=1614590979827')
 m3u8Download.run()

console.log("公众号:Java技术迷")
console.log("wx:spiderskill")

到此这篇关于Python解析m3u8拼接下载mp4视频文件的文章就介绍到这了,更多相关Python下载mp4视频文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
python使用append合并两个数组的方法
Apr 28 Python
python删除列表内容
Aug 04 Python
简单谈谈python中的多进程
Nov 06 Python
解读python logging模块的使用方法
Apr 17 Python
自学python的建议和周期预算
Jan 30 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
python字符串反转的四种方法详解
Dec 02 Python
Python logging日志库空间不足问题解决
Sep 14 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
python游戏开发之pygame实现接球小游戏
Apr 22 Python
python和opencv构建运动检测器的实现
Mar 03 #Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 #Python
详解python第三方库的安装、PyInstaller库、random库
Mar 03 #Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 #Python
对Pytorch 中的contiguous理解说明
Mar 03 #Python
Flask中jinja2的继承实现方法及实例
Mar 03 #Python
基于PyTorch中view的用法说明
Mar 03 #Python
You might like
Yii2 输出xml格式数据的方法
2016/05/03 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
使用JavaScript破解web
2018/09/28 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
代码详解django中数据库设置
2019/01/28 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
django的ORM操作 增加和查询
2019/07/26 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
Linux Interview Questions For software testers
2013/05/17 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
劳资专员岗位职责
2013/12/27 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
交通事故私了协议书
2014/04/16 职场文书
企业承诺书格式
2014/05/21 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python