自己开发的在线视频下载工具,基于Java多线程
比如这个在线视频:
我们可以正常播放,但是找不到下载按钮。
打开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多线程相关推荐
- Downie4许可证代码 MacOS上最好的在线视频下载工具
相信大家都知道,核心主流媒体的适配网站都是没办法下载视频的,如果是国外的视频网站,可能会很卡,无法流程的观看视频,这个时候真的会让人非常急躁. 在这样的情况下,在视频媒体上进行离线下载观看就成了很多用 ...
- IDM下载器|Windows系统经典下载工具idm6.41|IDM如何在线视频下载工具 |下载视频教程
IDM全称Internet Download Manager,是一种将下载速度提高最多5倍的专业下载工具,支持大部分文件格式下载和基本所有的下载链接,无视网址本身下载限速,直接达到电脑该有的网速. 下 ...
- VSO Downloader Ultimate 5.0.1.45 中文多语免费版 在线视频下载工具
VSO Downloader 5.0 Ultimate 中文多语免费版由大眼仔旭(www.dayanzai.me)发布.VSO Downloader 4.4 中文旗舰版是一款国外的软件,一款万能视频下 ...
- PullTube for Mac(在线视频下载工具)
PullTube for Mac是一款简单易用的在线视频工具,支持数百个网站.聪明的Chrome和Safari扩展程序使其变得更加容易,可以将视频转换并保存为mp3和m4a,支持8K,4K和60 fp ...
- Mac在线视频下载工具:PullTube
PullTube 是一款mac平台上的Youtube视频下载器,支持数百个网站.只需要复制youtube视频或者音乐的url网址粘贴到下载窗口即可下载.还支持safari.chrome以及firefo ...
- mac好用的视频下载工具PullTube
PullTube mac版是一款可快速下载 YouTube 在线视频的小工具,只需将 YouTube 链接粘入或拖入 PullTube 窗口即可启动视频下载工程.同时你也可以选择下载视频的清晰度. P ...
- Orbit Downloader 小巧无广告的下载工具,超赞的在线视频下载能力,比迅雷清爽多了!
Orbit Downloader 是国外一款相当知名的老牌下载软件,在国外的地位就好比国内的迅雷.它是一款基于P2P和P2SP技术的下载工具,但与迅雷的差别真的很大,迅雷越来越庞大,现在机器差点的话启 ...
- You-Get--基于Python3的开源网络视频下载工具
CSDN GitHub You-Get–基于Python3的开源网络视频下载工具 AderXCoding/system/tools/you-get 本作品采用知识共享署名-非商业性使用-相同方式共享 ...
- 用Python轻松开发数据库取数下载工具
❝ 本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes ❞ 1 简介 这是我的系列教程「Python+Dash ...
最新文章
- 拨号连接或 ××× 连接的错误代码列表
- 双向非循环递增链表——插入,删除,清空
- linux分区详解!
- CVS,GIT,Mercurial和SVN比较
- 好久没有深入研究技术了,最近这两年太忙但又不知道忙了些什么
- VTK:超流线用法实战
- 八皇后问题python_python求解八皇后问题
- Python之分享常用的五款动态数据可视化工具
- hive 两个没有null指定的表左关联的结果有null_Hive的优化原则
- tone mapping简介
- 详解如何在vue项目中引入饿了么elementUI组件
- Net需要掌握的知识
- 普通机器学习模型的提升
- 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_9 Mybatis中的返回值深入-解决实体类属性和数据库列名不对应的两种方式...
- Gradle插件开发- 无侵入的函数运行时间统计的实现
- wordpress不登陆后台禁用插件
- 关于搜索引擎原理的详细解读
- 【PIMF】OpenHarmony啃论文俱乐部:拼音输入法原理_从触摸事件到汉字
- 使用python调用微步在线接口实现自动化查询IP情报
- 淘宝API接口(item_history_price-获取商品历史价格信息)
热门文章
- Javascript的面对对象的理解 【下】(prototype的使用)
- 文献记录(part78)--Structure-Constrained Low-Rank Representation
- python在租房过程中的应用
- 使用 npm 命令查看某个 npm 开发包明细
- 什么是 Time to live TTL
- SAP Spartacus b2b 页面 popover append to body与否的不同行为
- SAP Spartacus 用户登录成功后,Access Token 持久化到浏览器 local storage 的执行原理
- SAP Spartacus B2B Org Unit树状结构的ghost数据
- SAP Spartacus cost center创建按钮的路由配置
- 我的工作日志 - 2020年9月29日 星期二 晴