一、安装 m3u8库
pip install requests
pip install requests m3u8
二、编码实现
import os
import re
import requests
import subprocess# 下载ts文件
def down_ts_file(base_url, m3u8_url, download_dir):# 从m3u8文件中获取所有ts的分片名称信息response = requests.get(base_url + m3u8_url)ts_urls = re.findall(r'(\S+\.ts)', response.text)ts_file_list = []for i, ts_url in enumerate(ts_urls):# ts网络地址全路径 response = requests.get(base_url + ts_url, stream=True)ts_file_list.append(download_dir + f'segment{i}.ts')filename = os.path.join(download_dir, f'segment{i}.ts')with open(filename, 'wb') as f:for chunk in response.iter_content(chunk_size=1024):if chunk:f.write(chunk)print("分片{}下载完成".format(i))return ts_file_list# 合并ts文件转成MP4
def merge_ts(ts_file_list, output_filename):args = '|'.join(ts_file_list)print("merge_ts args----"+args)command = f'ffmpeg -i "concat:{args}" -c copy {output_filename}'subprocess.run(command, shell=True)def do_crawler():m3u8_url = 'mixed.m3u8'base_url_list = ["https://v.cdnlz19.com/20241016/50350_17769e38/2000k/hls/"]base_download_dir = 'E:/usr/data/UserData/download/{}'for i, base_url in enumerate(base_url_list):download_dir = base_download_dir.format(i + 1) + "/"if not os.path.exists(download_dir):os.makedirs(download_dir)# 下载的ts分片数据地址,存放在列表中ts_file_list = down_ts_file(base_url, m3u8_url, download_dir)print(ts_file_list)# ts合并后文件的名称output_filename = base_download_dir.format(i) + ".mp4"merge_ts(ts_file_list, output_filename)os.remove(download_dir)