直播-视频流无缝切换

方式一:
1、通常一种切换码流方式,如系统播放器切换码流,先Stop,再Create Player,再onPrepare,再Start
方式二:
2、实际上还有一种无缝切换码流,如果是单实例播放器,点击切换码流时,不销毁播放器器,只是暂停解码。开始请求新的url中数据,比如下载了有1-2片TS流后,重新送给解码器,重新启动解码,然后渲染输出。达到无缝输出的效果。
方式三:
3、如果是多实例播放器,总的实现思路是:用两个MediaPlayer 两个 SurfaceView.
首先让一个Mediaplayer 播一个视频,一般播一个小视频,这样不占资源,这个MediaPlayer播放的时候,让它Stop在这里,可以让这个MediaPlayer 隐藏掉 ,注意不要Reset或者Release这个MediaPlayer 。然后可以让另外一个MediaPlayer 播放视频, 这个时候这个MediaPlayer 切换视频资源的时候就不会出现黑屏的现象。达到无缝效果,至于之间播放到哪个位置,很简单,可以用存储起来,另外一个MediaPlayer播放时,如果有去取下这个数据,起播后,SeekTo到对应位置。然后Start。一样是无缝。
方式四:
4、以前有参考过一个专利,思路是这样的(实际也是用了多实例):
视频流采集终端收到用户终端的规格切换请求后,保持原编码器实例继续运行,并启动一个新编码器实例;再将新视频流与原视频流进行帧号同步;然后在新视频流中选择一个关键帧,并从该关键帧开始向用户终端传送新视频流,原视频流传送完该关键帧的上一帧数据后结束,且该关键帧的帧号与原视频流的最后一个关键帧的帧号之间的间距大于新视频流GOP长度的1/2;然后再关闭原编码器实例。
具体步骤:
a、保持原编码器实例继续运行,并按用户终端所请求的新规格启动一个新编码器实例,其中的原编码器实例是指用户终端上一次所请求的原规格的编码器实例;
b、将新视频流与原视频流进行帧号同步,使该两个视频流中的各个相同内容的帧一一对应;其中,新视频流是指新编码器实例输出的视频流,原视频流是指原编码器实例输出的视频流;
c、在新视频流中选择一个关键帧,并从该关键帧开始向用户终端传送新视频流,原视频流传送完该关键帧的上一帧数据后结束,且该关键帧的帧号与原视频流的最后一个关键帧的帧号之间的间距大于新视频流GOP长度的1/2;
d、关闭原编码器实例,空出编码器硬件资源,准备下一次切换。


猜你喜欢

转载自blog.csdn.net/m0_38058826/article/details/80872096
今日推荐