0.前言

m3u8是一种很常见的网页视频播放器的视频源,比如说中国大学MOOC中课程就是使用了该种视频格式。

随便打开一门课程,就可以发现在网络请求中存在一个m3u8的文件,在preview中预览,它并不像我们想象中是乱码的视频流。

里面是一个列表,有一堆ts结尾的文件名,每个下面还跟了一个EXTINF的字段,好像是时间,在我们播放视频时,网络请求中会不断出现请求ts的内容。

随便打开一个ts文件,它的内容却是如图视频流一般乱码的。

说到这里,你可能有猜测了,m3u8并不是视频流的文件,而有可能是组织ts文件的规范,EXTINF代表播放每多少秒去请求下一片ts流。

这种边看边加载的方法无疑可以减少我们的网络负荷。

要用爬虫爬取这类视频的方法也很简单,我们只需要获得m3u8文件,就可以得到视频的ts地址了,将所有ts请求下来之后进行合并,就可以得到视频文件了。

不过要提的一点是,很多视频网站会对他们的ts进行加密,我们下载下来合并之后可能视频能看,但是播放器放着放着就卡住了,然后之后黑屏画面。

1.编码部分

我们先根据m3u8来判断一下创建咋样一个代表M3U8视频对象的类。

我们首先需要定义一个list,来存放这个m3u8视频下所有的ts文件,也就是后面说到的TS类。

这里提一点,m3u8里面的ts的路径一般对路径,会和m3u8在同一文件夹,我们代码中也是这么认为了,但是难免有些网站会单独存放m3u8和ts文件,如果遇到这种情况,修改一下代码即可。

有了ts的名称,我们还需要URL的前缀,也就是图中紫色划线部分,也就是basepath。

此外,我们还需要一个TS对象。

这个对象中存储TS文件名称以及时间EXTINF。

定义完实体类,就需要编写下载视频的过程了。

首先需要请求到m3u8的文件,此处使用Java的HttpURLConnection来请求获取,其它语言类似,只需要请求到文件即可。

请求到了m3u8的文本内容,我们还需要解析它 ,从中得到ts的名称。

得到了M3U8视频对象之后,我们就可以遍历请求它的list中TS对象的名称属性来下载ts文件了。

这么多ts文件如果我们在单线程中遍历请求,会很耗费时间,Java给我们提供了Stream,其中parallel可以让我们并发去遍历集合,效率会提升不少。

依旧是使用HttpURLConnection来做请求,不过最好本次设置超时时间。

这样就可以请求到所有ts文件了。

最后要做的就是合并这些ts文件成为一个MP4文件。

对于未加密的正常ts文件,我们只需要按照编号顺序直接拼接即可。

这样就算是完成了M3U8视频抓取了。

2.打包使用

下载地址:https://github.com/CasterWx/resources/releases/tag/1.0.1

在命令行中java -jar m3u8-down.jar [m3u8地址],会显示报错信息。

也可以直接m3u8-down.jar [m3u8地址],不会显示保存信息,会在后台执行。

最终会在同目录下生成一个output.mp4的文件,temp文件可以删除。

如何打造一款m3u8视频爬虫的更多相关文章

  1. 如何用腾讯云打造一款微视频APP

    版权声明:本文由腾讯云原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/196 来源:腾云阁 https://www.qclo ...

  2. 如何快速打造一款高清又极速的短视频APP?

    整个短视频的市场规模一直在增长,网络数据显示2018年已经突破100亿大关,在2019年预测将超过200亿.纵观行业,在生活资讯.美食.搞笑.游戏.美妆等领域,短视频流量巨大但竞争激烈,但是在教育.财 ...

  3. 爬虫爬取m3u8视频文件

    一.m3u8视频格式 一般m3u8文件和 视频流ts文件放在同一目录 而m3u8文件格式存放的一般都是ts 文件的一个列表 二.根据m3u8视频存放以及写法的规律 思路 我们一般网站上能找到的m3u8 ...

  4. 打造m3u8视频(流视频)下载解密合并器(kotlin)

    本文是对我原创工具m3u8视频下载合并器关键代码解析及软件实现的思路的讲解,想要工具的请跳转链接 1.思路说明 思路挺简单,具体步骤如下: 下载m3u8文件 解析m3u8文件获得ts文件列表 根据文件 ...

  5. 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)

          “很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有大用户群体的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造 ...

  6. 【FastDFS】如何打造一款高可用的分布式文件系统?这次我明白了!!

    写在前面 前面我们学习了如何基于两台服务器搭建FastDFS环境,而往往在生产环境中,需要FastDFS做到高可用,那如何基于FastDFS打造一款高可用的分布式文件系统呢?别急,今天,我们就一起来基 ...

  7. 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)

    上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...

  8. 打造一款属于自己的web服务器——开篇

    JVM总结慢慢来吧,先插播一篇水文,来介绍下最近业余一直在写的一个小项目——easy-httpserver(github).适合新手学习,大神们路过即可^_^. 一.这是个什么玩意? easy-htt ...

  9. 如何打造一款五星级的 APP ?

    移动互联网大潮来袭!据统计,2015 年平均每天有 1000 个新的应用上架,而这些应用的现状可以说是鱼龙混杂,同是每个人的眼光.品味.意识和利益都不同,因此每人眼中的应用也是不同的.在巨大的市场竞争 ...

随机推荐

  1. 算法<初级> - 第二章 队列、栈、哈希表相关问题

    算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...

  2. Eureka -- 浅谈Eureka

    目录: 一:Eureka介绍 二:Eureka架构图 三:Eureka组件 四:Eureka作用 五:Eureka和Zookeeper对比 什么是Eureka 引入SpringCloud中文文档介绍 ...

  3. Java基础(四)注释

    1.类注释 类注释必须放在import语句之后,类定义之前.eclipse中使用Shift + Alt + J快捷键添加类注释. 2.方法注释 每一个方法注释必须放在所描述的方法之前.除了通用标记之外 ...

  4. WordCount的实现和测试

    WordCount 一.开头 (1)合作者:201631107110,201631083416 (2)代码地址:https://gitee.com/zhaoxiaoqin/WordCount.git ...

  5. 微服务SpringCloud之GateWay路由

    在前面博客学习了网关zuul,今天学下spring官方自带的网关spring cloud gateway.Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接,如 WebSo ...

  6. SpringBoot的Banner

    一 官方文档介绍 1 自定义横幅 通过在 classpath 中添加banner.txt文件或将banner.location设置为此类文件的位置,可以更改启动时打印的横幅.如果文件具有异常编码,则可 ...

  7. MySQL存储引擎简介-MyISAM和InnoDB的区别

    上篇文章<MySql逻辑结构简介>我们聊到了存储引擎,可以说MySQL可插拔的多元化存储引擎给我们的使用者带来了很灵活的选择. 这篇文章我们来聊一下目前主流的两种存储引擎MyISAM和In ...

  8. Openmp编程练习

    火车卖票 // OpenMP2.cpp : 定义控制台应用程序的入口点. // #include "stdio.h" #include "omp.h" #inc ...

  9. Java 发展历程

    JDK 1.0 1991年4月,由 James Gosling 博士领导的绿色计划(Green Project)开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒.冰箱.收音机等)上运 ...

  10. 学习c++11 ThreadPool【转】

    #ifndef THREAD_POOL_H #define THREAD_POOL_H #include <vector> #include <queue> #include ...