比如这个在线视频:

我们可以正常播放,但是找不到下载按钮。

打开Chrome开发者工具,在Network标签页里能看到很多网络传输请求:

随便看一个请求的响应,发现类型为video,大小为500多k。因此,这个在线视频被拆分成了若干500多k的小片段,然后通过浏览器下载到本地进行播放。

这个片段的url:

http://d2vvqvds83fsd.cloudfront.net/vin02/vsmedia/definst/smil:event/18/36/06/3/rt/1/resources/180919_PID_Intelligent_Enterprise_Gruenewald_720p-5F92.smil/media_b433000_10.ts

那么这个片段一共有多少个片段呢?在所有片段开始下载之前,有这样一个请求:chunklist即是视频片段的清单。

通过这个清单我们知道这个视频一共分为55个片段,序号从0开始。

了解了原理,我们就可以开始编程了。

1. 首先实现视频片段的下载逻辑,新建一个类,实现Runnable接口。

2. 使用JDK自带的多线程库 ExecutorService多线程下载这些片段。ExecutorService实际是一个线程池。第15行可以指定线程池里工作线程(Working thread)的个数。

private void download(){

URL task = null;

String path = DownloadLauncher.LOCALPATH + this.mIndex +

DownloadLauncher.POSTFIX;

String url = this.mTask;

try {

task = new URL(url);

DataInputStream dataInputStream = new DataInputStream(task.openStream());

FileOutputStream fileOutputStream = new FileOutputStream(new File(path));

ByteArrayOutputStream output = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int length;

while ((length = dataInputStream.read(buffer)) > 0) {

output.write(buffer, 0, length);

}

fileOutputStream.write(output.toByteArray());

dataInputStream.close();

fileOutputStream.close();

System.out.println("File: " + this.mIndex + " downloaded ok");

}

catch (MalformedURLException e) {

e.printStackTrace();

}

catch (IOException e) {

e.printStackTrace();

}

}

下载完成后,能在Eclipse的console控制台看到这些输出:

下载成功的视频片段:

3. Merger负责把这些片段合并成一个大文件。

private static void run() throws IOException{

FileInputStream in = null;

String destFile = DownloadLauncher.LOCALPATH +

DownloadLauncher.MERGED;

FileOutputStream out = new FileOutputStream(destFile,true);

for( int i = 0; i <= DownloadLauncher.LAST; i++){

byte[] buf = new byte[1024];

int len = 0;

String sourceFile = DownloadLauncher.LOCALPATH + i +

DownloadLauncher.POSTFIX;

in = new FileInputStream(sourceFile);

while( (len = in.read(buf)) != -1 ){

out.write(buf,0,len);

}

}

out.close();

}

public static void main(String[] args) {

try {

run();

} catch (IOException e) {

e.printStackTrace();

}

System.out.println("Merged ok!");

}

完整的代码在我的github上:

https://github.com/i042416/JavaTwoPlusTwoEquals5/tree/master/src/flick

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

