一、安装 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)