m3u8网页视频文件爬取与视频合成

news2024/9/24 11:27:32

文章目录

  • m3u8网页视频文件爬取与视频合成
    • 下载m3u8文件
    • 下载m3u8文件列表所对应的ts文件
    • 下载ffmpeg

m3u8网页视频文件爬取与视频合成

我们经常在网络上找到的自己想要的视频素材却无法下载,并且打开控制台一看视频是通过分割成一份份的.ts文件发送过来的。

请添加图片描述

下载m3u8文件

这时我们先双击下载m3u8文件, 这是一种用于传输流媒体的文本格式文件 , 主要用于描述和组织视频流的各个部分 。 m3u8文件作为播放列表,列出了构成视频流的所有TS(Transport Stream)片段。每个片段都是视频的一部分 。简单来说有了这些列表和对应的TS文件就可以合成完整的视频了。

请添加图片描述

下载m3u8文件列表所对应的ts文件

右键复制一个.ts文件的url。发现所有ts文件的url地址的前段一致,后缀不同。这时可以通过python进行url拼接然后批量化下载。

请添加图片描述

以下是完整python代码

# My Python
# 测试时间:2024/9/8 23:46
import os
import time
import requests

# 定义基本URL
base_url = 'https://vip.ffzy-play7.com/20221227/9993_9681b67b/2000k/hls/'

# 定义文件路径
file_path = r'D:\Desktop\video\mixed.m3u8'
output_dir = r'D:\Desktop\video\ts'
failed_urls_file = r'D:\Desktop\video\failed_urls.txt'

# 创建输出目录如果它不存在
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

if not os.path.exists(os.path.dirname(failed_urls_file)):
    os.makedirs(os.path.dirname(failed_urls_file))

# 读取.m3u8文件
try:
    with open(file_path, 'r', encoding='utf-8') as file:
        lines = file.readlines()
except IOError as e:
    print(f"无法打开文件 {file_path}: {e}")
    exit(1)

# 初始化计数器
counter = 1

# 定义重试次数
max_retries = 5
retry_delay = 3  # 重试间隔时间(秒)

# 准备记录未完成下载的URL
failed_urls = []

# 处理每一行
for line in lines:
    if line.endswith('.ts\n'):
        # 拼接完整的URL
        url = base_url + line.strip()

        # 构建文件名
        filename = os.path.join(output_dir, os.path.basename(url))

        retries = 0

        while retries < max_retries:
            try:
                # 下载文件
                response = requests.get(url, timeout=60)  # 设置超时时间为60秒
                response.raise_for_status()  # 检查请求是否成功

                with open(filename, 'wb') as f:
                    f.write(response.content)

                print(f'已下载第{counter}个链接: {url}')
                break  # 成功下载后退出循环
            except requests.RequestException as e:
                print(f'下载失败 (第{counter}个链接, 尝试 {retries + 1}/{max_retries}): {url}, 错误: {e}')
                retries += 1
                if retries < max_retries:
                    print(f'等待 {retry_delay} 秒后重试...')
                    time.sleep(retry_delay)
                else:
                    print(f'达到最大重试次数,放弃下载:{url}')
                    failed_urls.append(url)  # 记录失败的URL

        # 计数器递增
        counter += 1

# 将未完成下载的URL保存到文件
if failed_urls:
    with open(failed_urls_file, 'w', encoding='utf-8') as f:
        for url in failed_urls:
            f.write(url + '\n')
    print(f'未完成下载的URL已保存到 {failed_urls_file}')
    print(f'共有 {len(failed_urls)} 个链接未能成功下载。')
else:
    print('所有链接均下载成功,没有失败的URL需要记录。')

print('初次下载完成。')

# 重新下载未下载的URL
if failed_urls:
    print('开始重新下载未完成的链接...')

    # 重置计数器
    counter = 1

    for url in failed_urls:
        # 构建文件名
        filename = os.path.join(output_dir, os.path.basename(url))

        retries = 0

        while retries < max_retries:
            try:
                # 下载文件
                response = requests.get(url, timeout=60)  # 设置超时时间为60秒
                response.raise_for_status()  # 检查请求是否成功

                with open(filename, 'wb') as f:
                    f.write(response.content)

                print(f'已重新下载第{counter}个链接: {url}')
                break  # 成功下载后退出循环
            except requests.RequestException as e:
                print(f'重新下载失败 (第{counter}个链接, 尝试 {retries + 1}/{max_retries}): {url}, 错误: {e}')
                retries += 1
                if retries < max_retries:
                    print(f'等待 {retry_delay} 秒后重试...')
                    time.sleep(retry_delay)
                else:
                    print(f'达到最大重试次数,放弃重新下载:{url}')

        # 计数器递增
        counter += 1

