怎么远程一起看电影?

关注者
55
被浏览
1,611,980

17 个回答

暑假有与女朋友一起远程看剧、看电影的需求,经过一段时间的摸索得到了这样一个完美解决方案。

之前用过腾讯会议的共享屏幕,以及视频APP上的同步播放功能。同步播放功能需要受到平台的资源限制,而腾讯会议虽然可以播放任意内容,但实测只能使用至多1Mbps的带宽,画质与音质很渣,毕竟企业的宽带是很贵的,这使得下载了不少蓝光资源的我很不爽。如果有一种方案能够不经过服务器的中继,而是设备间进行直接的网络连接,则可以充分利用本地的带宽以提高画质了。现在家用宽带的上行一般都不少于30Mbps了,实测使用10Mbps带宽时已经可以传输画质相当优秀的1080P视频了。

方案优点:

  1. 所有数据均通过互联网直达,不经过第三方服务器,保证安全性的同时,可以充分利用本地的带宽以提高画质;
  2. 低延迟,几乎是同步的画面;
  3. 多数工作只需要在Host端完成,Client端只需要下载2个APP并能获取IPv6即可;
  4. 完全免费,所需软件均为跨平台开源项目。

方案要求:

  1. 双方设备均支持IPv6,否则很难建立设备间的直连;
  2. 有一台电脑作为Host,最好有能硬件编码的独立显卡,最好使用有线网络连接;
  3. 最好会连外网(方便下载所需软件)
  4. 广域网连接时,iOS上所需工具需要使用外区账号下载。

方案简介:

Host端使用使用GeForce Experience软件(Nvidia显卡的官方工具包),使用其中的Shield串流功能。Client端购买一个Nvidia Shield(电视盒子兼游戏主机)。这二者是Nvidia为了游戏串流而给出的解决方案,配合起来进行局域网的游戏画面串流。Nvidia号称这是业内最优秀的游戏串流方案。

真实方案当然不是这样的。事实上,Nvidia Shield已经在国内停售,并随后停止在国内提供服务了,而GeForce Experience在未连接国际网络的情况下也是无法打开Shield服务的。前者,即Client端,使用开源工具Moonlight替代;后者,即Host端,可以通过灵活的策略继续使用GeForce Experience,或者使用本文建议的开源工具Sunshine替代。Moonlight和Sunshine,多么搭配的项目名字。

因此总结一下最终的解决方案:

在PC上使用Sunshine作为Host,在远程设备上使用Moonlight作为Client,并使用Tailscale组建点对点的虚拟局域网。

具体方案:

方案中假设只有2台设备,且Host端为Windows系统。多台设备或其它操作系统同理。

第一步-配置IPv6

如果你有把握确信双方设备可以通过IPv4直连,则可以跳过IPv6的配置步骤。例如如果双方设备连在同一所大学的校园网内则往往可以通过局域网IPv4地址直连。否则,请获取公网IPv6。以下几条为获取IPv6的一些建议。

  1. (Windows设备)打开Windows的IPv6支持。

具体方法可以自行搜索或参考这一篇文章:

当然如果Client端也用的Windows设备的话,则也需要打开IPv6。

一般来说安卓、iOS设备都是默认打开IPv6支持了的。

2. (双方均需要)打开入户宽带的IPv6功能。

2.1 如果使用的是各大运营商提供的家庭宽带,可能需要在光猫中打开IPv6功能,具体方法请自行百度:XX运营商光猫打开IPv6的方法。这里可能要用到自家运营商光猫的管理员账户和密码(例如移动光猫往往是CMCCAdmin/aDm8H%MdA)。

2.2 如果使用的是CERNET2(即教育网),一般都自动打开了IPv6,或者需要去管理后台设置一下。

2.3 或者,如果确定路由器支持IPv6功能的话,也可以将光猫改为桥接模式,然后打开路由器的IPv6功能。

2.4 如果以上通用方法解决不了,可以联系自家网络提供商的人工客服,要求他们提供IPv6或询问一下IPv6的开启办法。

3. (双方均需要)打开路由器的IPv6功能。

如果路由器支持IPv6的话,在设置页面打开IPv6选项即可(百度查一下:XX品牌路由器设置网址)。

