现在也该步入正题了,如何实现用MPV看B站呢?

MPV其实内嵌的youtube-dl便可以支持解析一部分视频了,但是还是远远不够。目标是高画质,会员限定等等都一网打尽。于是我转之到另一处开源项目来实现这一想法——you-get

you-get

太长不看可以直接往下跳

you-get的操作其实非常简单,只需要you-get <URL地址>就行,但真要那么简单那就太好了

you-get本质上还是个下载器,但我们想让它实现边下边播的功能,如何实现呢?

you-get 自身便提供了个参数 -p 接播放器来将解析提取后的视频源地址传给播放器来调用,但问题还是出现了,仅限单个地址。像B站现在的DASH流媒体地址解析后,用-i发现有两个,you-get立即报错。本来想让作者修复这个问题,但后面其实思索之后才发现其实是不现实的。

B站DASH流 分视频源和音频源两路(也许还有更多?)同时进行下载,其实you-get自己也知道而且会主动在下载完成之后用FFmpeg合并成一个完整的视频文件。那么有没有办法能够使mpv同时接受两个源来实现实时播放呢?通过查阅mpv文档惊喜的发现这一切都是可能的,现在我们来以用mpv播放B站上的《badapple!》(av22118703)的最高画质1080p60fps为例来演示具体步骤。

BadApple测试

1. 使用cookies.txt扩展获取Netscape cookies

感觉第一条就有些劝退了。。

这是无论是接下来要用到的you-get,mpv还是wget, curl, aria2都能支持的cookie格式

去chrome商店或是其他地方安装cookies.txt,或者其他类似的能够导出Netscape cookies格式的工具都行,然后获取在视频播放页面的Cookie,将其保存在一个txt文件里。

不过值得注意的是,对视频默认的画质设定会影响Cookies中的CURRENT_FNVAL和CURRENT_QUALITY字段,继而对you-get获取最高画质有影响,you-get只会获取到在网页里设定的默认画质为止。
发现获取不到最高画质可以试试直接改CURRENT_QUALITY对应的数字为116(1080p 60fps)或 120(4K)。

2. you-get 获取解析地址

这次没用av706是因为无法演示出1080p60fps,所以就用av22118703来演示

you-get <视频地址> -c <cookie文件地址> -i

1559481107766

-i参数用以显示更多清晰度以供选择,一般默认为最高画质,可用 --format选项选定,使用-u显示源地址

1559481522513

3. mpv直接播放

看到上面解析出来的两行地址了吗?那就是我们所需要的东西,现在的事情就交给mpv了。在Dash流模式里一般只会有两个链接,视频在上,音频在下。而普通模式出现的多行链接则是视频的分段,则需要用mpv的--merge-files选项来进行合并操作。

必选命令

所有链接都要带单引号

mpv <视频URL> --audio-file=<音频URL> --referrer='https://www.bilibili.com' --no-ytdl

  • <视频URL>
    当视频源是分段视频时,可用空格隔开多个视频源地址,并带上--merge-files,并可实现无缝衔接观看
  • --referrer
    一般默认https://www.bilibili.com就行了,实际上请求时带的却都是这个视频所在页面的地址。这个referrer就是导致了诸多下载器失效的原因。。
  • --no-ytdl
    关闭默认的ytdl解析,我们已经通过you-get拿到视频源地址了,传过去只会让ytdl报错
  • --cookies-file
    后接cookie文件地址,实验证实在播放时可有可无
  • --hwdec
    mpv的硬解选项,可用--hwdec=help发现更多可用的解码api,详情参照这里
  • --vo
    mpv的视频输出选项,同理可用--vo=help发现更多可用的视频输出设备,详情参照这里
  • --sub-file
    字幕文件。比如这里的弹幕实际上是以ASS字幕的形式加载的

好了,如今有了用mpv播放的基本姿势,就让我们来试试看吧!

效果:

1559483454084

视频带弹幕,毫无压力,接下来再是对B站最新出来的4K清晰度进行测试,性能上的巨大差异就很明显地凸显出来。mpv硬解赛高!!!
Chrome HTML5

MPV

其实有了mpv,之后的事就任你发挥了,比如用-vo=caca来实现字符画视频(终于廉价地实现了人生中第一次字符画badapple!泪目),因此还能得到在终端看B站的成就2333

1559483669172

不足

然而,其实在原本的you-get里,就算有大会员账号的Cookies还是不能够支持大会员版权番以及1080p+ 60fps高清画质,后遂经调试发现是you-get的解析还没跟上(也许是作者本身条件受限..),凭借着点皮毛,还是肝出了这个问题并提了人生第一份PR(再次泪目),然而两个多月过去了作者都没点反应,难受了。。。有需要的大家可以pull下来试试

昨天又稍微跟进了一下B站4K视频的解析(上面就是成果),要不要提呢。。还有最近B站出的模仿黑镜里的交互视频模式也研究了下,实现起来也不难,本来还想着能折腾出个方便点的脚本,只是最近真的很怠惰啊...(打死)

4.加载弹幕

还没找到相对于方便的方式(除非自己写),这里仅供参考

you-get其实就可以直接获取xml弹幕了,不过得和视频一起下载。或者使用浏览器的扩展也行。

其实B站弹幕的接口一直都没怎么变过呢,只要知道所看视频的cid就行了,现在其实在播放界面查看源码,Ctrl+F搜索一下cid= 一般后面接的数字就是了。

然后请求一下http://comment.bilibili.com/<cid>.xml就行了,这就是B站的xml弹幕文件。真是怀念,几年前就曾研究过它的格式了。。

转ASS格式可用在线的【bilibili ASS 弹幕在线转换】或者是离线的【Danmuku2Ass】,在这就不多说了

后记

之后我才了解到在B站早期没有HTML5播放器的时代,Linux用户的辛酸..(B站4年前的样子,弹幕素质有些不能忍av2137621)。

好在那时,秉着Linux用户一贯的精神,也有许多项目应运而生,BilBiliDan,BilBiliLocal,Danmuku2Ass……

而如今,随着视频接口的换代,以及HTML5播放器的普及,它们也终究成了一份时代记忆。而谁又想到之后的人只是为了追求硬解,却又有人踏上了似曾相识的道路。

听腻了什么“娱乐就用windows”“Linux桌面的意义何在”的冷嘲热讽,明明大家都在为着Linux的易用而努力着却一次又一次地被冷漠无视。不过现在的确Linux的环境也朝着好的方向发展着。看到四年前一条评论写着“希望能有一天用Linux一边看番一边吃泡面”,现在总算能笑着回答,一切都实现了呢。

嗯? 就这么结束了?其实还有一篇待我慢慢填坑,,利用mpv硬解之后剩余的性能可以干更多的事情。。在最末顺便再鄙视一下Nvidia,[Linus中指.jpg]