关于播放器无缝切换清晰度

2020-01-08 14:37:02 +08:00
 fgodt
最近在自己实现播放器,有一个无缝切换清晰度的功能不知道怎么实现,希望有大佬给点指导
我能想到的实现有两种
1. 两个播放器并行,一个前台播放一个后台 seek 到前台播放器附近然后解码,等后台和前台 pts 相同再显示。这样的话必定有一段时间有两个播放器并行,开销很大
2. 两个流,一个流正在解码播放,另一个要切换的流先 seek 再读取等到关键帧与播放的 pts 相同时切换解码器。这种方式我感觉过于复杂,而且不太好完美实现
希望有大佬指点下
4568 次点击
所在节点    程序员
13 条回复
royzxq
2020-01-08 14:45:22 +08:00
方案 1 是 B 站 3 年前的解决方案,高切低几乎无感知但是低切高会感知到并且有一丝卡顿。
royzxq
2020-01-08 14:46:20 +08:00
要么看看 MEPG-DASH, 现在 B 站的无感知切换应该和这个有很大关系。
fgodt
2020-01-08 14:51:29 +08:00
@royzxq 非常感谢,网页上的用 DASH 是可以实现的,他们用的 MSE 接口。不过我正在写原生平台的播放器,感觉要实现 DASH 的方法就只能方案 2
wanguorui123
2020-01-08 14:58:43 +08:00
把不同分辨率的视频切片成 TS 格式,播放器切换后切到其他清晰度的 TS 分片上,可以无缝切换清晰度。
fgodt
2020-01-08 15:07:13 +08:00
@wanguorui123 这样的话就要求视频源必须处理成 ts 切片,如果用户的视频源是 mp4 mkv 就无法切换
hardwork
2020-01-08 21:09:59 +08:00
用 2 肯定可行,原理上没啥问题,剩下的都是特定场景的有特定业务场景吧,点播
hardwork
2020-01-08 21:16:08 +08:00
用 2 肯定可行,原理上没啥问题,剩下的都是业务逻辑。收到切换事件后开始并行解码目标分辨率,然后保证无缝接入渲染队列,再把原分辨率解码停了,具体实现还是看你整个架构
fgodt
2020-01-08 21:46:57 +08:00
@hardwork 是的必须要让每个模块都支持动态切换,其实 pc 两个播放器也能搞定,但是 Android 这样的设备就比较吃力
hardwork
2020-01-08 21:53:22 +08:00
没看清楚,我好像说的是方案 1

看了看你说的方案 2,意思是想要解码前在关键帧处拼成一段码流,这样完全没有两个并行解码了,是这个意思吧.

不想要并行解码那么先停掉第一个解码器,再开启第二个解码器就可以了,事实也确实应该这么做,并行逻辑反而复杂了,当然这个切换期间保证渲染 buffer 不要耗尽,保证接缝处时间戳连续就可以了.

除非是带 startcode 的 h264 码流,且 idr 帧前是有 sps,pps 的这种你可以接起来送到解码器,否则像 mp4,mkv 不同分辨率的还是要重开解码器的
fgodt
2020-01-08 22:14:40 +08:00
@hardwork 是的如果要完美支持的话就应该就只能这样操作。
根据你最后这种思路,还有一种想法如果我把 sps pps 放到 pkt 再传给解码器不知道 ffmpeg 里的 codec 支不支持这种操作。支持的话我人为的将 mp4 等容器的数据封装成 NAl 的数据,切换时附上 sps pps 是不是就无需重新开解码器了
mxT52CRuqR6o5
2020-01-09 09:39:27 +08:00
爱奇艺似乎是切片,然后通过 js 把文件流推给播放器
fgodt
2020-01-09 10:07:31 +08:00
@mxT52CRuqR6o5 是的网页的播放器都是通过 ts 或者 dash 切片传给浏览器,这样确实可以无缝
fgodt
2020-01-09 10:14:01 +08:00
@hardwork 非常感谢大佬的提示,我做了一个简单的验证在两个文件都是 264 编码的情况下无论分辨率和码率都可以通过 NAl 的封装来达到无缝切换的效果。264 的解码器似乎都支持改变 sps pps
由此我还有一个猜想 如果都是 AAC 的流我们使用 ADTS 的流是否也可以任意改变呢?
希望这里的提示对其他还在困惑的人有帮助

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/636145

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX