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. TCC推导过程

    svn 账号 yuanzn 密码:TCH5mb 项目分层 MapperDao 数据校验 throw new CloudBaseRuntimeException Helper 数据转换 manager ...

  2. 微信分享—ios和安卓机制居然不一样!

     实际项目中,在做微信分享追踪的时候,遇到了一个百思不得其解的问题. 在加入了用户分享追踪功能之后,页面已经加载完成的情况下,安卓分享功能没有任何问题,ios却总是分享失败. 关于ios和安卓设备的差 ...

  3. 图论-最短路径<Dijkstra,Floyd>

    昨天: 图论-概念与记录图的方法 以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog. 可能今天的有点乱,好好理理,认真看完相信你会懂得 分割线 第二天 引子:昨天我们简单讲了讲图的概念 ...

  4. 百万年薪python之路 -- 面向对象之:类空间问题以及类之间的关系

    面向对象之:类空间问题以及类之间的关系 1.从空间角度研究类 1.何处添加对象属性 class A: def __init__(self,name): self.name = name def fun ...

  5. Tomcat原理与优化随笔

    1. 基础组件: Server, Service: Connector(http, https, ajp用于Apache反向代理), Engine Engine: Realm用于安全配置等,如User ...

  6. Ubuntu 14.04 kylin 安装 OpenCV 2.4.9|3.0.0

    首先安装依赖 sudo apt-get -y install libopencv-dev sudo apt-get -y install build-essential checkinstall cm ...

  7. Spring Boot WebFlux 2.1.7 中文翻译文档

    1. 前言 从一开始学习 Netty 到 rxjava.Rector,再到 java8 的 CompletableFuture,就深深的为响应式编程着迷,这种区别于传统的顺序式编程,没准未来能在编程世 ...

  8. Pycharm 专业版激活码(转) 有效期到2020/06月

    亲测有效!!! 有效期截止为2020年06月,多谢大家支持与讨论! K6IXATEF43-eyJsaWNlbnNlSWQiOiJLNklYQVRFRjQzIiwibGljZW5zZWVOYW1lIjo ...

  9. Java对象"后事处理"那点事儿——垃圾回收(一)

    1.Dead Or Alive 我们都知道对象死亡的时候需要进行垃圾回收来回收这些对象从而释放空间,那么什么样的对象算是死亡呢,有哪些方法可以找出内存中的死亡对象呢?一般来说,我们可以这样认为:如果内 ...

  10. 【重构】AndroidStudio中代码重构菜单Refactor功能详解

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...