V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

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

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

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

  •  
  •   cevincheung · 2014-10-07 15:22:46 +08:00 · 9860 次点击
    这是一个创建于 3707 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在假设没有“冷门”资源,以及有海量活跃服务器的前提下。
    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   ·   实用小工具   ·   1691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 16:44 · PVG 00:44 · LAX 08:44 · JFK 11:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.