Python下载ts文件视频并合并

news2024/11/19 14:27:11

目录

一、ts文件的由来

二、下载ts文件

1.下载index.m3u8,并做相应处理

2.下载ts文件

三、合并ts文件


一、ts文件的由来

ts文件,ts即"Transport Stream"的缩写,特点就是要求从视频流的任一片段开始都是可以独立解码的,非常适合网络视频播放。

打开网址:https://www.kan35.com/play/210314-3-1.html,要怎么才能把这个视频下载到电脑上呢?

按F12发现,这些视频被切割成无数个细小的片断,如图:

上图中,用红框圈出来的部分很重要,.ts的文件就是被切割的视频文件。但是这些视频文件名字全是乱的,没有规律。它们的顺序是通过index.m3u8实现的,上图中有两个index.m3u8文件,一般是尺寸更大的那个才是存放视频播放顺序的文件。可以在浏览器中打开看下:

 可以看出,这个文件里面确实保存了ts文件播放顺序,当然一些其它的网站提供的index.m3u8文件格式会有些不一样,这些都可以后期处理。

二、下载ts文件

1.下载index.m3u8,并做相应处理

这个index.m3u8很重要,直接右键“Open in new tab”就可以下载下来,但是该怎么处理呢?

首先,了解下什么是m3u8:

        m3u8是苹果公司推出的视频播放标准,是m3u的一种,只是编码格式采用的是UTF-8。

        m3u8准确来说是一种索引文件,使用m3u8文件实际上是通过它来解析对应的放在服务器上的视频网络地址,从而实现在线播放。使用m3u8格式文件主要因为可以实现多码率视频的适配,视频网站可以根据用户的网络带宽情况,自动为客户端匹配一个合适的码率文件进行播放,从而保证视频的流畅度。

其次,怎么解析这个文件?

最简单的方式是复制里面的内容,然后在excel中筛选包含“https”的字符串。

当然,我们可以用更专业的方法,在python中用“pip install m3u8”安装这个模块,然后就可以用代码解析了。

import m3u8
data = m3u8.load("index0.m3u8").data
data

显示内容大概如下:

