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 相关文章推荐
web.py获取上传文件名的正确方法
Aug 26 Python
浅谈Python中的数据类型
May 05 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
python递归法解决棋盘分割问题
Jul 17 Python
Django之模板层的实现代码
Sep 09 Python
Python程序控制语句用法实例分析
Jan 14 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
python实现梯度下降法
Mar 24 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
python归并排序算法过程实例讲解
Nov 04 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
pytorch 使用半精度模型部署的操作
May 24 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
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
2010/06/04 PHP
解析php常用image图像函数集
2013/06/24 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
js实现聊天对话框
2020/02/08 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
pytorch多GPU并行运算的实现
2019/09/27 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
前台文员的岗位职责
2013/11/14 职场文书
仓管岗位职责范本
2014/02/08 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
导游词之青城山景区
2019/09/27 职场文书