如果路由器同时支持UPnP功能的话(不用管这是干啥的),最好也打开,因为有的教育网环境只给每一户分配一个IPv6地址,这时候UPnP就必须打开才行。

如果路由器不支持IPv6,或尝试了以上方法还是不行,可以尝试把路由器的模式修改为桥接模式(亦称Bridge模式),这样的话路由器就只提供链路层功能而对其上的网络层数据包进行直接转发,那么理论上来说不论路由器是否支持IPv6,只要入户宽带支持IPv6就行了。

4. (双方均需要)检测IPv6功能是否正常运行。

访问https://test-ipv6.com,若有IPv6地址,且得分为满分,则IPv6已得到支持。如果加载速度慢,也可以尝试其国内镜像网站https://testipv6.cn来检测。

第二步-使用Tailscale组建虚拟局域网

1. (一个人完成即可)注册Tailscale账号。

可以直接访问这个网址https://login.tailscale.com/start,貌似目前只能选择用谷歌账号、微软账号或GitHub账号注册。我是用的GitHub账号注册的。

2. (双方均需要)下载Tailscale客户端。

官方下载网址是:https://tailscale.com/download,Windows/MacOS/Linux可以直接从官网下载。

安卓安装包可以从F-Droid下载:https://f-droid.org/zh_Hans/packages/com.tailscale.ipn,但建议连外网去APKMirror下载:https://www.apkmirror.com/apk/tailscale-inc/tailscale

iOS或iPadOS需要在App Store登录外区账号下载(自己想办法注册或去某宝买)。

3. (双方均需要)在Tailscale软件中登录账号。

这是Tailscale唯一不如Zerotier先进的地方,必须每个终端都登录相同的账号才能进入同一虚拟局域网。而Zerotier中会给虚拟局域网分配一个唯一ID,每个终端只需要输入该ID就可以加入到对应的虚拟局域网。

4. (仅Host端)记住Host端在虚拟局域网内的IP地址。

登录进入Tailscale的管理界面即可看到所有设备的IP地址:https://login.tailscale.com/admin/machines

或者直接在任务栏右键Tailscale,点击一下This device: XXX(IP地址),Host端的IP地址就被复制到了剪切板。单击Network device > XXX > YYY 可以复制其它设备的IP地址。

5. (可选步骤)测试网络连通性。可以ping一下远程设备的IP地址以检查连通性,具体方法不再赘述。

第三步-Sunshine的安装(仅Host端)

在GitHub中下载Windows的安装包:https://github.com/SunshineStream/Sunshine/releases/latest

后缀为.exe的即为Windows版本安装包。下载后安装即可。

第四步-Moonlight的安装(仅Client端)

Moonlight是可以直接从国内应用商店下载的,方法不再赘述。其官网是:https://moonlight-stream.org

第五步-进行串流

  1. (Host端)运行Sunshine,并访问其设置界面:https://localhost:47990 ,初次访问时会要求设置一个登录账户密码,接下在上方菜单进入pin栏目(或直接访问https://localhost:47990/pin),在这个页面等待Client端的配对请求。
  2. (Client端)运行Moonlight,选择手动添加Host,输入之前记住了的虚拟局域网中的Host端IP地址,点击确定后会显示一个4位的PIN,将该PIN告诉另一方。
  3. (Host端)将上一步得到的PIN输入进去,点击Send即可,即完成了配对与串流。

串流步骤到此就初步结束了。下边还有一些我觉得有用的补充建议。

补充建议:

  1. 按照Sunshine官方的建议,把Sunshine设置为管理员启动。据说这样会增强实时性。

方法是找到Sunshine的桌面快捷方式 > 右键 > 属性 > 快捷方式 > 高级 > 选择“用管理员身份运行”

2. Moonlight在移动设备上的一些有用的设置选项:

点左上角的Settings或从屏幕左侧往右划即可打开设置页面。

最上边的Resolution是分辨率,一般1080P就够用;

Frame Rate是屏幕刷新率,一般看剧选30就够用;

Bitrate是视频数据的比特率,一般来说按他自动设置的数值就够用,或者自己酌情增加或减少一点,1080P/30FPS下,比特率高于10Mbps我就感受不到区别了;如果对双方网速自信可以调高点。

Touch Mode,这个选择右边的Touchscreen,否则屏幕上会显示虚拟按键;

HEVC Video,打开这个会使用H265编码,不打开则使用H264,我看有人评测的Nvidia显卡的硬件编码性能,H265编码的画质似乎还不如H264,不过差别也很小,所以这个选项开不开其实没啥影响。建议型号较旧的显卡关闭此项;

Frame Pacing Preference,这个建议选右边的Smoothest Video,毕竟这里不需要远程操控,对实时性要求没那么高;

Statistics Overlay,这个打开后会显示串流的相关信息,例如刷新率、码率、丢帧率等。

3. Sunshine:

具体可以参考官方文档:https://sunshinestream.readthedocs.io/en/latest

如果需要使用AMD显卡或CPU编码,可以在Sunshine设置界面设置。

4. 串流的同时进行语音通话——如果消除回声:

如果直接在串流的同时进行语音通话,则会把Client端的麦克风音频串流回去,导致Client端会听到自己的回声。这个问题可以使用一个叫做VoiceMeeter的虚拟声卡软件来完美解决。官网是https://voicemeeter.com

这个软件分standard、banana、potato三个版本,功能依次增强,且standard和banana版是免费的,而功能最强的potato是收费的。这里使用banana即可满足需求。

VoiceMeeter Banana在安装后会生成2个虚拟输出设备(VoiceMeeter InputVoiceMeeter AUX Input)和2个虚拟输入设备(VoiceMeeter OutputVoiceMeeter AUX Output),虚拟输出设备即可以将声音输出至这个设备,因此对应于VoiceMeeter是输入;生成的一对虚拟设备是并行关系,AUX是辅助的意思。

这样配置即可:

将语音通话中来自Client的声音输出至VoiceMeeter AUX Input,而将其它的音频(直接在Windows状态栏音频设置选择即可)输出至VoiceMeeter Input,最后再将VoiceMeeter InputVoiceMeeter AUX Input的输出均设置为用来播放声音的物理设备即可。这样,Host端的物理设备会同时播放系统声音与语音声音,但却只会对系统声音进行串流,因此Client端就不会听到回声了。

目前Sunshine虽然表面可以手动选择串流的声卡,但似乎还没有实现其功能,只会串流Sunshine启动时的系统默认输出设备,因此如上配置好VoiceMeeter和Windows音频输出后直接运行Sunshine就行了。

做一下科普:

首先,介绍一下Moonlight这个开源项目。乍一看会以为Moonlight是Nvidia为了使其串流能够跨平台而开源的官方项目。然而其实,这是2013年某次黑客比赛中,一支美国大学生队伍所创立的项目,并随后得到了持续发展。众所周知,Nvidia一直抗拒拥抱开源,直到22年5月才破天荒地开源了其Linux驱动,这个Shield串流其实是一个必须使用Nvidia官方硬件才能实现的完全闭源的方案,而Moonlight就是一帮学生把这个私有串流协议给破解了而开发出的Client端,并且为多种平台编写了前端代码。

其次,介绍一下Sunshine这个开源项目。这是Nvidia串流协议的Host端的开源实现,用以替代GeForce Experience,同样由一群开源爱好者组成的社区进行维护。最初是由loki-47-6F-64创立,但不知为何loki从21年底就不再维护该项目了,也没有再在Moonlight社区中参与过讨论。于是维护者们将项目克隆到了Sunshine Stream的名下,并继续维护这个项目。Sunshine是一个跨PC平台的项目,可以运行在Windows、Linux或MacOS上,并且扩展了对于编码硬件的支持,目前除了支持Nvidia显卡硬件编码,还支持AMD显卡硬件编码以及使用CPU进行软件编码。此外,还有一个网页前端用于对串流进行设置。

虽然GeForce Experience也可以作为Host端,但本文强烈建议使用Sunshine作为Host端,一来支持伟大的开源反对邪恶的闭源;二来GeForce Experience需要连接一下国际互联网才能开启Shield功能,而Sunshine开箱即用;三来GeForce Experience对于声卡的限定很烦,即开始串流后会强制PC将音频输出到一个特定的虚拟声卡,虽然也能用邪道方法解决,但比较麻烦,而Sunshine可以对声卡进行方便的配置,此外还可以对串流进行一些其它的个性化配置(比如最重要的可以串流至多个Client功能,以及冗余编码的比率、使用可变码率还是恒定码率、编码选项等)。GeForce Experience的串流功能一开始就只是想让用户完全按照Nvidia的模式去运行,初衷是卖自家的电视盒子。而Sunshine与Moonlight是借鉴了Nvidia的技术方案,为造福广大有串流需求的人们以及实现自己的技术理想而创立的开源项目。

