开发一个从磁力链取得影片截图的命令行工具
开发了一个不需要下载磁力链里的整个影片,可以对磁力链(或种子)里面的影片进行截图的Node命令行工具。我们来聊聊相关的技术点吧。
日常,一个经常性遇到的问题就是:有个种子(或磁力链)摆在你面前,要先下载后才能知道里面到底影片是什么,是X老师的新作,还是葫芦娃…
v9: 从磁力链取得影片截图的命令行工具
解决方案通常是迅雷下载加预览播放,不过我们都是技术人,用一些技术的手段来解决吧。
所以我开发了v9
—— 叫这个名字是因为足够的短,并且我们只要截9张图。
- NPM库地址:https://www.npmjs.com/package/v9
- Github源码地址:https://github.com/SpeedPHP/v9
v9
的开发思路:首先我们知道ffmpeg是从视频里面截图的不二之选,所以问题是如何将磁力链变成视频呢?然后是使用ffmpeg截图的一些小问题;最后,这是命令行工具,也要关注一些命令行上使用的体验。
下面展开说说相关的技术点:
WebTorrent 基于磁力链的HTTP服务
WebTorrent 是一个可以将磁力链(或种子)解析并且进行下载预览,支持range的HTTP服务。这里的关键是支持range
,也就是支持检索到影片的特定位置来进行下载播放。
WebTorrent的使用比较简单,只要对它设置好种子或者磁力链,开启服务监听端口即可。
var WebTorrent = require("webtorrent");
var client = new WebTorrent();
client.add(torrentId, function (torrent) {var server = torrent.createServer();server.listen(3003);logger.info("Torrent checked OK...");process.on('SIGINT', function () {console.log('Got a SIGINT. Ready to exit, Bye!');server.close();client.destroy();process.exit(0);});
});
上面的torrentId
是种子的地址或者磁力链地址。
FFMPEG 截取视频图片
在v9
的开始阶段,会通过ffprobe来取得影片的时长,命令如下:
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 http://127.0.0.1:3003/1/Big%20Buck%20Bunny.mp4
ffprobe可以对影片的各种属性进行比较简单的输出,通过以上的配置,可以限定了上面的命令只返回duration
,也就是影片时长的数值,方便在程序里面获取。v9
程序里面,对时长进行了简单的一个步长的处理,这是因为最后截取的一张图,不能在影片的最后,不然会出现问题。
var step = (parseInt(duration) - 20) / 8;
然后是关键的FFMPEG截取影片的命令:
ffmpeg -ss 613 -i "http://127.0.0.1:3003/1/Big%20Buck%20Bunny.mp4" -t 10 -filter_complex "select=eq(pict_type\,I)[out];[out]scale=-2:360" -f image2 -vframes 1 -an -y /Users/code/v9/2-mp4-00.10.13.jpg
-ss
参数是位移,从-i
输入的URL上面位移一些时长来获取-t 10
10秒钟的视频。
中间的-filter_complex "select=eq(pict_type\,I)[out];[out]scale=-2:360"
,是个小技巧:就是通过过滤器来选择10秒内的I帧
进行截取,这样就不会截取到模糊的过渡帧。
使用 commander 装饰命令行
接下来是对于命令行程序的使用体验,我们想要成和其他的命令工具一样,有-v
,--help
等友好且专(zhuang)业(13)的提示。这里v9
用了commander
这个库。
program.version(require('./package.json').version).description(require('./package.json').description).option('-d, --dir <string>', 'The output directory', process.cwd()).arguments('<magnetURI>').action(function (magnetURI) {infile = magnetURI});program.on('--help', function () {console.log('');console.log(' Examples:');console.log('');console.log(" $ v9 'magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c'");console.log(' $ v9 -d ' + process.cwd() + " 'magnet:?xt=urn:btih:209c8226b299b308beaf2b9cd3fb49212dbd13ec'");console.log(' $ v9 ' + process.cwd() + path.sep + 'free_torrents' + path.sep + 'sintel.torrent');
});
program.parse(process.argv);
上面一部分是输入参数,支持输入可选的路径和磁力链地址(种子地址)的参数。而下面是--help
的显示,效果是:
v9 --help
Usage: v9 [options] <magnetURI>Capture the nine screenshots for video in the magnetURI or torrent, without download.Options:-V, --version output the version number-d, --dir <string> The output directory (default: "/Users/code/v9")-h, --help display help for commandExamples:$ v9 'magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c'$ v9 -d /Users/code/v9'magnet:?xt=urn:btih:209c8226b299b308beaf2b9cd3fb49212dbd13ec'$ v9 /Users/code/v9/free_torrents/sintel.torrent
改良成无需提前下载FFMPEG
v9
在之前的版本里面是需要提前安装ffmpeg到命令行的,这样挺没趣的,因为能装ffmpeg的用户,还会缺少处理磁力链的手段吗?
所以现在的v9
新版本,加入了自动安装ffmpeg的库,这样就能真正的不需要依赖用户提前安装ffmpeg,更像是一个专(zhuang)业(13)的工具了。
主要是以下两个库的功劳:
"@ffmpeg-installer/ffmpeg": "^1.1.0","@ffprobe-installer/ffprobe": "^1.4.1"
v9的效果
以下是实验v9包内free_torrents目录里big-buck-bunny.torrent种子文件的效果:
v9 big-buck-bunny.mp4
[INFO] 23:19:46 Starting, please wait...
[INFO] 23:19:55 Torrent checked OK...
[INFO] 23:19:55 Found media: 263.34MB; Big Buck Bunny.mp4
[INFO] 23:19:57 Got 1 screenshot, total is 9, continue...
[INFO] 23:19:57 Got 2 screenshot, total is 9, continue...
[INFO] 23:19:57 Got 3 screenshot, total is 9, continue...
[INFO] 23:19:57 Got 4 screenshot, total is 9, continue...
[INFO] 23:19:57 Got 5 screenshot, total is 9, continue...
[INFO] 23:19:57 Got 6 screenshot, total is 9, continue...
[INFO] 23:19:57 Got 7 screenshot, total is 9, continue...
[INFO] 23:19:58 Got 8 screenshot, total is 9, continue...
[INFO] 23:19:58 Got 9 screenshot, total is 9, continue...
[INFO] 23:19:58 Completed the file Big Buck Bunny.mp4[INFO] 23:19:58 Finished capture 9 screenshot!
[INFO] 23:19:58 Please check the output directory '/Users/code/v9' to see the screenshots. Bye!
因为是示范的种子,下载速度并不快,所以需要耗时3分钟左右的时间,v9截取到了以下图片。
另外,还有之前对磁力链的测试结果:
v9 'magnet:?xt=urn:btih:c180f298d2516fcb7ac89a462798e4267ebb5c33'
开发一个从磁力链取得影片截图的命令行工具相关推荐
- 显示器 Linux 性能 18 (一个命令行工具传递)
对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并执行是多么的不easy.基于此原因. ...
- 命令行工具开发:如何快速实现命令行提示?
简介:对于稍微复杂一些的命令行工具,命令行的提示功能必不可少.那么对于不同语言的开发者,有没有一种简单快捷的实现方式呢?本文分享一种快速实现的方法,使用YAML文件定义命令行工具的使用规范,再通过工具 ...
- 技术员如何开发一个DAPP区块链应用(以宠物商店为例)
1. 文章摘要 [本文目标] 通过逐步的指导和截图举证,一步步带领一个技术新手完成一个宠物商店DAPP应用的开发和部署. [环境前置条件] 参考<第一课 如何在WINDOWS环境下搭建以太坊开发 ...
- 第七课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)
1. 文章摘要 [本文目标] 通过逐步的指导和截图举证,一步步带领一个技术小白完成一个宠物商店DAPP应用的开发和部署. [环境前置条件] 参考<第一课 如何在WINDOWS环境下搭建以太坊开发 ...
- 第三方模块——nodemon是一个命令行工具,用以辅助项目开发、nrm ( npm registry manager ):npm下载地址切换工具
什么是第三方模块 别人写好的.具有特定功能的.我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包. 第三方模块 nodemon nodemon是 ...
- java venus_来认识一下venus-init——一个让你仅需一个命令开始Java开发的命令行工具...
前言 不知道你是否有过这样的经历.不管你是什么岗位,前端也好,后端也罢,想去了解一下Java开发到底是什么样的,它是不是真的跟传说中的一样. 于是你拿起键盘,用触控板 ? '' : 抄起鼠标',开始了 ...
- 用PHP开发命令行工具
介绍 用过laravel开发过项目的都应该用过artisan,通过artisan我们可以在命令行中创建控制器类,Eloquent类等,今天我们将通过php来开发命令行工具 开发环境与工具 使用vagr ...
- 使用 Apache Commons CLI 开发命令行工具
http://www.ibm.com/developerworks/cn/java/j-lo-commonscli/index.html 使用 Apache Commons CLI 开发命令行工具 杨 ...
- antd 3升级命令_是时候拥有一个你自己的命令行工具了
本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具. 0. 一分钟体验 首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么 ...
最新文章
- 朴素贝叶斯算法应用实例
- 东平县农民丰收节-农业大健康·万祥军:功能性谋定生态品牌
- ITK:对给定LabelMap的所有LabelObject应用形态学关闭操作
- 使用Chrome快速实现数据的抓取(四)——优点
- 【完成发布】Lazy Line Painter – 非常有趣的 jQuery 路径动画插件
- 高级代码编辑器:sublime text 4 for Mac
- SAP License:制造企业信息化新动向
- 第三方库自动安装脚本(复习)
- 有用的网页链接的整合(不定时更新)
- Spring AOP实现及运行期调用原理分析
- 全国计算机等级证书和职业资格证书(计算机)哪个好
- 自定义铃声行业如何为应用商店铺平了道路,然后消失了
- 亲爱的朋友,祝您天天好心情!
- Flutter 项目实战 应用图标启动页三
- 2018 年全年详细工作日、周末、节假日数据json
- 【记录】ChatGPT|注册流程、使用技巧与应用推荐(更新至2022年12月14日)
- java 读取word 表格,java读取word表格方法
- 2020最新版影评小程序搭建教程(附源码获取渠道)
- EDFA的原理以及仿真
- vue实现Cnode具体有axios分页请求 | filters(过滤器)解决时间转秒前 分钟前 小时前 月前 年前
热门文章
- 自动生成sitemap地图PHP代码
- 完美解决MSSQL安装问题“Polybase要求安装Oracle JRE 7更新51(64位)”方案
- delphi----Tstringlist,将有符号的数据变成数组aaa,bbb,ccc----list[0]=aaa,list[1]=bbb
- 计算机辅助设计ca,《AutoCA计算机辅助设计》课程标准.doc
- 时光雕刻着我们的青春
- vue+element实现树状菜单并底层菜单横向排列
- php怎么让日期变成数字形似,excel如何把日期变成纯数字
- 自考计算机网络管理串讲笔记,自考“计算机网络技术”串讲
- 全球与中国锯棕榈提取物市场深度研究分析报告
- 03_建立 Windows 和虚拟机 Ubuntu 共享文件夹