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中的With语句
Feb 02 Python
Python NumPy库安装使用笔记
May 18 Python
python处理大数字的方法
May 27 Python
python相似模块用例
Mar 04 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
python向字符串中添加元素的实例方法
Jun 28 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
python logging 重复写日志问题解决办法详解
Aug 04 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
谈谈PHP语法(5)
2006/10/09 PHP
中英文字符串翻转函数
2008/12/09 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
自写的一个jQuery圆角插件
2010/10/26 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
Python实现获取某天是某个月中的第几周
2015/02/11 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
编辑找工作求职信分享
2014/01/03 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
公司领导班子对照材料
2014/08/18 职场文书
继承权公证书范本
2015/01/23 职场文书
护士辞职信怎么写
2015/02/27 职场文书
运动会开幕式致辞
2015/07/29 职场文书