上一篇 讲了使用 SyncPlay 和朋友一起看电影的办法。这篇讲一讲使用 VLC 串流播放电影的办法。
大体来说,这种办法类似于以前一度流行的网络电台。一个主持人负责开设视频流服务器,其它人连上去即可收看。主持人这边的配置略需要折腾,但参与者那边是比较轻松的,只要往播放器里填一个地址就行。用这种方法和朋友分享电影也有一些缺点。除去主持人这边设置有些门槛(本文就意在消除这种门槛)外,对网络条件要求颇高,要是有几十个朋友一起看的话,恐怕谁家的网络都支撑不住,只适合三五好友一起观影。虽然说播放进度是同步的,但是主持人按播放和暂停之后,都要等小一会儿所有人的屏幕才会有反应,这种延迟也是其它方法没有的。
VLC 是一款很流行的开源媒体播放器。本来叫作 VideoLAN Client,从名字可以看出 VideoLAN 这个计划本来是为了提供一套在网上串流分享视频的工具,播放器只是它的 client 端。后来它的 client 端使用的人越来越多,其 server 端的功能也被整合到播放器里,播放器遂改名为 VLC Player。
整合之后,VLC 的在线串流功能和转码功能是做在一起的。在线串流不过是转码的一个特殊应用——区别仅仅是输出。转码的输出是文件,而串流的输出是一个网络视频流。这项功能的使用并不复杂,界面也还算简单,唯一不好的地方是,虽说顺的时候很顺,一路鼠标点点点就可以过去,可是有时候也会掉坑,想从坑里爬出来的话就需要点技术知识,自带的帮助实在不算友好。
所以写这篇短文介绍一下基本操作和常见的坑。
基本操作
基本操作网上图文教程很多,就不写太细了。
- 启动 VLC 之后,Media 菜单选择 Stream,弹出 Open Media 对话框,按 Add 按钮添加需要播放的视频文件。如果电影文件不止一个,可以依次添加。然后按 Stream 按钮开始串流设置向导。
- 点 Next,出现协议选择对话框。一般选择 HTTP 协议,然后点击 add 按钮。端口和路径可以使用默认值,也可以自行修改。
- 下一步是转码设置。可以选择转码或者不转码。这是最容易掉坑的地方,下文详细讨论。一般来说,如果收看的人网络条件都不错,不想占用 CPU 的话就不要转码。
- 最后确认所有参数并点击 stream 按钮,VLC 会开始播放视频,但是窗口是黑色的。此时可以在另一个 VLC 或者其它播放器中打开
http://IP地址:端口号
来访问以验证服务是否启动成功。将此地址分享给朋友之后,朋友就可以在视频播放器上使用此地址观看视频
- 在播放时,只有主持人可以拖拉进度条、播放和暂停。其它人只能选择看或者不看。需要一起语音聊天讨论剧情的话,另外开一个语音聊天软件就可以。
也可以通过命令行的方式来启动服务,复制第4步中显示的命令行参数并保存,即可在下次使用命令行直接启动服务。命令行大致形如: vlc 文件名 转码输出参数
官方的帮助见 Streaming HowTo New
FAQ
- 如何获得用于分享给别人的播放地址?
播放地址分为两部分。一个是 IP 地址或者域名,一个是端口号。
如果服务端和播放端都在同一个局域网,或者服务端有公网 IP,那么直接使用服务端的 IP 地址即可。Windows 下可以在 cmd 中敲ipconfig
获得 IP 地址。Linux 下可以用ip a
命令查看 IP 地址。有自己域名的人可以把域名绑定到 IP 上方便记忆。不过我想有域名的人都不需要人教如何查看 IP 地址。
如果服务端在路由器后面的话,参见下面一个问题。
端口号就是第2步所填写的端口号。默认是 8080。 -
电脑在路由器后面怎么办?
如果运行服务的电脑在路由器后面,播放视频的朋友不在同一个网段,就得配置端口转发。当然如果就是在自己家里播放,自己家里收看,无须做端口转发。
登入路由器的管理界面之后,设置一条端口转发规则,将一个对外的 TCP 端口A转发到自己开设服务的电脑上 VLC 所侦听的端口B。B端口就是第2步所设置的端口,默认是 8080。
填写端口转发规则时,对外端口可以随便填,推荐大于 1024,但是不能大于 65535。转发的目标 IP 如前一问所述,可以通过ipconfig
或者ip
命令查看。
在和人分享播放地址时,IP地址要填写自己路由器的公网地址(可以通过访问各种显示当前 IP 的网站来查看自己的 IP。比如说直接在 Google 里搜索 “My IP address”,Google 就会告诉你。),端口号要填写被转发的端口A,而不要填写端口B。 -
什么时候需要转码?
转码会占用相当的 CPU 资源。所以如无必要可以不转码。
视频码率太高,以至于网络无法负载,视频严重卡顿的时候需要转码。
照前述基本操作步骤无法观看视频的时候有可能是视频或音频格式不兼容,此时可以试试转码看能否解决问题。值得一提的是 DTS 音轨不支持串流,必须转码。
蓝光原盘兼具码率过高和 DTS 音轨两个问题,必须转码。详见下节的讨论 -
可以使用 HTTP 之外的协议吗?
可以。VLC 提供的各种串流选项都可以用。只是 HTTP 用的最多,兼容性最强。
-
可以挂字幕吗?
原则上可以。在第3步转码选项中有字幕选项。字幕有软硬两种(英文说法是 Closed Caption 和 Open Caption)。软字幕指的是播放者可以自行决定字幕开关,而硬字幕是直接修改了视频画面。
软字幕有两种格式选择,硬字幕选项通过勾选 “Overlay subtitles on the video” 实现。
我没发现任何一种软字幕选项可以在 VLC 客户端播放,可能有些格式可以在智能电视上播放,但我没有测试。
如上述,VLC 支持在转码的同时将字幕硬压到视频流中。如果要这样做的话,必须选择对视频进行转码。硬压的字幕只有主持人可以选择字幕,其它人只能接受主持人选择的字幕。主持人在播放时正常在窗口中右键选择字幕即可。 -
如何实时监视播出效果?
实时监视播放效果是必须的。不然岂不是只给别人放电影,自己只能盯着黑屏幕,比电影放映员还惨。
有两个办法。一个是第4步提到的,再开一个 VLC 窗口,填上播放地址之后进行收看。优点是可以确保自己看到的效果和其它观众看到的效果一模一样。缺点是设置不当的话会占用自己的网络带宽,可以同时支持的观众数目减一。
另一个办法是在第2步添加 HTTP 协议的时候,勾选 “Display locally”。优点是不会占用网络带宽,缺点是体会不到其它观众的延迟(扶额,这也许不是缺点,只是不能与民同乐)。此外有时会有不明故障,明明别人都可以正常收看,自己却无法看到图像。
几个特殊问题
如果按以上步骤操作一切顺利,读者无需查看此节。这里只对一些特殊问题给出解答。
转码的参数设置
在第3步中,VLC 有几个预设好的转码方案。通常来说,第一个 H264 视频/MP3 音频/MP4 封装的选项具有最好的兼容性。也可以根据需要选用其中其它的预设。
如果要修改某个预设,按扳手图标;如果要新增预设,按最右的图标。
视频转码非常消耗 CPU,如果只有音频格式不兼容需要转码,视频不想动的话,可以新建一个仅对音频转码的预设。也可以直接在第4步的命令行参数中删掉 vcodec
选项。
特别需要指出的是,很多时候音频流不仅要看编码,也要看采样率。至少,在很多时候对于来自光盘的 DTS 和 AC3 音轨,使用默认的 44.1kHz 采样率无法正确编解码,需要改为 48kHz 才能让观众正常收听。
视频编码推荐 H264,因为兼容性良好而且相对于 H265 更节省 CPU。如果自信自己的机器性能非常强大,所有观众的播放软件都足够新,可以使用 H265 编码以节约网络带宽。但该 GUI 界面并不能指定使用多少线程进行编码,如有必要用到 CPU 的全部能力,需要在命令行中指定线程数,参见官方帮助和示例。
视频码率可以不填,VLC 会自动选择一个画质损失不大的码率。视频质量之类的参数不必深究,VLC 使用 FFmpeg 进行编解码,若需要全面了解其参数选项建议研读 FFmpeg 的帮助。
音频编码一般来说 MPEG4/AAC 就足够好了,而且兼容性很好,几乎所有设备都可以播放。MP3、AC3 之类的格式都有点太老了。其它新格式的兼容性不如 AAC。码率可根据个人对音质的要求酌情选择。
蓝光原盘的推荐设置
当源文件为蓝光原盘时,必须转码。原因有二,首先是 DTS 格式音轨无法串流必须做音频转码;其次码率过高,大部分情况下网络无法流畅播放。
蓝光原盘的音轨大多为多声道 DTS 格式。音频转码的时候必须选择 48kHz 采样率,否则没有声音。
也许有人觉得自己网络条件非常好,想只对音频转码而保持视频不转码,但这会遇到严重的音画不同步问题,非常不建议这样做。
软字幕无法正常传送到其它 VLC 客户端,需要在第3步选择将字幕硬压到视频流中。参见 FAQ 第5问的解答。
当然实时转码的话,未免有点损失画质,使用蓝光原盘作为源文件的优点也就没有了。如果希望有比实时转码更好一点的画质的话,建议事先转码,串流播放的时候不转码。
事前转码可以继续用 VLC。但若希望仔细调节码率和画质参数,建议研究FFmpeg,直接使用 FFmpeg 丰富的参数进行定制。懒得研究 FFmpeg 的话,可以使用 HandBrake 这一 FFmpeg 的 GUI 界面。HandBrake 内置了许多预设,可以直接套用。
和朋友一起看电影系列