print('所有文件下载完成。')

运行实例

请添加图片描述

下载ffmpeg

得到相应的m3u8和ts文件就可以合成视频了,这里需要用到ffmpeg进行合成。

官网链接:https://ffmpeg.org//download.html

  1. 下载(以下是Windows系统示例)

请添加图片描述

请添加图片描述

  1. 解压到相应的文件夹即可
  2. 配置环境变量
  3. ffmpeg -version 检验是否配置成功
  4. 将m3u8文件和相对应的ts文件放在同一个文件夹下,打开命令行输入指令合成视频
ffmpeg -i ./mixed.m3u8 "test.mp4"

请添加图片描述

  1. 合成完毕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2121833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SDXL-Lightning容器构建指南

一、介绍 SDXL-Lightning 项目是由字节跳动开发的一个创新性的 AI 图像生成项目&#xff0c;该项目通过采用全新的蒸馏战略&#xff0c;优化了扩散模型&#xff0c;实现了从文字到高清图像的快速、高质量生成。 1. 项目背景与特点 背景 &#xff1a;随着 AI 绘画技术的不断发…

展会通过智慧客流统计分析优化运营策略-讯鹏科技

在当今数字化高速发展的时代&#xff0c;展会行业也在积极探索利用智慧科技进行转型与升级。其中&#xff0c;智慧客流统计分析成为了展会优化运营策略的关键要素。 智慧客流统计分析首先为展会提供了精准的数据支撑。通过先进的传感器、摄像头等设备&#xff0c;能够实时、准确…

以数据重塑服务管理体系,构建“无陪护病房” 数字化新生态 | 云生智慧护理运营系统

无陪护病房是一种新型的医院服务模式&#xff0c;旨在减轻患者家属的陪护负担&#xff0c;提供更加专业化和人性化的护理服务。 随着社会老龄化的加深和家庭结构的变化&#xff0c;2024年6月国家推出关于“无陪护病房”规范发展&#xff0c;无陪护病房服务有望在全国范围内得到…

SAP ABAP 删除请求

不小心把一个不想改的程序激活了&#xff0c;创建请求了怎么办 在se09里点击修改&#xff0c;然后删除即可

在线翻译工具盘点,这四大工具值得推荐!

翻译工具的存在方便了我们阅读跨语种的文件&#xff0c;跨文化交流变得前所未有的便捷。今天&#xff0c;就让我们一起来探索包括谷歌翻译的几款深受用户喜爱的翻译工具吧&#xff01; 福昕在线翻译 直达链接&#xff1a; https://fanyi.pdf365.cn/ 提到福昕在线翻译&#…

使用vue2+axios+chart.js画折线图 ,出现 RangeError: Maximum call stack size exceeded 错误

目录 效果图 解决方案 修正要点 效果图 修改前App.vue代码&#xff1a; <template><div id"app"><canvas id"myChart"></canvas></div> </template><script> import axios from axios; import { Chart, regis…

(rs系列)rs6之补环境

网址&#xff1a;aHR0cHM6Ly93d3cubm1wYS5nb3YuY24vZGF0YXNlYXJjaC9ob21lLWluZGV4Lmh0bWw rs6同样是两次html请求&#xff0c;第一次是412&#xff0c;cookie的差异性跟4、5同理&#xff0c;需要注意的是rs6无限debugger有三个&#xff0c;并且第三个需要注入hook代码才能过掉。…

从0开始搭建自动化测试平台,构建自动化测试平台的最全指南!

前言 随着软件开发的不断进步&#xff0c;测试工程师也需要跟上趋势并适应新的测试方法。自动化测试已成为现代测试领域中不可或缺的一部分。它可以提高测试效率、减少测试成本&#xff0c;并且可以避免人为错误对测试结果的影响。在这篇文章中&#xff0c;我们将介绍如何构建…