{'media_sequence': 0,
 'is_variant': False,
 'is_endlist': True,
 'is_i_frames_only': False,
 'is_independent_segments': False,
 'playlist_type': 'vod',
 'playlists': [],
 'segments': [
{'duration': 2.667,
   'title': '',
   'uri':        'https://hey06.cjkypo.com/20211214/lIC8S3qZ1/1000kb/hls/MQJ9iKoM.ts',
   'cue_in': False,
   'cue_out': False,
   'cue_out_start': False,
   'scte35': None,
   'oatcls_scte35': None,
   'scte35_duration': None,
   'scte35_elapsedtime': None,
   'asset_metadata': None,
   'discontinuity': False,
   'dateranges': None,
   'gap_tag': None},
  {'duration': 1.667,
   'title': '',
   'uri': 'https://hey06.cjkypo.com/20211214/lIC83SqZ1/1000kb/hls/8LeDe7Wu.ts',
   'cue_in': False,
   'cue_out': False,
   'cue_out_start': False,
   'scte35': None,
   'oatcls_scte35': None,
   'scte35_duration': None,
   'scte35_elapsedtime': None,
   'asset_metadata': None,
   'discontinuity': False,
   'dateranges': None,
   'gap_tag': None},

........................

可以看出,显示的内容很多,但是实际上只有“https://”那个字符串有用。

我们现在要做的是先提取每一个带“https”的字符串,然后还要提取出每个https字符串中的ts文件名。代码如下:

order_ts = []
#将所有的带https的url存入order_ts
for i in data["segments"]:
    order_ts.append(i["uri"])

#返回一个dict,将文件名作为key,将url作为value
def read_name_url():
    name_url = {}
    for url in order_ts:
        name = url.split("/")[-1]
        name_url[name] = url
    return name_url

这个dict内容大概如下:

按理说,这个结果已经非常好了,但是我们还要进一步处理下,为我们最后一步的合并ts文件作准备。

list_name= read_name_url().keys()
file = open("order.m3u8", 'w')
for name in list_name:
    file.write("file 'D:\\ProgramData\\study\\mov\\tsfiles\\" + name + "'")
    file.write("\n")

这个order.m3u8文件的内容大概如下:

file 'D:\ProgramData\study\mov\tsfiles\MQJ9iKoM.ts'
file 'D:\ProgramData\study\mov\tsfiles\8LeDe7Wu.ts'
file 'D:\ProgramData\study\mov\tsfiles\WS72cnXO.ts'
file 'D:\ProgramData\study\mov\tsfiles\LXld1AUz.ts'
file 'D:\ProgramData\study\mov\tsfiles\Jc2FmbSf.ts'

...........

2.下载ts文件

ts文件很小,只有几百k,所以一个完整的视频会被分成几千个ts文件,我们可以采用多线程的方式来下载:

import urllib
from concurrent.futures import ThreadPoolExecutor

def download(url,name):
    #下载ts文件到D:\ProgramData\study\mov\tsfiles文件夹
    urllib.request.urlretrieve(url,'D://ProgramData//study//mov//tsfiles//'+name)

def download_tsfile():
    #记录创立的线程
    task_list = []
    dict_name_url = read_name_url()
    #线程池的创立 
    pool = ThreadPoolExecutor(max_workers=50)
    for name in dict_name_url:
        # 启动多个线程下载文件,download是函数名,后面两个是参数值
        task_list.append(pool.submit(download, dict_name_url[name],name))
    # 判断所有下载线程是否全部结束
    while (True):
        if len(task_list) == 0:
            break
        for i in task_list:
            if i.done():
                task_list.remove(i)
                print("剩下任务数:{0}".format(len(task_list)))
    print("所有下载任务完成!")

下载完成后,就可以在tsfiles文件夹找到这些细小的文件:

三、合并ts文件

有了前面两步的铺垫,现在要进行最重要的一个步骤了,那就是按order.m3u8里面的顺序,依次把这些ts文件合并起来。该怎么合并呢?

我们需要借助ffmpeg这个工具,这个工具非常强大,专门用来处理音频、视频切割、合并、编辑等,当然也非常复杂。安装这个软件,可以点击后面参考文章中的第二篇文章,这里不细说。下面来说说怎么合并这些ts文件。

代码非常简单:

import os

def mixTss(name):
    #string前面加上‘r’,是为了告诉编译器这个string是个raw string,不要转义 backslash '\' 。
    com = r'D:\\ffmpeg\\bin\\ffmpeg.exe -f concat -safe 0 -i D:\\ProgramData\\study\\mov\\order.m3u8 -c copy D:\\ProgramData\\study\\mov\\{}.mp4'.format(name)
    os.system(com)
    
mixTss("hello")
print("合并完成!")

可以看出上面的代码中,最重要的就是执行了一命令:

D:\ffmpeg\bin\ffmpeg.exe -f concat -safe 0 -i D:\ProgramData\study\mov\order.m3u8 -c copy D:\ProgramData\\study\\mov\\hello.mp4

ffmpeg很强大,但是也比较复杂,我也不是很懂这个,大概解释如下。

ffmpeg使用语法:

命令格式: ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件] ffmpeg [[options][`-i' input_file]]... {[options] output_file}... 

具体一点来说:

1. -f concat,-f 一般设置输出文件的格式,如-f psp(输出psp专用格式),但是如果跟concat,则表示采用concat协议,对文件进行连接合并。

2. -safe 0,用于忽略一些文件名错误,如长路径、空格、非ANSIC字符

3. -i D:\ProgramData\study\mov\order.m3u8,-i后面加输入文件名,当然也可以加输入文件名组成的文件名,即order.m3u8,但是要满足文件格式,即类似于下面这种:

file 'D:\ProgramData\study\mov\tsfiles\MQJ9iKoM.ts'
file 'D:\ProgramData\study\mov\tsfiles\8LeDe7Wu.ts'

4. -c copy D:\ProgramData\\study\\mov\\hello.mp4,-c表示输出文件采用的编码器,后面跟copy,表示不重新编码。

参考文章:ts视频下载 准备下载视频的你确定不进来看看吗_小王不头秃的博客-CSDN博客_ts视频下载

ffmpeg安装教程_小王不头秃的博客-CSDN博客_ffmpeg怎么安装

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

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

相关文章

C 程序设计教程(06)—— C 语言的运算符与表达式

C 程序设计教程(06)—— C 语言的运算符与表达式 该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。 目录C 程序设计教程(0…

【每日一题】【LeetCode】【第七天】盛最多水的容器

解决之路 因为是周日,找个中等题挑战一下。 题目描述 测试案例(部分) 第一次 想一下,因为涉及到底乘高,所以不能排序。逆序也没必要。 简化一下题干,盛水最多,也就是算面积最大&#xff0c…

【北邮果园大三上】运筹学期中前

第一章.线性规划 1.1例题 根据现实世界中的问题建立模型 一般表达式 ①和式 ②向量式 1.2变化标准: 1.3线性规划求解的基础原理和单纯解法 1.3.1解 ①基础概念 基 可行解与基础解 其他分类 ②判断举例 原式子: 判断标准 将一个未知数作为常熟&#…

从Wireshark看TCP连接的建立与关闭

http://t.zoukankan.com/jonathanlin-p-4282582.html TCP是一种面向连接、可靠的协议。TCP连接的建立与断开,都是需要经过通信双方的协商。用一句话概括就是:三次握手say hello(建立连接);四次握手say goodbye&#x…

蓝桥杯Python组排序算法与函数

目录 一、排序算法 二、排序函数 1、Python 的 sort() 函数和 sorted() 函数 2、sort() 例子 3、sorted() 例子 4、部分排序 三、例题 1、统计数字(lanqiaoOJ题号535) 2、错误票据(lanqiaoOJ题号205) 3、奖学金&#xf…

线程池 - ThreadPoolExecutor 详解

线程池 - ThreadPoolExecutor 详解 线程池 ThreadPoolExecutor 源码解析参考 juc 专栏系列文章。 基本概述 线程池:一个容纳多个线程的容器,容器中的线程可以重复使用,省去了频繁创建和销毁线程对象的操作。 线程池作用: 降低资…

【基础】Elasticsearch 基础

Elasticsearch 基本概念及使用Elasticsearch 基本概念ES 的简介及使用场景ES 基本概念ES 与 Kibana 的安装Elasticsearch 分词器ES 内置分词器ik 分词器的安装和使用Elasticsearch 基本使用索引操作数据的增删改查DSL 查询聚合查询批量操作Elasticsearch 基本概念 ES 的简介及…

多线程锁相关

日升时奋斗,日落时自省 目录 1、常见的锁策略 1.1、悲观锁vs乐观锁 1.2、轻量级锁vs重量级锁 1.3、自旋锁vs挂起等待锁 1.4、互斥锁vs读写锁 1.5、公平锁vs非公平锁 1.6可重入锁vs不可重入锁 2、CAS 2.1、CAS解析 2.2、CAS的应用场景 2.2.1、实现原子类 …

JavaSE学习day2_03, 算数运算符

5. 算术运算符 5.1 分类: - * / % 5.2 细节: 1.运算规则。跟小学数学是一模一样的 2.如果是整数跟整数进行计算,结果只能是整数。直接去掉小数部分,保留整数。如5/22,而不是2.5. 3.如果想要结果中有小数,需要有小…

(二)K8S Namespace 和 Label

Namespace 1、K8S集群中默认的Namespace为default,通过Namespace可以实现Pod之间的相互隔离(如测试环境、生成环境的隔离) 2、通过K8S的资源配置机制限定不同的Namespace对CPU、内存的使用,再通过K8S授权机制将不同的Namespace交…

启动ruoyi框架(初学)

启动ruoyi框架(初学)(RuoYi) Ruo Yi启动ruoyi框架(初学)([RuoYi](http://doc.ruoyi.vip/))一、简介二、项目启动1.前端模组:RUOYI-UI2.后端模组:3.环境要求&a…

Java版阿里云/腾讯云域名动态映射DDNS到动态IPv4或IPv6

1 介绍 利用业余时间,整合了一下阿里云和腾讯云动态域名映射,并将其使用spring boot做了一下封装,正好可以把家里的闲置电脑和IP v6利用起来,具体使用方法如下,或者参考对应项目的readme文档 2 地址 aliyun-ddns&am…

数据分析-深度学习 Day3

youtube课程地址:(实时更新)https://www.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2Jwww.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2JB站课程地址:李宏毅2021机器学习【week3】&#xff1a…

基于tensorflow框架bert的自然灾害描述文本分类详细教程

概述: 使用tensorflow框架: 预测给定的推文是否与真正的灾难有关。如果是这样,预测一个1。如果不是,预测一个0 数据展示:

Java之String概述、对象创建原理和常见面试题、String类常用API、案例

目录String、ArrayList前言String简单介绍Arraylist简单介绍String 概述String类的特点详解总结String类创建对象的两种方式两种方式有什么区别吗?总结String常见面试题String类常用API-字符串内容比较总结String类常用API-遍历、替换、截取、分割操作String案例验证…

内存管理(C/C++)

内存管理(C/C)C/C内存分布C语言中的动态内存管理方式C中动态内存管理new / delete 操作内置类型new 和 delete 操作自定义类型operator new 和 operator delete 函数operator new 和 operator delete 函数new 和 delete 的实现原理内置类型自定义类型定位…

【人工智能原理自学】激活函数:给机器注入灵魂

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解激活函数:给机器注入灵魂,一起卷起来叭! 目录一、“分…

已解决pandas正确创建DataFrame对象的四种方法(通过list列表、dict字典、ndarray、Series对象创建)

已解决(pandas创建DataFrame对象失败)ValueError: 4 columns passed, passed data had 2 columns 文章目录报错代码报错翻译报错原因解决方法创建DataFrame对象的四种方法1. list列表构建DataFrame2. dict字典构建DataFrame3. ndarray创建DataFrame4. Se…

【MySQL】十一,存储引擎

查看存储引擎 查看mysql提供什么存储引擎 设置系统默认的存储引擎 查看默认的存储引擎 show variables like %storage_engine%; SELECT default_storage_engine;修改默认的存储引擎 如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作…

08、ThingsBoard使用msa构建镜像并上传到Harbor

1、概述 今天讲解如何使用thingsboard源码中的msa模块来构建镜像,首先我先说一下这个模块的作用,很多人都不明白msa是如何构建镜像的,msa下面创建了很多模块,每个模块都是一个应用,就像我们平时微服务一样可以独自启动,thingsboard是使用这些模块去其它模块拉取代码过来…