rikka
V2EX  ›  问与答

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

  •  
  •   rikka · Oct 16, 2020 · 5042 views
    This topic created in 2209 days ago, the information mentioned may be changed or developed.

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

    所以要求就是:

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

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

    3.最好能用浏览器播放

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

    我一顿搜索后

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

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

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

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

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

    不写硬盘 只能写内存了 .

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

    不如直接远程桌面管理上服务器看去, 省得写代码 .
    rikka
    rikka
    OP
    Oct 16, 2020
    23
    @shenjinpeng #22 不知道我了解的对不对

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

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

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

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

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

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

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

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


    有毒有病
    Ritr
    Ritr
    Oct 17, 2020
    45
    @rikka 那往内存里写 100G 数据也会伤内存的吧,硬盘不就是买来用的吗,买个硬盘还要供起来吗?
    mscststs
    mscststs
    Oct 17, 2020
    46
    要不你从源拉一根视频线裸传视频到显示器算了。
    cmheia
    cmheia
    Oct 17, 2020
    47
    我也是心疼硬盘星人,分了一半内存(16G)做 RAMDISK,除了转移已知的临时目录,平时使用临时文件什么的都在里面搞
    reus
    reus
    Oct 20, 2020 via Android
    48
    一天工资能买个硬盘用十年,居然有人心疼。难不成你想用二十年?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3827 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 111ms · UTC 05:34 · PVG 13:34 · LAX 21:34 · JFK 00:34
    ♥ Do have faith in what you're doing.