自己开发的在线视频下载工具,基于Java多线程的更多相关文章

  1. 7个好用的在线YouTube视频下载工具

    title: 7个好用的在线YouTube视频下载工具 toc: false date: 2018-10-10 15:11:00 categories: methods tags: youtube C ...

  2. You-Get,多网站视频下载工具,非常方便

    You-Get是一个非常优秀的网站视频下载工具.使用You-Get可以很轻松的下载到网络上的视频.图片及音乐. 按Win+R键打开运行,输入cmd,再输入命令 pip install you-get, ...

  3. 在线视频下载利器——youtube-dl

    youtube-dl是谷歌出品的在线视频下载利器,可以用来下载youtube视频(前提是你得能上youtube). 使用方法很简单,只需要在cmd下执行youtube-de.exe +视频页面网址,程 ...

  4. YouTube 视频下载工具

    YouTube 视频下载工具 我不生产视频,只是优秀视频的搬运工! YouTube-dl https://github.com/search?q=youtube-dl https://github.c ...

  5. 命令行视频下载工具 you-get 和 youtube-dl

    you-get 和 youtube-dl 都是基于 Python 的命令行媒体文件下载工具,完全开源免费跨平台.用户只需使用简单命令并提供在线视频的网页地址即可让程序自动进行嗅探.下载.合并.命名和清 ...

  6. Cesium中文网——如何开发一款地图下载工具[一]

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium中文网的朋友们的其中一个主题是:自己独立开发一款地图 ...

  7. python实现的视频下载工具you-get,支持多个国内外主流视频平台

    RT,you-get 是一个视频离线下载工具, https://github.com/soimort/you-get 另一个同类工具 youtube-dl 也是python 实现,虽然名为 youtu ...

  8. You-Get 视频下载工具 Python命令行下载工具

    You-Get 是一个命令行工具, 用来下载各大视频网站的视频, 是我目前知道的命令行下载工具中最好的一个, 之前使用过 youtube-dl, 但是 youtube-dl 吧, 下载好的视频是分段的 ...

  9. Downie for Mac最强视频下载工具(支持B站优酷土豆腾讯等)

    我搜集到的一款简单拖放链接到Downie,它就会下载该网站上的视频.理论可以下载各种视频网站上的视频! 应用介绍 Downie 是一款Mac平台上的优秀视频下载软件,使用非常简单,只需将下载链接放置D ...

随机推荐

  1. 【Data Structure & Algorithm】求1+2+…+n

    求1+2+-+n 题目:求1+2+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A ? B : C). 分析:此题没多少实际意义,因为 ...

  2. tomcat的bin文件夹下的.bat和.sh文件

    tomcat的bin文件夹中存在一份.bat文件和相对应的.sh文件,一个是为了在window系统上执行的文件,另一个是linux下的批处理文件.例如:startup.bat和startup.sh. ...

  3. Android 电脑投屏工具Vysor Pro介绍

    Chrome的插件,直接到chrome的扩展程序里面搜索Vysor,安装即可 如何破解: C:\Users\lanlan.shi\AppData\Local\Google\Chrome\User Da ...

  4. 使用SQL访问MongoDB

    使用SQL访问MongoDB 简介 使用SQL访问MongoDB有多种解决方案,就我所知的,除了今天要介绍的MongoDB Connector for BI外,还有Studio 3T,但后者只有在企业 ...

  5. CSS3 制作魔方 - 玩转魔方

    在上一篇<CSS3 制作魔方 - 形成魔方>中介绍了一个完整魔方的绘制实现,本文将介绍魔方的玩转,支持上下左右每一层独立地旋转.先来一睹玩转的风采. 1.一个问题 由于魔方格的位置与转动的 ...

  6. ObjectARX反应器概述[转载]

    何为反应器? AutoCAD中提供了类似MFC消息机制的通知方式.用于处理以下情况: 执行AutoCAD命令.修改系统变量.保存和退出图形编辑器或者切换当前工作布局空间等等. 反应器机制是观察者模式的 ...

  7. HDU5904【瞎搞】

    哇咔咔,挂完. 靠着hack的100分挂在了rank167... 就是memset的问题,超时了:用map好了.. 思路: 标记a串以当前值为尾的上升子序列长度,然后还是搞b串,每次判一下当前值在a串 ...

  8. Pycharm 配置autopep8到菜单

    Pycharm 可以自动检测PEP8规范. 我们可以安装autopep8来自动修改文件实现PEP8规范. 1.通过Pycharm安装autopep8 2.File->Setting->Ex ...

  9. MongoDb 数据修补笔记

    1. 2013.08.21     KS 数据有严重问题, 缺乏数十秒数据, serialNumber 乱序

  10. 跳跃表&hash

    汇编刚学跳跃表,发现跳跃表与hash有着数不清的关系 维基百科: 哈希表(哈希映射)是实现关联数组抽象数据类型的数据结构,该结构可以将键映射到值.哈希表使用哈希函数来计算桶或槽阵列的索引,从中可以找到 ...