最近做了个一站式下载的网页,套用了AriaNg(HTTP,BitTorrent,SFTP,FTP)以及自己做的任务式(支持历史记录,重启,查看输出)视频网站的下载(使用you-get)。
但是早在今年上半年you-get关闭了issue,并且更新很慢,所以我还是来比较一下现在比较流行的几个cli解析视频网站下载软件的覆盖情况
入场选手
老牌王者youtube-dl,正值当年you-get,后起之秀annie
选手介绍
youtube-dl已经有了多年历史,并且在国外玩的是风生水起,看名字也知道之前是下载youtube视频起家的,然后由于用户的需求更加广泛,所以后来支持了更多的视频网站解析,那么在国内它的使用情况又如何呢?除此之外,youtube-dl不仅安装简单(直接使用apt就能安装),还有丰富的使用说明,足以让你好好学一下午(即不易上手)!
you-get是我使用的最多的一个下载软件,由国人开发所以对国内网站支持较好,github上stars数也很多,但是最近关闭了issue,并且更新缓慢,我这次比较主要目的就是看看能否找到更好的替代品。并且安装需要依赖python,更重要的是不内置ffmpeg,对于分段视频(需要拼接)、youtube高清视频(视频音频分离,需要拼接),如果没有安装ffmpeg,那么这类视频都不能很好地支持。
annie之前没听过,这次搜罗到的,stars有8k,并且使用go开发,功能简单(易上手),希望能有个好的表现。
比赛项目
虽然每个软件基本都覆盖了数十个国内外网站,但我还是会根据我自己的使用情况来选择一些我常用的或者是非常主流的视频网站
下面表格如果打勾表示支持,并且支持最高清晰度
其中,每一项都没有做大量测试,所以只能做个大概参照,例如仅xx格式可能只是对测试用例的支持情况
youtube-dl | you-get | annie | 备注 | |
---|---|---|---|---|
B站(视频) | ✔(仅flv) | ✔(flv+mp4) | ✔(flv) | 除了annie,都不支持大会员更高清晰度 |
B站(番剧) | ✘ | 部分支持 | 部分支持 | 支持的条件不是很清楚,可能是喜久厌新 |
斗鱼(直播流、视频回放) | ✘ | ✘ | ✘ | 自从斗鱼更改了加密方式已经很久不能用了 |
爱奇艺 | ✘ | 受限支持 | ✔ | you-get:最高720p,由于使用ts流,导致需要安装ffmpeg才能下载 |
腾讯 | ✘ | 720p | ✔ | |
微博视频 | ✘ | ✘ | ✘ | 虽然都不支持,但是获取微博的直链很简单,可自己操作 |
Youtube | ✘ | ✔ | ✔ | youtube-dl不支持youtube?我崩溃了,是不是我的测试方法有问题… |
我最常用的也就上面几个,多了我也不测了,单看上面几个项目的结果基本上能得出一个结论了,不说了,我去部署annie了。。。
尾巴
测试完这些以后,我感觉确实对于广泛视频网站的支持和视频网站频繁地更新直链获取规则,加密方法等等情况而言,单凭开发者一个人的努力是远远不够的。you-get因此也关闭了issue,采取更为激进的使用pull request来提交你的issue,对于你不满足的点你可以自行完善并让该项目变得更好,希望大家也能多多为开源项目贡献自己一份力。
除此之外我还要表扬一下annie的界面和进度条,确实五颜六色的
而进度条动起来也是十分带感的,和常见的进度条不同
这两个库分别是color和process bar
补充
在使用过程中发现其实annie也是依赖ffmpeg的,并且在vps上使用annie默认下载方法速度很慢,可以修改-cs参数,修改http chunk的大小,默认单位MB,经测试3~5比较合适。
另外annie是默认不下载字幕文件的,使用-C参数开启(但是youtube的好像没效果)。
发现一个问题,在下载youtube的高清视频时,下载的音频视频是分开的,需要使用ffmpeg合并,但是annie非常慢,而you-get非常快,之后我去看了一下它们的源码,原因如下:
annie使用的是ffmpeg -i xx.mp4 -i xx.mp3 -c:v copy -c:a aac -strict experimental output
的格式,需要将音频转换为aac,所以非常慢
1
2
3
4
5
6
7
8
9
10
11
12
13
func MergeAudioAndVideo(paths []string, mergedFilePath string) error {
cmds := []string{
"-y",
}
for _, path := range paths {
cmds = append(cmds, "-i", path)
}
cmds = append(
cmds, "-c:v", "copy", "-c:a", "aac", "-strict", "experimental",
mergedFilePath,
)
return runMergeCmd(exec.Command("ffmpeg", cmds...), paths, "")
}
而you-get则是先使用ffmpeg -i xx -i xx -c copy output
,也就是音频视频的格式同时复制,这样会快很多,并且如果失败的话(如果是mp4格式),还是会调用ffmpeg -i xx.mp4 -i xx.mp3 -c:v copy -c:a aac -strict experimental output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def ffmpeg_concat_av(files, output, ext):
print('Merging video parts... ', end="", flush=True)
params = [FFMPEG] + LOGLEVEL
for file in files:
if os.path.isfile(file): params.extend(['-i', file])
params.extend(['-c', 'copy'])
params.append(output)
if subprocess.call(params, stdin=STDIN):
print('Merging without re-encode failed.\nTry again re-encoding audio... ', end="", flush=True)
try: os.remove(output)
except FileNotFoundError: pass
params = [FFMPEG] + LOGLEVEL
for file in files:
if os.path.isfile(file): params.extend(['-i', file])
params.extend(['-c:v', 'copy'])
if ext == 'mp4':
params.extend(['-c:a', 'aac'])
params.extend(['-strict', 'experimental'])
elif ext == 'webm':
params.extend(['-c:a', 'opus'])
params.append(output)
return subprocess.call(params, stdin=STDIN)
else:
return 0
所以我们可修改下载脚本,如果是youtube的链接就使用you-get下载。