基于STC12C5A60S2单片机的LED汉字显示系统的设计

本设计基于单片机的LED汉字显示装置&#xff0c;该设计以STC12C5A60S2单片机为核心&#xff0c;利用最小系统和多个模块完成设计&#xff0c;包括点阵驱动模块、时钟模块、串口通信模块、红外线接收模块以及LED点阵屏。其中&#xff0c;点阵驱动模块采用74HC245芯片设计完成&am…

基于Python的电影推荐系统设计与实现---附源码80129

摘要 本项目旨在基于Python设计和实现一个电影推荐系统&#xff0c;旨在为用户提供个性化的电影推荐服务。通过分析用户的观影历史、评分和偏好等数据&#xff0c;系统将利用推荐算法为用户推荐符合其口味的电影。该系统将结合Python编程语言和数据分析技术&#xff0c;实现智能…

让AI给你写代码(10.2)具备调用本地库能力的AI小助手代码资源及简单介绍

接上一篇让AI给你写代码(10.1): 按接口编程的思想,统一利用内部和外部的接口,逐步扩展和提升AI编程能力 这篇我们将对照需要解决的问题,比较详细介绍一下AI小助手相关代码架构、实体,相关方法和工具。 对照10.1 新版AI小助手的需要做的流程如下: 与10.1流程图基本一致…

Docker部署nginx容器无法访问80端口

问题说明 在阿里云ECS服务器上部署一台CentOS服务器&#xff0c;然后在里面安装了docker服务。用docker部署了nginx&#xff0c;开启docker中的nginx服务&#xff0c;映射宿主机端口80 把阿里云服务器上面的安全组放开了80端口 但是还是无法访问nginx的80web界面 问题分析 查…

油猴脚本安装,3种安装方法

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

并发编程:AQS(上)

一、AQS 是什么&#xff1f; AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 AQS 就是一个抽象类&#xff0c;主要用来构建锁和同步器。 public abstract class AbstractQueuedSynch…

怎么抓住威士忌蓝海市场?

​前些天和朋友吃饭&#xff0c;聊起来威士忌。 朋友说&#xff0c;这个威士忌啊&#xff0c;最近几年增值特别快&#xff0c;甚至超过了黄金、名表、艺术品、红酒这些经典的投资品类。而且存放得越久&#xff0c;升值的幅度就越大。 再加上&#xff0c;中国的威士忌市场现在…

3GPP NTN定义了哪些band?

卫星频段主要包括以下几种&#xff1a; L波段(1–2 GHz)&#xff1a;主要用于移动卫星通信、导航系统和无线电测绘。例如&#xff0c;全球定位系统 (GPS) 运营商以及卫星移动电话&#xff0c;如 Iridium和 Inmarsat提供海上、陆地和空中通信。 S波段(2–4 GHz)&#xff1a;广泛…

【C++ Primer Plus习题】13.3

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> #inc…

[Unity]如何让选择区域(照射范围)内的物体实时高亮

前言 最近希望在Unity里实现这样一个功能&#xff1a; 黄色半透明部分是一个手电筒&#xff0c;我希望手电筒范围内的小球会高亮轮廓&#xff0c;且手电筒移出去后小球会恢复原来的样子&#xff1a; 一开始我把整个问题想的太复杂了&#xff0c;想着在Update()函数里暴力检…

使用Python自动抓取亚马逊网站商品信息

全量数据抓取不现实&#xff0c;但可以自动化、小批量采集亚马逊数据&#xff0c;现在可用的工具也非常多&#xff0c;包括Python以及一些专门的爬虫软件&#xff0c;我用过几个比较好入手的&#xff0c;像web scraper、八爪鱼、亮数据。 比如亮数据爬虫&#xff0c;它提供数据…

408:强化笔记|王道|DS|OS|CO|计网

目录 DS 数据结构算法题一、快速排序二、二路归并排序三、链表(2.3课后习题)四、二叉树五、图应用题 OS 操作系统第二章 进程与线程零、大观一、PV操作 第三章 内存管理一、内存管理大题 CO 计算机组成原理第三章 存储系统一、Cache大题二、TLB大题 第二章 数据的表示和运算第四…