使用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}")

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值