比如这个在线视频:

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

打开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. Downie4许可证代码 MacOS上最好的在线视频下载工具

    相信大家都知道,核心主流媒体的适配网站都是没办法下载视频的,如果是国外的视频网站,可能会很卡,无法流程的观看视频,这个时候真的会让人非常急躁. 在这样的情况下,在视频媒体上进行离线下载观看就成了很多用 ...

  2. IDM下载器|Windows系统经典下载工具idm6.41|IDM如何在线视频下载工具 |下载视频教程

    IDM全称Internet Download Manager,是一种将下载速度提高最多5倍的专业下载工具,支持大部分文件格式下载和基本所有的下载链接,无视网址本身下载限速,直接达到电脑该有的网速. 下 ...

  3. VSO Downloader Ultimate 5.0.1.45 中文多语免费版 在线视频下载工具

    VSO Downloader 5.0 Ultimate 中文多语免费版由大眼仔旭(www.dayanzai.me)发布.VSO Downloader 4.4 中文旗舰版是一款国外的软件,一款万能视频下 ...

  4. PullTube for Mac(在线视频下载工具)

    PullTube for Mac是一款简单易用的在线视频工具,支持数百个网站.聪明的Chrome和Safari扩展程序使其变得更加容易,可以将视频转换并保存为mp3和m4a,支持8K,4K和60 fp ...

  5. Mac在线视频下载工具:PullTube

    PullTube 是一款mac平台上的Youtube视频下载器,支持数百个网站.只需要复制youtube视频或者音乐的url网址粘贴到下载窗口即可下载.还支持safari.chrome以及firefo ...

  6. mac好用的视频下载工具PullTube

    PullTube mac版是一款可快速下载 YouTube 在线视频的小工具,只需将 YouTube 链接粘入或拖入 PullTube 窗口即可启动视频下载工程.同时你也可以选择下载视频的清晰度. P ...

  7. Orbit Downloader 小巧无广告的下载工具,超赞的在线视频下载能力,比迅雷清爽多了!

    Orbit Downloader 是国外一款相当知名的老牌下载软件,在国外的地位就好比国内的迅雷.它是一款基于P2P和P2SP技术的下载工具,但与迅雷的差别真的很大,迅雷越来越庞大,现在机器差点的话启 ...

  8. You-Get--基于Python3的开源网络视频下载工具

    CSDN GitHub You-Get–基于Python3的开源网络视频下载工具 AderXCoding/system/tools/you-get 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

  9. 用Python轻松开发数据库取数下载工具

    ❝ 本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes ❞ 1 简介 这是我的系列教程「Python+Dash ...

最新文章

  1. 拨号连接或 ××× 连接的错误代码列表
  2. 双向非循环递增链表——插入,删除,清空
  3. linux分区详解!
  4. CVS,GIT,Mercurial和SVN比较
  5. 好久没有深入研究技术了,最近这两年太忙但又不知道忙了些什么
  6. VTK:超流线用法实战
  7. 八皇后问题python_python求解八皇后问题
  8. Python之分享常用的五款动态数据可视化工具
  9. hive 两个没有null指定的表左关联的结果有null_Hive的优化原则
  10. tone mapping简介
  11. 详解如何在vue项目中引入饿了么elementUI组件
  12. Net需要掌握的知识
  13. 普通机器学习模型的提升
  14. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_9 Mybatis中的返回值深入-解决实体类属性和数据库列名不对应的两种方式...
  15. Gradle插件开发- 无侵入的函数运行时间统计的实现
  16. wordpress不登陆后台禁用插件
  17. 关于搜索引擎原理的详细解读
  18. 【PIMF】OpenHarmony啃论文俱乐部:拼音输入法原理_从触摸事件到汉字
  19. 使用python调用微步在线接口实现自动化查询IP情报
  20. 淘宝API接口(item_history_price-获取商品历史价格信息)

热门文章

  1. Javascript的面对对象的理解 【下】(prototype的使用)
  2. 文献记录(part78)--Structure-Constrained Low-Rank Representation
  3. python在租房过程中的应用
  4. 使用 npm 命令查看某个 npm 开发包明细
  5. 什么是 Time to live TTL
  6. SAP Spartacus b2b 页面 popover append to body与否的不同行为
  7. SAP Spartacus 用户登录成功后,Access Token 持久化到浏览器 local storage 的执行原理
  8. SAP Spartacus B2B Org Unit树状结构的ghost数据
  9. SAP Spartacus cost center创建按钮的路由配置
  10. 我的工作日志 - 2020年9月29日 星期二 晴