V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rikka
V2EX  ›  问与答

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

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

    比方服务器放着一个 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
    内存不舍得加的话,傲腾可能会便宜些,几十块钱。
    shenjinpeng
        22
    shenjinpeng  
       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   ·   实用小工具   ·   3143 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:36 · PVG 22:36 · LAX 06:36 · JFK 09:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.