网络下载ts流媒体
很多视频网站,尤其是微信小程序中的长视频无法获取到准确视频地址,只能抓取到.ts片段地址,下载后发现基本都是5~8秒时长。
例如:
我们需要将以上地址片段全部下载后排序后再合成新的长视频。
查看
在此界面右键copy --> copy all list URLs 并将结果放入到一个list.txt中
例如:
下载
将片段全部下载到ts文件夹内
python
import os
import requests
from urllib.parse import urlparse
# 创建ts文件夹(如果不存在)
if not os.path.exists('ts'):
os.makedirs('ts')
# 读取list.txt文件
with open('list.txt', 'r') as file:
urls = file.readlines()
# 处理每个URL
for url in urls:
url = url.strip() # 移除换行符和空格
if url:
try:
# 从URL中获取文件名
filename = os.path.basename(urlparse(url).path)
if not filename.endswith('.ts'):
filename += '.ts'
# 下载文件
response = requests.get(url, stream=True)
response.raise_for_status() # 检查是否成功获取
# 保存文件
filepath = os.path.join('ts', filename)
with open(filepath, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print(f'成功下载: {filename}')
except Exception as e:
print(f'下载失败 {url}: {str(e)}')
print('所有下载���成!')
排序
对下载后的片段名称排序,一般序列数值在名称中。
例如:4261649925_937121059_2632.ts 其中的2632就是片段序列,当然不是所有序列都是最后一个数,这个要自己分析,按照分析后的点击查看两个下载好的片段就可以了。这个给个针对此命名规则的重命名代码。
python
import os
def get_number_after_second_underscore(filename):
# 分割文件名,获取第二个下划线后的数字
try:
parts = filename.split('_')
if len(parts) >= 3:
# 获取最后一部分并移除可能的.ts后缀
last_part = parts[2].replace('.ts', '')
return int(last_part)
except (IndexError, ValueError):
return None
return None
# 获取ts文件夹中的所有ts文件
ts_folder = 'ts'
ts_files = [f for f in os.listdir(ts_folder) if f.endswith('.ts')]
# 重命名文件
for filename in ts_files:
print(filename)
number = get_number_after_second_underscore(filename)
print(number)
if number is not None:
# 构建新文件名
new_filename = f"{number:03d}.ts" # 使用3位数字格式,例如:001.ts
# 构建完整的文件路径
old_path = os.path.join(ts_folder, filename)
new_path = os.path.join(ts_folder, new_filename)
try:
os.rename(old_path, new_path)
print(f'已重命名: {filename} -> {new_filename}')
except Exception as e:
print(f'重命名失败 {filename}: {str(e)}')
print('重命名完成!')
合并
将排序好的视频片段合并,需要预先安装ffmpeg
python
import os
import subprocess
# 获取ts文件夹中的所有ts文件
ts_folder = 'ts'
ts_files = [f for f in os.listdir(ts_folder) if f.endswith('.ts')]
# # 使用自定义排序
# ts_files.sort(key=get_sort_key)
print('文件排序完成,开始合并...')
print(f'共找到 {len(ts_files)} 个ts文件')
# 方法1:使用ffmpeg合并(推荐)
try:
# 创建临时文件列表
with open('filelist.txt', 'w', encoding='utf-8') as f:
for ts_file in ts_files:
f.write(f"file 'ts/{ts_file}'\n")
# 使用ffmpeg合并
print('正在合并文件...')
subprocess.run([
'ffmpeg',
'-f', 'concat',
'-safe', '0',
'-i', 'filelist.txt',
'-c', 'copy',
'output.mp4'
], check=True)
print('合并完成!输出文件:output.mp4')
# 清理临时文件
os.remove('filelist.txt')
except FileNotFoundError:
print('错误:找不到ffmpeg,尝试使用备用方法合并...')
# 方法2:直接合并(备用方法)
try:
with open('output.mp4', 'wb') as outfile:
for ts_file in ts_files:
print(f'正在处理: {ts_file}')
with open(os.path.join(ts_folder, ts_file), 'rb') as infile:
outfile.write(infile.read())
print('使用备用方法合并完成!输出文件:output.mp4')
except Exception as e:
print(f'合并失败: {str(e)}')
except Exception as e:
print(f'合并失败: {str(e)}')