下载和合并视频片段的实用方法
在日常工作中,我们经常会遇到需要从网上下载视频并将其合并成一个完整视频的需求。本文将介绍如何使用 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 = 218
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 = os.path.join(download_dir, 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 = {
"User-Agent": "MyApp",
"X-CustomHeader": "Value",
"If-Modified-Since": "Sun, 19 Nov 2000 08:52:00 GMT"
}
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 = os.path.join(download_dir, 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}")
通过上述步骤,我们可以轻松实现从网络下载多个视频片段并合并成一个完整视频的功能。如果在实际应用中遇到问题,可以通过添加调试信息或检查网络连接来排查问题。希望这篇文章对你有所帮助!