现在也该步入正题了,如何实现用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
-i
参数用以显示更多清晰度以供选择,一般默认为最高画质,可用 --format
选项选定,使用-u
显示源地址
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播放的基本姿势,就让我们来试试看吧!
效果:
视频带弹幕,毫无压力,接下来再是对B站最新出来的4K清晰度进行测试,性能上的巨大差异就很明显地凸显出来。mpv硬解赛高!!!
其实有了mpv,之后的事就任你发挥了,比如用-vo=caca
来实现字符画视频(终于廉价地实现了人生中第一次字符画badapple!泪目),因此还能得到在终端看B站的成就2333
不足
然而,其实在原本的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]
那怎样设置标题啊,标题有特殊字符甚至不能截图。
By ankh at September 3rd, 2023 at 04:03 am.
@ankh
标题可能没法改,但可通过截图名模板参数解决。
By ankh at September 3rd, 2023 at 04:11 am.
如果是课堂的付费视频,这种是不是就实现不了了,you-get的原理是获取到下载链接?
By 猫车 at March 24th, 2023 at 11:55 am.
求助。。有什么办法能让you-get直接解析b站分p视频中的某一p么?它按顺序解析太慢了 ̄﹃ ̄
By qiuchi at June 13th, 2020 at 11:13 am.
现在you-get识别的真实地址已经不可以用了, mpv会显示400, 不知道缺少了什么
By 沙丁鱼 at May 22nd, 2020 at 10:24 pm.
@沙丁鱼
我的问题, URL里面的没有删除导致的, 尴尬
By 沙丁鱼 at May 22nd, 2020 at 10:34 pm.
给你推荐一个项目https://github.com/IsoaSFlus/QLivePlayer,可以用来看b站直播,看视频功能作者也正在开发中
By mafia at April 4th, 2020 at 01:31 pm.
@mafia
感谢推荐!这里也推荐一个KikoPlay,可以用来补番,附弹幕支持。本来还在琢磨加入直播流支持,真是太感谢了
By FSpark at April 4th, 2020 at 02:01 pm.
mpv 赛高!有时候为了下载看一些羞羞的视频,写个下载脚本,再配合mpv播放,真正地边下边播OωO
By 路人甲 at January 6th, 2020 at 08:59 pm.
@路人甲
(#°Д°)惊现老司机!
By FSpark at January 7th, 2020 at 12:56 am.
视频画质是提升了,但ass弹幕只要速度一快就会非常模糊且不流畅,和b站播放器对比十分明显。盲猜是30帧渲染的锅。
以前用mpc-be的时候使用svp4拉升帧数可以让弹幕也变得很流畅。最近转用mpv还不清楚怎么结合svp4,看着模糊的弹幕感觉眼睛很难受 :(
By KirbyKFC at October 31st, 2019 at 02:28 am.
@KirbyKFC
现在就可参照官方文档进行编译,之后mpv播放时记得带上
--input-ipc-server=/tmp/mpvsocket
--hwdec=audo-copy
选项By FSpark at November 7th, 2019 at 01:38 am.
@KirbyKFC
抱歉回复晚了,刚刚测试了的确使用svp4补帧后弹幕流畅度也有极大改观,感谢提出这个问题。其他的发行版还好,主要是带有Vapoursynth支持的mpv在Ubuntu的PPA源不凑巧在今年4月份丢失了,导致现在Ubuntu上只得从源码重新编译,之前这有太多坑本来要记录放在(三)里,结果鸽到现在全忘了。。
By FSpark at November 7th, 2019 at 01:38 am.
@FSpark
@FSpark
抱歉回复晚了,你的网站邮件被Outlook自动拉进了垃圾邮箱:(
我已经成功给mpv挂载上vapoursynth+svp4了。我现在用bt下载新番,再用脚本获取弹幕,番剧体验比直接上B站还好(无需大会员+无和谐+高帧率)
By KirbyKFC at November 20th, 2019 at 10:59 pm.
@KirbyKFC
ヾ(≧∇≦*)ゝ恭喜!其实这也是我一直以来想实现的形式哈哈
By FSpark at November 20th, 2019 at 11:42 pm.
你的PR完美解决了我下载B站大会员版权番的问题,非常感谢。自己捣鼓了半天,幸好谷歌到你的博文,谢谢。
By licovery at October 5th, 2019 at 01:27 am.
@licovery
哈哈,能帮上忙就太好了,另外这边也要感谢你的star,人生中的第一颗哦>﹏<!
By FSpark at October 5th, 2019 at 09:03 pm.
我获得的分流地址不同了,mpv命令行报错
[ffmpeg] http: HTTP error 403 Forbidden
By law jiu at August 24th, 2019 at 02:28 pm.
@law jiu
这里测试正常,请提供测试样例
By FSpark at August 25th, 2019 at 01:38 am.
@FSpark
https://paste.ubuntu.com/p/pq2TRhJsmH/
By law jiu at August 25th, 2019 at 01:54 pm.
@law jiu
看到了,下次记得在链接两边加上单引号,在其他命令里也要注意 ( ´_ゝ`)
By FSpark at August 26th, 2019 at 10:48 am.
OωO好厉害
By 猫箱内の巴托拉 at July 21st, 2019 at 09:34 pm.
@猫箱内の巴托拉
∠( ᐛ 」∠)_只是瞎折腾罢了
By FSpark at July 22nd, 2019 at 09:22 pm.
厉害 交出你的脚本 我想这么看
By 无念 at July 12th, 2019 at 09:54 pm.
没有HTML5播放器的时代,Linux 直接用 Chrome 内置的 Flash 就能上B站。
By pluvet at July 12th, 2019 at 05:36 pm.
@pluvet
是的,但期间也出过不少问题...Flash就该成为历史垃圾
By FSpark at July 12th, 2019 at 06:33 pm.
@FSpark
现在的 Flash 已经成真正的垃圾了。国版强行推送广告。海外版锁区。
By pluvet at July 12th, 2019 at 07:52 pm.