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 相关文章推荐
在Python3中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
python轮询机制控制led实例
May 03 Python
Python中的全局变量如何理解
Jun 04 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
PyCharm Community安装与配置的详细教程
Nov 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
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
深入理解js promise chain
2016/05/05 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
Python转码问题的解决方法
2008/10/07 Python
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
浅谈Python单向链表的实现
2015/12/24 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
Python如何获取文件指定行的内容
2020/05/27 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
银行授权委托书格式
2014/10/10 职场文书
白鹤梁导游词
2015/02/06 职场文书
检讨书格式范文
2015/05/07 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书