如何在完全不写硬盘的情况下播放一个远程视频? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rikka
V2EX    问与答

如何在完全不写硬盘的情况下播放一个远程视频?

  •  
  •   rikka 2020-10-16 14:12:45 +08:00 4311 次点击
    这是一个创建于 1890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比方服务器放着一个 MP4,我起个 nginx 然后 chrome 打开就能播放了,但这过程实际是 chrome 把视频下载到缓存中,下载就意味着有写硬盘的操作

    所以要求就是:

    1.播放过程绝对不能有写操作

    2.播放能控制进度、倍速播放

    3.最好能用浏览器播放

    4.不要用 flash 相关的技术,都 2020 了

    我一顿搜索后

    好像可以用 ffserver 把视频转成 rtmp?rtsp?来实现,这两种协议我该用哪种?

    而且 ffserver 在 2 年前被 ffmpeg 删除了啊,现在有啥代替的么?

    对视频播放这方面完全不了解,有知道的来讲讲

    48 条回复    2020-10-20 05:53:54 +08:00
    codehz
        1
    codehz  
       2020-10-16 14:43:49 +08:00
    你把浏览器缓存放 ramdisk 里就好
    chenluo0429
        2
    chenluo0429  
       2020-10-16 14:51:45 +08:00
    仿照摄像头预览的实现方式,服务端将视频流通过 websocket 按照播放速度逐帧推送给客户端,客户端解码并使用 canvas 渲染
    rikka
        3
    rikka  
    OP
       2020-10-16 14:54:59 +08:00
    @codehz #1 内存容量有限,视频往往很大,寸土寸金,万一物理内存不够系统自动去写虚拟内存这不还是在写硬盘
    rikka
        4
    rikka  
    OP
       2020-10-16 14:55:25 +08:00
    @chenluo0429 #2 这种方式能控制播放进度吗?
    yushiro
        5
    yushiro  
       2020-10-16 15:01:43 +08:00 via iPhone
    把硬盘拆了,用无盘工作站,在 chrome 里面看视频,就绝对不会有写盘操作了
    rikka
        6
    rikka  
    OP
       2020-10-16 15:02:17 +08:00
    @chenluo0429 #2 以我的理解这种服务端推流方式没法控制播放进度吧?
    想要控制播放进度不就得有个协议,客户端给服务端发个信息:“我要看看 x 分 x 秒的片段”,服务端收到后就把对应的视频数据返回给客户端
    wowboy
        7
    wowboy  
       2020-10-16 15:04:19 +08:00
    @rikka 内存有限,还不允许用硬盘,那就要求网络传输速度和播放速度强一致。然后还要求倍速播放?网络速度可以随便调吗?
    rikka
        8
    rikka  
    OP
       2020-10-16 15:06:45 +08:00
    @wowboy #7 实际情况是服务端和客户端在一个内网中,无需担心网络问题
    chenluo0429
        9
    chenluo0429  
       2020-10-16 15:48:29 +08:00
    @rikka 就是要客户端向服务端发送播放位置,速度,然后服务端对视频文件进行切分后向客户端推流。
    你不想缓存到硬盘,要么实时发送,要么放在内存里面。但是内存也是有限的,你也只能请求一个个视频片段,做好提前加载,视频推流只是分段获取视频的最极端情况
    Ediacaran
        10
    Ediacaran  
       2020-10-16 16:11:31 +08:00 via iPhone
    Samba nfs....
    rikka
        11
    rikka  
    OP
       2020-10-16 16:24:19 +08:00
    @chenluo0429 #9 道理都懂,就想找找具体的落地实现方案,客户端服务端之间交互播放位置速度等信息的协议,视频数据传输协议,服务端对视频的解码分片读取处理,客户端对应的播放器怎么搞,这一系列的问题我个人没那个能力搞定
    kop1989
        12
    kop1989  
       2020-10-16 16:41:32 +08:00
    想要问出成熟的方案估计很难。
    因为需求相对比较刁钻且矛盾(本地无缓存,甚至内存都最好不要写。还要能倍速和控制进度,还要跑在 web 环境里)。
    1 、视频不写硬盘,那么网页本身写不写硬盘?如果能写,那么网页能写视频不能写?
    2 、如果都不能写,那只能自己做浏览器了。网页数据写不写硬盘不是 web 应用这个层级决定的。
    3 、都自己做浏览器了,还拘泥于 web 应用?

    所以我觉得更脚踏实地的需求是:根据既定网络条件,如何最大限度的控制视频缓存大小。
    rikka
        13
    rikka  
    OP
       2020-10-16 16:48:38 +08:00
    @kop1989 #12 网页可以写,一个网页才几 k,但视频往往上 G
    我告诉你真实的需求是,我把视频下到内网的一台机器里,然后就是怎么播放问题,浏览器直接播放会缓存啊,视频老大大的,老写我硬盘,我心疼硬盘啊,就有了此帖
    polaa
        14
    polaa  
       2020-10-16 16:52:25 +08:00
    硬盘有什么好心疼的 还不如心疼心疼浪费的时间
    natashahollyz
        15
    natashahollyz  
       2020-10-16 16:58:25 +08:00   12
    @rikka 建议把硬盘拆了供起来,这样就不心疼了
    supermoonie
        16
    supermoonie  
       2020-10-16 17:19:05 +08:00 via iPhone
    视频切片制作成 m3u8
    rikka
        17
    rikka  
    OP
       2020-10-16 17:24:05 +08:00
    @polaa #14
    @natashahollyz #15
    一顿折腾下来既解决了需求,又多少学到点东西,岂不美哉
    rikka
        18
    rikka  
    OP
       2020-10-16 17:24:24 +08:00
    @supermoonie #16 用浏览器播放会写缓存啊
    ETiV
        19
    ETiV  
       2020-10-16 17:24:33 +08:00
    冯诺依曼要敲棺材板了……
    rikka
        20
    rikka  
    OP
       2020-10-16 17:27:17 +08:00
    @Ediacaran #10 这看起来是另外一种思路,用网络文件共享协议来搞,如果协议本实现底层在读过程不会有写操作的话,就看我本地播放器是否缓存了
    loading
        21
    loading  
       2020-10-16 17:38:41 +08:00 via Android
    内存不舍得加的话,傲腾可能会便宜些,几十块钱。
    urlk
        22
    urlk  
       2020-10-16 17:50:23 +08:00
    flv 格式, m3u8 , 参考直播推流 .

    不写硬盘 只能写内存了 .

    局域网的话 ,文件共享服务器 Samba , 不知道写不写本地硬盘缓存 .

    不如直接远程桌面管理上服务器看去, 省得写代码 .
    rikka
        23
    rikka  
    OP
       2020-10-16 18:54:52 +08:00
    @shenjinpeng #22 不知道我了解的对不对

    m3u8 不就是把视频切片,播放过程把切片从服务端读回来,如果用浏览器播放,走的是 http 协议,不还是有在写缓存吗

    而直播推流,好像可以用 websokct 来传输,是不写缓存了,但是没法控制播放进度啊
    rikka
        24
    rikka  
    OP
       2020-10-16 19:12:11 +08:00
    @shenjinpeng #22 我想了想,Samba 、nfs 这些协议假设他不写本地硬盘缓存,好像就完全满足我的需求了
    msg7086
        25
    msg7086  
       2020-10-16 19:20:40 +08:00 via Android
    samba 一把梭可以。samba 本身就相当于是一个硬盘,所以不再需要本地硬盘了。

    话说硬盘有啥好心疼的?硬盘转起来就在磨损,你 3 年疯狂读写和 3 年零读写,磨损不会差很多……
    yeqizhang
        26
    yeqizhang  
       2020-10-16 19:26:02 +08:00 via Android
    @msg7086 可能他的是金贵的固态[手动狗头]
    imn1
        27
    imn1  
       2020-10-16 19:28:28 +08:00
    pass 吧
    伪需求

    远程播放各大播放器都已经支持,基本不用考虑其中技术细节,你想想那些几十 T 的 NAS,播放视频,难道都要本地下载一次才能播?搞定传输协议就够了。至于播放器的内存缓存,就算本地视频播放也是要的,无法避免
    rikka
        28
    rikka  
    OP
       2020-10-16 19:28:46 +08:00
    @msg7086 #25 嗯,我刚刚还在想如果播放器播放过程把整个视频一点一点读进内存,导致物理内存耗光,进而至使系统去写虚拟内存,也就是变相在写硬盘呢?但应该没谁这么蠢

    心疼硬盘可能就是一种迷信吧
    rikka
        29
    rikka  
    OP
       2020-10-16 19:31:19 +08:00
    @imn1 #27 嗯,我想明白了
    rikka
        30
    rikka  
    OP
       2020-10-16 19:33:28 +08:00
    @yeqizhang #26 是固态不金贵,大概就是一种特殊性癖喽,这也导致平常写代码能不写临时文件就不写,尽可能在内存操作完成
    dtgxx
        31
    dtgxx  
       2020-10-16 19:38:16 +08:00
    不要考虑硬盘不够用,都 2020 了
    msg7086
        32
    msg7086  
       2020-10-16 19:38:48 +08:00 via Android
    @rikka (内存用久了也会坏呢( x
    linxiaojialin
        33
    linxiaojialin  
       2020-10-16 19:39:38 +08:00
    我感觉你想了解的是 [解码] ,而不是 [缓存] 问题。
    任何视频要播放都得缓存到客户端的,哪怕直播也是切成一个个小的片段文件下载到客户端,然后客户端再解码拼接播放,只不过解码当前片段后,可能就立即删除缓存文件了。

    如果直接通过 浏览器 访问 MP4,因为没有解码器,所以实际过程是变成 [下载] 然后再用本机的播放器打开下载后的 MP4 进行解码播放,而本机的播放器可能没有控制进度、倍速等等功能。
    如果通过 APP/网页 JS 访问 MP4,再用 Flash/JS/其它解码脚本 等等进行解码,就可以实现实时播放了(边下边播,感觉就像没有缓存一样,实际上还是有临时缓存的,播放完会自动删除缓存文件),然后还可以拓展 进度、倍数等功能。

    至于你说到 [内网] 大致猜到你的场景了,其实不用那么麻烦,在同一个内网下,Windows 自带有 [共享流媒体] 功能,手机下载个客户端就可以了,市场上有很多,随便搜索一个。
    azh7138m
        34
    azh7138m  
       2020-10-16 20:54:51 +08:00
    淦 你们的 xp 好奇怪哦
    rikka
        35
    rikka  
    OP
       2020-10-16 22:28:03 +08:00
    @linxiaojialin #33 其实不是啊,缓存、解码我大概都知道,我关注点在于:比方我有总计 100G 视频,那我播放完这些视频不就得往硬盘里写入 100G 缓存数据,这很“伤硬盘”,我想解决这个问题
    docx     36
    docx  
       2020-10-17 00:16:20 +08:00 via iPhone
    切片是不是增加服务端的硬盘读写了?
    natashahollyz
        37
    natashahollyz  
       2020-10-17 08:18:21 +08:00 via iPhone
    @rikka 有些东西根本就没想的必要。你上班摸鱼发这个帖子对硬盘键盘鼠标内存显示器 CPU 显卡电源都挺伤的,还挺费电,对水电站也挺伤的。建议不要水了,保护电脑,从你做起
    Rheinmetal
        38
    Rheinmetal  
       2020-10-17 08:38:10 +08:00
    看到内网那一个回复脑补了一出保密和间谍的大戏
    心想直接用液氮冻上内存照样 dump 视频 先解决录屏问题吧
    拉倒下面你给我看这个?

    怕伤硬盘 关闭虚拟内存 不用 win10 (这玩意疯狂读写硬盘 以为人人 nvme ssd )好了
    怕写坏 请上 optane 企业 ssd
    硬盘有价数据无价 有这个强迫症不如备份 /raid
    GeruzoniAnsasu
        39
    GeruzoniAnsasu  
       2020-10-17 09:49:08 +08:00 via Android
    你想想自己有没有心疼过余额宝每天多出来的那几块钱
    carlclone
        40
    carlclone  
       2020-10-17 09:53:17 +08:00
    自己写一个程序不就知道了 , 从 socket 读数据出来还能放哪里? 不是内存就是硬盘啊 , 你还想放在光纤里啊?
    cheng6563
        41
    cheng6563  
       2020-10-17 10:39:39 +08:00
    Firefox 好像有选项完全使用内存缓存
    haf007
        42
    haf007  
       2020-10-17 11:06:10 +08:00
    你需要一台群晖,局域网播放,就只写内存,
    openbsd
        43
    openbsd  
       2020-10-17 11:52:57 +08:00
    Windows RDP 远程
    应该不会写本地存储
    tkl
        44
    tkl  
       2020-10-17 13:08:58 +08:00
    你把电脑都供起来 然后服务器接上显示器吧


    有毒有病
    Ritr
        45
    Ritr  
       2020-10-17 13:18:25 +08:00
    @rikka 那往内存里写 100G 数据也会伤内存的吧,硬盘不就是买来用的吗,买个硬盘还要供起来吗?
    mscststs
        46
    mscststs  
       2020-10-17 13:34:53 +08:00
    要不你从源拉一根视频线裸传视频到显示器算了。
    cmheia
        47
    cmheia  
       2020-10-17 20:33:44 +08:00
    我也是心疼硬盘星人,分了一半内存(16G)做 RAMDISK,除了转移已知的临时目录,平时使用临时文件什么的都在里面搞
    reus
        48
    reus  
       2020-10-20 05:53:54 +08:00 via Android
    一天工资能买个硬盘用十年,居然有人心疼。难不成你想用二十年?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2559 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 12:55 PVG 20:55 LAX 04:55 JFK 07:55
    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