让你在线看视频也能达到多线程下载的速度

2018-01-05 22:10:49 +08:00
 CSM

Video Funnel - 让你在线看视频也能达到多线程下载的速度


马上使用:

  1. PyPI 安装:
$ pip(3) install --user video_funnel
# or
$ sudo pip(3) install video_funnel
  1. 启动 video_funnel 的服务器:
$ vf http://tulip.ink/test.mp4
======== Running on http://0.0.0.0:8080 ========
(Press CTRL+C to quit)
  1. mpv 播放:
$ mpv http://localhost:8080

动机:

众所周知,百度网盘之类产品的视频在线播放非常模糊,下载吧又限速,于是我写了 aiodl 这个下载器,通过 EX-百度云盘 获取的直链来“多线程”下载。可是每次都要下载完才能看又十分不爽,直接用 mpv 之类的播放器播放直链又因为限速的原因根本没法看,遂有了本项目。

实现思路:

  1. 先将视频按照一定大小分块。块的大小根据视频的清晰度而异,以下载完一个块后视频可以播放为准。可通过命令行参数 --block-size/-b 来指定,默认为 8MB。
  2. 对于上一步中的一个块,再次分块——为区别改叫切片,启动多个协程来下载这些切片,以实现“多线程”提速的目的。块和切片大小一起决定了有多少个连接在同时下载。切片的大小通过 --piece-size/-p 来指定,默认为 1MB。
  3. 一个块中的切片全部下载完后,就可以将数据传给播放器了。当播放器播放这一块的时候,回到第 2 步下载下一块数据。为节省内存,设置了在内存中最多存在 2 个下载完而又没有传给播放器的块。

一些细节:

  1. 该如何把数据传给播放器呢?我最初的设想是通过标准输出,这样简单好写。但 stdio 是无法 seek 的,这就意味着你只能从视频的开头看起,无法快进 :P 如你所见,现在的解决方案是用 HTTP 协议与播放器传输数据。需要快进的时候播放器发送 HTTP Range 请求,video_funnel 将请求中的范围经过分块、切片后“多线程”下载。但这样就又带来了两个问题:

    1. 需要播放器支持从 URL 播放。mplayer、mpv 之类的命令行播放器大多都支持,但一些 Windows 的播放器就不得而知了 :P 不过可以使用 HTML 的 video 标签在浏览器播放。
    2. 怎么就没有处理 Range 请求的包啊,自己处理很麻烦的好吗~
  2. 由于下载的部分是用异步 IO 写的,与播放器交互的服务器部分就不能使用 Flask 之类阻塞的框架了,幸好 aiohttp 居然同时支持客户端和服务端。

  3. 说起来简单,实际写起来处处是坑啊 :(

参加 https://www.v2ex.com/t/405569

GitHub: https://github.com/cshuaimin/video-funnel

9927 次点击
所在节点    Python
28 条回复
nazor
2018-01-05 23:40:45 +08:00
挺好的,要是能用 js 实现就更好了。
davy1995
2018-01-05 23:47:01 +08:00
可以可以,很实用啊感觉
mingyun
2018-01-06 00:08:17 +08:00
$ pip install video_funnel
Collecting video_funnel
Could not find a version that satisfies the requirement video_funnel (from ver
sions: )
No matching distribution found for video_funnel
CSM
2018-01-06 00:11:31 +08:00
@nazor 对啊,要是 js 实现的就可以直接在浏览器播放了

@mingyun 你是不是没有用官方源?可能是还没有同步过去
zingl
2018-01-06 00:24:10 +08:00
youtube 就是这个套路
swulling
2018-01-06 00:29:52 +08:00
@mingyun 应该是 pip 版本太老升级下
diggerdu
2018-01-06 00:46:31 +08:00
mo 一波 dalao 的 aiodl 真不错
madfloyd
2018-01-06 01:10:00 +08:00
大有用处。。。搞个视频网站
netsail
2018-01-06 01:37:27 +08:00
前排围观支持!!!
ryd994
2018-01-06 01:52:38 +08:00
aria2c -x10 --stream-piece-selector=inorder
CSM
2018-01-06 02:04:42 +08:00
@ryd994 唉你看我这轮子造的,早知道有 aira2 这等神器还自己折腾什么。。。
CSM
2018-01-06 02:13:54 +08:00
不过 aira2 貌似不能快进?容我加上”边看边下“的功能 :)
linap
2018-01-06 07:59:56 +08:00
mark.摩拜大佬
wzhndd2
2018-01-06 09:36:21 +08:00
mark.摩拜大佬
chen2016
2018-01-06 10:22:44 +08:00
收藏多,回复少,一群大佬准备大干
honkew
2018-01-06 10:33:43 +08:00
这个叫做 串流播放
gabrielsong
2018-01-06 10:58:01 +08:00
膜拜大佬…
CSM
2018-01-06 11:45:10 +08:00
@chen2016 我也很奇怪为什么这么多收藏😂
zqqian
2018-01-06 12:22:56 +08:00
mark.摩拜大佬
wcsjtu
2018-01-07 12:05:11 +08:00
TS 流怎么搞……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/420476

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX