直接播放 ed2k 连接有什么技术难点? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
cevincheung
V2EX    奇思妙想

直接播放 ed2k 连接有什么技术难点?

  •  
  •   cevincheung 2014-10-07 15:22:46 +08:00 10256 次点击
    这是一个创建于 4106 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在假设没有“冷门”资源,以及有海量活跃服务器的前提下。
    39 条回复    2014-10-11 09:00:51 +08:00
    fising
        1
    fising  
       2014-10-07 15:25:16 +08:00 via iPad
    腾讯迅雷都做过了
    jerryjhou
        2
    jerryjhou  
       2014-10-07 15:40:23 +08:00 via Android
    内容识别和匹配
    kslr
        3
    kslr  
       2014-10-07 16:14:25 +08:00
    binux
        4
    binux  
       2014-10-07 16:22:59 +08:00
    没有
    DearMark
        5
    DearMark  
       2014-10-07 16:34:34 +08:00   1
    水表要先拆掉
    karonl
        6
    karonl  
       2014-10-07 16:34:59 +08:00
    能识别和匹配,不行的话边下边播也是可以的
    blaboy
        7
    blaboy  
       2014-10-07 17:11:16 +08:00
    补充:转码。。压缩视频。
    cevincheung
        8
    cevincheung  
    OP
       2014-10-07 17:12:45 +08:00
    @jerryjhou
    @karonl
    有hash在,匹配应该不是问题,迅雷应该是自己搭建了一个eda的server吧。
    cevincheung
        9
    cevincheung  
    OP
       2014-10-07 17:22:34 +08:00
    @blaboy
    vlc已经可以直接播放emule下载的临时文件了。动态播放应该不是难事。
    jerryjhou
        10
    jerryjhou  
       2014-10-07 17:32:01 +08:00 via Android
    @cevincheung 合并相同内容可不能光靠hash,否则你绝对缓存不过来
    cevincheung
        11
    cevincheung  
    OP
       2014-10-07 17:36:04 +08:00
    @jerryjhou
    好吧,没仔细了解过,我理解就是根据hash找到主要文件然后请求不同分节。
    66450146
        12
    66450146  
       2014-10-07 17:52:42 +08:00
    最难的是保证开头那部分的下载速度。。。

    出于显而易见的原因,p2p 通常是分段下载的,但是播放视频需要从文件头开始的连续的一段。。。
    jsq2627
        13
    jsq2627  
       2014-10-07 18:30:41 +08:00
    楼上正解,在线播放最需要的是顺序下载。P2P很显然不合适的。
    jsq2627
        14
    jsq2627  
       2014-10-07 18:43:03 +08:00
    @jerryjhou 这个应该是是ED2K服务器做的吧,和播放器没关系吧。ED2K服务器和BT的Tracker差不多。客户端把Hash提交上去服务器返回Peers表。如果实现了Kad协议那么也可以不需要中心服务器。
    jerryjhou
        15
    jerryjhou  
       2014-10-07 18:47:55 +08:00 via Android
    @jsq2627 你不会是想不缓存直接播放吧,那绝对不可能,需要转码的。
    缓存就需要识别视频内容,否则一部电影7-8个版本难道都缓存一遍吗
    cevincheung
        16
    cevincheung  
    OP
       2014-10-07 19:21:58 +08:00
    @jerryjhou 多版本指的什么意思?根据hash不可以定位到一个指定文件吗?vlc已经可以直接播放emule下载的分段文件了
    jerryjhou
        17
    jerryjhou  
       2014-10-07 19:46:33 +08:00 via Android
    @cevincheung 同一部电影可能有很多不同清晰度,不同压缩者的资源
    love
        18
    love  
       2014-10-07 19:59:38 +08:00
    很多年前用过bitcomet较热门的源可以边下边播,不过刚开始时要缓存个几分钟。那个应该没有用服务器的,直接就是从peer端下载就播了。
    ariza
        19
    ariza  
       2014-10-07 20:00:35 +08:00 via iPad
    冷门资源多了去了
    cevincheung
        20
    cevincheung  
    OP
       2014-10-07 20:48:22 +08:00
    @jerryjhou 那不一样的文件的hash也不会一样啊 - -# 播放的是给定地址,不是播放给的片名。没有清晰度切换。
    @love 对,就类似这种,没有中枢服务器
    jerryjhou
        21
    jerryjhou  
       2014-10-07 20:52:26 +08:00 via Android
    @cevincheung 你如何做到实时转码?流媒体格式就那么几种
    yaoye0o
        22
    yaoye0o  
       2014-10-07 20:53:51 +08:00 via Android
    我一般都离线到百度云然后在线看
    jerryjhou
        23
    jerryjhou  
       2014-10-07 20:55:37 +08:00 via Android
    @cevincheung 而且你这样无意义啊,这种东西就是要下载转码后缓存,相同资源的不同版本不必进行重复下载和转码(这就需要内容识别,对付非法资源也需要)
    cevincheung
        24
    cevincheung  
    OP
       2014-10-07 20:58:26 +08:00
    @yaoye0o emule未下载完的文件可以直接用vlc播放,我尝试过各种格式了,avi/mkv/rm(vb)/wmv都可以的。
    jsq2627
        25
    jsq2627  
       2014-10-07 21:26:25 +08:00
    @jerryjhou 主流编码都可以实时解码的。不是说非得要整个文件才能解码,视频编码后都是按照时间顺序写入文件的,只要有文件的一部分,就能解码播放这部分内容。

    流媒体: http://en.wikipedia.org/wiki/Streaming_media

    Protocols

    The audio stream is compressed using an audio codec such as MP3, Vorbis or AAC.

    The video stream is compressed using a video codec such as H.264 or VP8.

    Encoded audio and video streams are assembled in a container bitstream such as MP4, FLV, WebM, ASF or ISMA.

    The bitstream is delivered from a streaming server to a streaming client using a transport protocol, such as MMS or RTP. Newer technologies such as HLS, Microsoft's Smooth Streaming, Adobe's HDS and finally MPEG-DASH have emerged to enable adaptive bitrate streaming over HTTP as an alternative to using proprietary transport protocols.

    The streaming client may interact with the streaming server using a control protocol, such as MMS or RTSP.

    我感觉你还没明白楼主在说什么问题。
    给一个ED2K链接,如何能实现边下边播?
    ED2K链接里本身含有文件的Hash,所以先要连接ED2K服务器(比如 TV Underground 等等,用过emule的话应该会熟悉这个服务器列表更新地址 http://ed2k.2x4u.de/index.html ),把Hash提交给服务器后,服务器会返回这个文件的 Peers,然后再连接每个 Peer,接受文件数据块。但是这样接受到的文件块不是从头开始连续的,为了实现边下边播,需要等文件最开头的块下载好一部分之后,交给解码器来解码,这时候视频才能开始播放。但是下载速度如果不够快,顺序解码的时候遇到了还没下完的块时,视频就得卡了,得等待这些块下载好后才能继续解码播放。
    你说的相同资源的不同版本,本身它们就是不同的文件,Hash都不一样的,下载一个文件的时候不可能下到另一个文件的数据的。
    jerryjhou
        26
    jerryjhou  
       2014-10-07 21:49:05 +08:00 via Android
    @jsq2627 很显然他是要在线播放,这就意味着需要重新编码。难道同样的视频播一次转码一次?
    jerryjhou
        27
    jerryjhou  
       2014-10-07 21:52:18 +08:00 via Android
    @jsq2627 除非他能拥有无限的计算能力,网络带宽和存储空间
    ryd994
        28
    ryd994  
       2014-10-07 22:37:24 +08:00
    @cevincheung 那是你下的足够多的前提下,解码器在没下到的地方硬撑过去了。
    如果是刚开始没多久的下载你试试看?
    ed2k根本就不是顺序下载。
    binux
        29
    binux  
       2014-10-07 22:41:58 +08:00
    ed2k 为什么不能从开始的地方开始下,优先请求靠前的分片不就完了
    有 ed2k的lib + libvlc 直接就开工做了
    cevincheung
        30
    cevincheung  
    OP
       2014-10-07 22:58:01 +08:00
    @jsq2627
    @binux
    恩,顺序下载是个问题。解决这个问题就好办,
    ed2k是按照每9500kb为一个part下载,在播放/快进/拖动的过程中,要定位到当前时间需要下载的是哪个part,然后去请求这个part,一个part约合为10MB的一个文件。然后还要考虑到credits的问题。总不能你自己只索取不提供- -#
    jsq2627
        31
    jsq2627  
       2014-10-07 23:34:33 +08:00
    @jerryjhou 原来说的是在线播放,我理解成像迅雷一样的边下边播功能了。
    这么说像迅雷云播、百度云在线播放到底是每个视频都转码了?还是有什么方法解决这个问题了?很好奇。
    binux
        32
    binux  
       2014-10-07 23:34:55 +08:00
    @cevincheung 有文件头就能算出来了(貌似),所以开始的部分非常重要。
    请求哪个分片是客户端指定的,优先下哪个随意控制,快进就跳分片下载就可以了。
    下完的分片,或者持续做种是个策略问题,和播放器没关系。

    所以说没有难点
    Biwood
        33
    Biwood  
       2014-10-08 01:09:25 +08:00
    视频转码要耗费大量的服务器资源,成本可能有点高
    cevincheung
        34
    cevincheung  
    OP
       2014-10-08 01:50:09 +08:00
    @Biwood 服务器不参与。全靠peers
    mengzhuo
        35
    mengzhuo  
       2014-10-08 09:10:58 +08:00
    迅雷会员
    要钱而已~
    mengskysama
        36
    mengskysama  
       2014-10-08 10:29:36 +08:00
    有人在BT上实现了http://www.v6speed.org/v6Speed/ 但是貌似没有开源,他这个实现原理也很简单就是控制分块优先级,不过你这个假设根本不成立,现在ed2k很多资源都是稀缺资源。
    jerryjhou
        37
    jerryjhou  
       2014-10-08 10:45:10 +08:00 via Android   1
    @jsq2627 会根据文件名和图像识别避免重复下载累死内容,但你说的对,都要转码,还需要排队
    cevincheung
        38
    cevincheung  
    OP
       2014-10-08 18:14:23 +08:00
    @jerryjhou hash标识内容。视频不需要转码,这不是在网页上使用webplayer播放,是在本地播放,libvlc可以直接播放。
    spark
        39
    spark  
       2014-10-11 09:00:51 +08:00 via iPhone
    Popcorn time
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2624 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 08:57 PVG 16:57 LAX 00:57 JFK 03:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86