Python解析m3u8拼接下载mp4视频文件的示例代码
这篇文章主要介绍了Python解析m3u8拼接下载mp4视频文件的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
一、关于m3u8:
m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求。
示例:
1 2 3 4 5 6 7 8 9 | #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文件
我们想要的mp4文件就是一个个ts文件按照顺序拼接成的,废话不多说直接上代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | # -*- 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.run() |
console.log("公众号:Java技术迷")
console.log("wx:spiderskill")
到此这篇关于Python解析m3u8拼接下载mp4视频文件的文章就介绍到这了,