再次,介绍一下组建虚拟局域网的方案。

为什么要组建虚拟局域网呢?因为当前的互联网虽然名为“互联网”,但由于NAT和防火墙入站规则的存在,其实一点都不互联,因此需要使用一定的方法让这些设备能够绕开NAT的限制,并穿透防火墙进行直连,使两台设备能够像接入了同一局域网一样可以直接访问,并且由于视频串流需要较高带宽,因此这两台设备必须是以直连的方式进行通信,而不能是引入第三方服务器进行数据的中继。IPv4下,由于各种复杂的(甚至是多重的)NAT的存在,两台设备几乎不可能实现直连,因此本文所述的解决方案要求必须双方所有设备均支持IPv6才行。幸运的是,我国的IPv6发展走在国际前列,覆盖率已经相当高了,2022年的今天,几乎各大运营商的宽带、教育网络、移动网络均支持IPv6。如果你的网络不支持IPv6,最大的可能是你的路由器没有打开IPv6功能或由于型号较早而不直接支持,因为工信部从19年才要求所有家庭网关设备支持并默认打开IPv6功能。我会在具体解决方案中给出开启IPv6的方法。双方有了IPv6后,如果Host端没有防火墙限制的话,理论上说是可以不需要虚拟局域网软件而直接连接的,但我这里还是建议直接使用一步到位的虚拟局域网软件,比较方便。

一开始,根据Moonlight社区的建议,我使用了Zerotier这个工具组建虚拟局域网。Zerotier是个很好的开源项目,个人可以免费组建不超过50个节点的虚拟局域网。但用了一段时间Zerotier后发现,Moonlight每隔15-30分钟就会无缘无故地断开连接一次,还得手动重新连接,很影响看剧体验。这种现象持续了半个月后我实在忍不了了,开始寻找解决方案。一开始我把原因归咎于串流方案上,于是尝试在Zerotier下使用搭建局域网内直播服务器的方法,但这种直播方案最少会有1.5秒的延迟,在延迟方面无论如何也无法和串流相比,体验也不好,遂放弃。于是切换到了Tailscale来组虚拟局域网,就没有这个问题了,真是相见恨晚,因为Tailscale在网络质量、UI美观和易用性上都优于Zerotier。Tailscale是一个部分开源的项目(功能代码开源,部分UI代码闭源),基于WireGuard项目开发,个人认为其性能和安全性在理论上都要优于Zerotier,个人可以免费使用不超过20个节点,唯一缺点就是需要在每一个设备上登录同一个账号,而不像Zerotier一样输入局域网的ID就可以加入。其实从一开始我就知道Zerotier和Tailscale这两个虚拟局域网工具,但由于Moonlight官方推荐了Zerotier,于是前前后后用了了半个多月,属实悲伤。后来翻Moonlight的issues看到早就有人注意到这个断连的问题了,这个issue里说是iOS的Zerotier软件的问题,通过降Zerotier版本可以解决,但正经人谁会去降版本呢。

最后,

我研究过使用直播来分享屏幕的方法,这种方法延迟较高,不推荐,但这里我也把探索出的可行方案简单分享一下,即搭建一个本地的直播服务器,然后将桌面使用特定的工具和直播协议推流到本地直播服务器,再在另一台设备拉流观看。推流可以使用OBSFFmpeg,都支持硬件编码;直播服务器可以选择SRS(国产开源直播服务器)、Nimble(一个俄罗斯公司开源的直播服务器,但设置UI面板闭源),或直接使用OBS的插件obs-rtspserver(最方便);直播协议比较多,我主要尝试了SRT和RTSP,延迟降低到1.5S左右就再也降不下去了;观看可以使用VLC来看RTSP流,或上述俄罗斯公司开发的Larix Player来看SRT流。

实际上用Sunshine+Moonlight串流时,其内部也使用了RTSP协议,但不知为何串流可以将延迟降到几乎实时,而直播方案同样使用RTSP协议却不行。可能这就是通用直播与私有串流的区别吧。

用钉钉试试