当前位置: 首页 > news >正文

使用Python下载并合并HLS视频片段

下载和合并视频片段的实用方法

在日常工作中,我们经常会遇到需要从网上下载视频并将其合并成一个完整视频的需求。本文将介绍如何使用 Python 下载多个视频片段,并使用 ffmpeg 将这些片段合并成一个完整的视频文件。以下是具体步骤和代码实现。

完整代码

首先,下面是完整的代码,可以直接复制粘贴到你的 Python 环境中运行:

import requests
import os# 视频下载和合并的目录
download_dir = 'downloads'
os.makedirs(download_dir, exist_ok=True)# 基础URL和总片段数
base_url = "https://demo.net/hls/contents/videos/361000/361464/361464_720p.mp4/cdn-{}-v1-a1.ts"
total_segments = 3
proxies = {'http': 'http://127.0.0.1:10809','https': 'http://127.0.0.1:10809'
}# 下载所有视频片段
for i in range(1, total_segments + 1):url = base_url.format(i)headers = {}try:r = requests.get(url, stream=True, headers=headers, proxies=proxies)r.raise_for_status()  # 检查请求是否成功segment_path = os.path.join(download_dir, f"segment_{i:03d}.ts")with open(segment_path, 'wb') as f:f.write(r.content)print(f"下载完成: segment_{i:03d}.ts")except requests.RequestException as e:print(f"下载失败: segment_{i:03d}.ts - {e}")continue# 生成文件列表
filelist_path = os.path.join(download_dir, 'filelist.txt')
with open(filelist_path, 'w') as f:for i in range(1, total_segments + 1):segment_path = f"segment_{i:03d}.ts"f.write(f"file '{segment_path}'\n")# 使用ffmpeg合并视频
command = f"ffmpeg -y -f concat -safe 0 -i \"{filelist_path}\" -c copy output_video.mp4"
os.system(command)# 获取并打印视频文件的绝对路径
video_path = os.path.abspath("output_video.mp4")
print(f"视频合并完成,文件名为: output_video.mp4,存储位置为: {video_path}")
代码介绍
1. 导入必要的库

我们需要 requests 库来处理 HTTP 请求,os 库来处理文件和目录操作。

import requests
import os
2. 定义视频下载和合并的目录

创建一个名为 downloads 的目录,用于存储下载的视频片段。

# 视频下载和合并的目录
download_dir = 'downloads'
os.makedirs(download_dir, exist_ok=True)
3. 定义基础 URL 和总片段数

基础 URL 用于构建每个片段的下载链接,总片段数表示视频被分割成多少个片段。

# 基础URL和总片段数
base_url = "https://demo.net/hls/contents/videos/361000/361464/361464_720p.mp4/cdn-{}-v1-a1.ts"
total_segments = 218
proxies = {'http': 'http://127.0.0.1:10809','https': 'http://127.0.0.1:10809'
}
4. 下载视频片段

遍历所有片段,构建每个片段的 URL,发送 HTTP 请求下载视频片段,并将其保存到本地。

# 下载所有视频片段
for i in range(1, total_segments + 1):url = base_url.format(i)headers = {}try:r = requests.get(url, stream=True, headers=headers, proxies=proxies)r.raise_for_status()  # 检查请求是否成功segment_path = os.path.join(download_dir, f"segment_{i:03d}.ts")with open(segment_path, 'wb') as f:f.write(r.content)print(f"下载完成: segment_{i:03d}.ts")except requests.RequestException as e:print(f"下载失败: segment_{i:03d}.ts - {e}")continue
5. 生成文件列表

生成一个文本文件,列出所有下载的视频片段路径,供 ffmpeg 使用。

# 生成文件列表
filelist_path = os.path.join(download_dir, 'filelist.txt')
with open(filelist_path, 'w') as f:for i in range(1, total_segments + 1):segment_path = f"segment_{i:03d}.ts"f.write(f"file '{segment_path}'\n")
6. 使用 ffmpeg 合并视频

调用 ffmpeg 命令,将所有视频片段合并成一个完整的视频文件。

# 使用ffmpeg合并视频
command = f"ffmpeg -y -f concat -safe 0 -i \"{filelist_path}\" -c copy output_video.mp4"
os.system(command)
7. 打印合并后的视频文件路径

获取并打印合并后的视频文件的绝对路径,方便用户查找。

# 获取并打印视频文件的绝对路径
video_path = os.path.abspath("output_video.mp4")
print(f"视频合并完成,文件名为: output_video.mp4,存储位置为: {video_path}")

通过上述步骤,我们可以轻松实现从网络下载多个视频片段并合并成一个完整视频的功能。如果在实际应用中遇到问题,可以通过添加调试信息或检查网络连接来排查问题。希望这篇文章对你有所帮助!

http://www.lryc.cn/news/390067.html

相关文章:

  • 常见的九种二极管
  • 竞赛选题 python的搜索引擎系统设计与实现
  • 大模型技术方向夏令营1期-对话分角色要素提取挑战赛
  • 类和对象(封装、继承、多态、友元)
  • 关于Yolov8我踩过的那些坑
  • Linux——shell原理和文件权限
  • 网络工程师需要熟悉Docker吗?我觉得不需要精通,但是得懂基础
  • c++初级-2-引用
  • 如何清理电脑内存?让电脑运行如飞!
  • [数据集][目标检测]人员状态跑睡抽烟打电话跌倒检测数据集4943张5类别
  • Java8 - Stream API 处理集合数据
  • 漫步5G-A City,一份独属于上海的浪漫
  • SpringBoot 如何处理跨域请求?你说的出几种方法?
  • OV SSL证书年度成本概览:为企业安全护航的经济之选
  • 歌尔气压计SPA06-003在无人机的创新应用
  • python3多文件操作
  • 312. 戳气球
  • 深入理解C++中的锁
  • 压缩pdf文件大小,压缩pdf文件大小软件哪个好
  • 难道 Java 已经过时了?
  • 华为OD机考题(​HJ32 密码截取)
  • 【高考志愿】测绘科学与技术
  • SpringBoot异步接口实现 提升吞吐量
  • C语言快速学习笔记
  • 如何选择易用性高的项目管理软件?
  • vue3基于uni-app 封装小程序request请求
  • YOLO在目标检测与视频轨迹追踪中的应用
  • 版本控制系统:Git 纯应用(持续更新)
  • 从0开始搭建vue项目
  • Java框架常见面试题