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 相关文章推荐
浅谈Python中带_的变量或函数命名
Dec 04 Python
Python3实现的简单验证码识别功能示例
May 02 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
Python绘图实现显示中文
Dec 04 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
Python的property属性详细讲解
Apr 11 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学习教程之5种内置行为类详解
2017/08/03 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
JS百度地图搜索悬浮窗功能
2017/01/12 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
一篇文章快速了解Python的GIL
2018/01/12 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
Python实现ping指定IP的示例
2018/06/04 Python
python实现汽车管理系统
2018/11/30 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
为什么要用EJB
2014/04/17 面试题
寄语十八大感言
2014/02/07 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
公司董事长岗位职责
2014/06/08 职场文书
白莲教口号
2014/06/18 职场文书
最美护士演讲稿
2014/08/27 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
怎样写辞职信
2015/02/27 职场文书
党支部意见范文
2015/06/02 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
关于EntityWrapper的in用法
2022/03/22 Java/Android