Python下载ts文件视频且合并

news2024/11/17 6:25:30

目录

一、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/149849.html

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

相关文章

Pytorch 权重衰减

目录 1、权重衰减 2、L2正则化和L1正则化 3、高维线性回归演示权重衰减 1、权重衰减 一般来说,我们总是可以通过去收集更多的训练数据来缓解过拟合。 但这可能成本很高,耗时颇多,或者完全超出我们的控制,因而在短期内不可能做到…

OpenTelemetry日志体系

前言 OpenTelemetry为了实现其可观测性有三大体系:Trace,Metrics和Log。本文将对于OpenTelemetry实现的日志体系进行详细的讲述。 日志 说到日志相比大家都能侃侃而谈:帮助快速定位出现的问题,数据追踪,性能分析等等…

联合证券|新年再现“A吃A” 建发股份拟控股美凯龙

2022年,A股上市公司之间的并购超越10起。2023年伊始,上市公司“A吃A”或将再添新事例。 建发股份(600153)1月8日晚公告,公司正在谋划经过现金方法协议收购红星美凯龙控股集团有限公司(以下简称“红星控股”)持有的美凯…

导致 MySQL 索引失效

1、索引失效情况1:非最左匹配 最左匹配原则指的是,以最左边的为起点字段查询可以使用联合索引,否则将不能使用联合索引。 我们本文的联合索引的字段顺序是 sn name age,我们假设它们的顺序是 A B C,以下联合索引的…

YOLOv8来啦 | 详细解读YOLOv8的改进模块!YOLOv5官方出品YOLOv8!

YOLOv8是Ultralytics开发的 YOLO(You Only Look Once)物体检测和图像分割模型的最新版本,详细介绍可以参考Ultralytics发布的网址,可以通过ultralytics python 包获取代码,暂时还没有官方公布代码 安装ultralytics py…

再见,Python 循环,向量化已超神

使用向量化 -- Python中循环的超级快速替代品 我们在几乎所有的编程语言中都学习过循环。所以,默认情况下,只要有重复性的操作,我们就会开始实施循环。但是当我们处理大量的迭代(数百万/数十亿行)时,使用循…

啊哈哈哈,2023年Python学习清单来喽;这清单都上齐了,怎么不收藏啊

不知不觉已经在CSDN写了三百多篇博客,这些博客中,Python相关的内容占了绝大多数,而这些与Python有关的内容中,绝大多数又都是我个人学习的总结,本文希望把我的Python学习过程做一个总结,也希望能够帮助不同…

【Java】阻塞队列

【Java】阻塞队列 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这2个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到…

4.3 集成运放电路简介

从本质上看,集成运放是一种高性能的直接耦合放大电路。尽管品种繁多,内部结构也各不相同,但是它们的基本组成部分、结构形式和组成原则基本一致。因此,对于典型电路的分析具有普遍意义,一方面可以从中理解集成运放的性…

MapGIS用投影变换功能绘制多条测线

1 问题的提出 在做测线设计的时候,经常要在MapGIS里投点,投线。投点可以用section自带功能实现,但投线还是另有讲究的。可以用MapGIS自带的投影变换功能来实现。 先看下我已知线在奥维地图里是什么样的。 下面就来对这些线,进行投影变换,生成wl线文件,从而可以放入设计…

1. 【prometheus 学习】架构Architecture

prometheus是开源的系统监控及告警系统,很多企业、互联网公司应用prometheus,搭配可视化的grafana,实现对系统的全面度量。 prometheus应用的场景: 1)对于数据准确率要求不高,可以粗略反映监控数据走势的场…

前端实战:Vue实现数据导出导入案例

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️荣誉: CSDN博客专家、数据库优质创作者🏆&…

linux内核调度浅析

目录 进程控制块PCB 就绪队列结构体 调度队列成员 下一个进程的选择 进程切换 加入就绪队列 linux进程调度相关的知识再重新梳理一遍。抽取主要数据结构中的主要成员,以最简单的方式实现进程调度。 进程控制块PCB task_struct /* 进程PCB */ struct task_s…

人脸识别速度超高识别度超高项目,可实时进行检测,一看就会!

1.本项目属于pytorch-facenet项目,核心代码是facenet算法,经过1周的代码修改,可以进行入库和识别的连续操作,经过测试,识别效果很好,在GPU环境中可以进行实时摄像头的识别,同时项目将放在百度网…

知行之桥传输带附件的文件示例

在大多数的项目中,交易伙伴往往只要求传输报文消息,业务数据经由报文内容来进行传输。但有些交易伙伴也会要求传输带附件的文件,比如在与大众和延锋汽车YFAI对接的项目当中,交易伙伴要求传输VDA4951 ENGDAT报文,该业务…

vue3 销毁组件方法

问题描述:使用elementplus的dialog,当关闭弹窗后不刷新页面,直接再次打开发现弹窗中还存留上一次的数据。尝试定义关闭事件,或者使用api中提供的属性destroy-on-close 都不行。后来发现这是一个误区。弹窗关闭时并不代表这个组件已经被销毁了…

Linux测试主机之间连通性和端口是否开放的方法

文章目录测试主机之间的连通性测试端口是否开放(curl)测试端口是否开放(wget)测试端口是否开放(ssh)下面每一种测试方式都给出了成功通信的截图,如果与截图不相符可以根据你控制台的报错调试。测试主机之间的连通性 测试两个主机之间是否可以通信,通常使…

Odoo 16 企业版手册 - 库存管理之规则与路线

规则和路线 产品上定义的路线将帮助您理解和跟踪产品的每一次调拨。它是用于库存调拨的操作规则或路线。没有适当的策略,就很难监控和管理公司的库存变动。根据您的公司政策,您可以设置某些操作规则来定义库存中的产品调拨。使用这些规则,Odo…

何为 Vue3 组件标注 TS 类型,看这篇文章就够了!

文章目录前言一、为 props 标注类型使用 < script setup >非 < script setup >二、为 emits 标注类型使用 < script setup >非 < script setup >三、为 ref() 标注类型默认推导类型通过接口指定类型通过泛型指定类型四、为 reactive() 标注类型默认推导…

什么真无线蓝牙耳机值得入手?蓝牙耳机全方位挑选攻略

从我们的日常生活中可以看到&#xff0c;蓝牙耳机的使用频率真的是越来越高了&#xff0c;这主要得益于蓝牙耳机的使用便捷性以及近几年的快速发展。很多人在选择时不禁有些疑问&#xff0c;不知道哪款真无线蓝牙耳机值得入手&#xff1f; 都说买新不买旧&#xff0c;所以&…