python下载m3u8视频

180 阅读1分钟
  • 拿到m3u8配置文件
  • 根据文件 请求ts文件流数据,拿到本地保存
  • 请求完后合并ts视频文件为mp4格式
import glob
import logging
import os
from concurrent.futures import ThreadPoolExecutor

import m3u8
import requests

logging.getLogger("urllib3").setLevel(logging.WARNING)

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}


def get_ts(url):
    try:
        response = requests.get(url, verify=False)
        response.raise_for_status()
        response.encoding = 'utf-8'
        return response.content
    except Exception as err:
        print(err)
        return b''


def save_ts(url, index):
    filename = os.path.join('./files', str(index).zfill(5) + '.ts')
    with open(filename, 'wb') as f:
        ts = get_ts(f'https://xxx/{url}')
        f.write(ts)
    print(filename + ' is ok!')


if __name__ == '__main__':
    playlist = m3u8.load(uri='./index.m3u8')
    # # 线程池,引入index可以防止合成时视频发生乱序
    with ThreadPoolExecutor(max_workers=10) as pool:
        for index, seg in enumerate(playlist.segments):
            pool.submit(save_ts, seg.uri, index)
    files = glob.glob(os.path.join('./files', '*.ts'))
    for file in files:
        with open(file, 'rb') as fr, open('./result.mp4', 'ab') as fw:
            content = fr.read()
            fw.write(content)
        print(file + ' is ok!')