EasyPlayer视频源切换

EasyPlayer视频源切换EasyPlayer现在支持多视频源快速切换了,我们介绍一下是如何实现的.这个需求通常应用在一个客户端需要查看多个视频源的情况,比如多个监控场景轮播.由于EasyPlayer的播放端已经放在Fragment了,这使得SDK层可以对好多应用层的代码做以封装,这样尽可能给开发者带来方便.比如,两个视频源切换的时候,只需要创建两个PlayFragment,然后对这两个Fragment进行显示切换,如代

大家好,又见面了,我是你们的朋友全栈君。

EasyPlayer现在支持多视频源快速切换了,我们介绍一下是如何实现的.
这个需求通常应用在一个客户端需要查看多个视频源的情况,比如多个监控场景轮播.

由于EasyPlayer的播放端已经放在Fragment了,这使得SDK层可以对好多应用层的代码做以封装,这样尽可能给开发者带来方便.比如,两个视频源切换的时候,只需要创建两个PlayFragment,然后对这两个Fragment进行显示切换,如代码所示:

public void onSwitchPlayer(View view) {
  PlayFragment f = (PlayFragment) getSupportFragmentManager().findFragmentByTag("first");
  PlayFragment s = (PlayFragment) getSupportFragmentManager().findFragmentByTag("second");

  if (!s.isHidden()){
    getSupportFragmentManager().beginTransaction().show(f).commit();
    getSupportFragmentManager().beginTransaction().hide(s).commit();
    mRenderFragment = f;
  }else{
    getSupportFragmentManager().beginTransaction().show(s).commit();
    getSupportFragmentManager().beginTransaction().hide(f).commit();
    mRenderFragment = s;
  }
}

是不是很简单?只需要对两个Fragment的显示状态进行toggle,就可以实现播放的toggle.
有的同学可能想问,这样实际上只是切换了当前显示的View,实际上视频还是会在后台播放吧?的确是这样的,为了最快地进行视频切换,不至于在切换过程中导致视频延迟\黑屏\卡顿,我们保留了后台一个视频没有释放.

这样可能有些同学觉得不好,我们也觉得不好.所以别急,接着往下看,看看PlayFragment内部又在这个过程中发生了什么:

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (hidden){
            // stop
// stopRending();
            if (mStreamRender != null) {
                mStreamRender.pause();
            }
        }else{
            if (mStreamRender != null) {
                mStreamRender.resume();
            }
        }
    }

可以看到,在一个Fragment被hidden时,播放状态实际上会暂停.而当他又显示时,播放会继续.

又有同学可能由疑问,EasyPlayer播放RTSP时,基本上是直播需求,那直播的情况下,暂停\继续又应该如何实现呢?我们是这样做的:

暂停:

    public void pause(){
        mQueue.clear();
        if (mClient != null) {
            mClient.pause();
        }
        mQueue.clear();
    }

继续:

    public void resume(){
        if (mClient != null) {
            mClient.resume();
        }
    }

暂停时,首先将缓冲队列情调,然后调用Client的暂停;继续时,调用Client的继续.那Client内部又是如何实现的?

暂停:

public void pause() {
  if (Looper.myLooper() != Looper.getMainLooper()){
    throw new IllegalThreadStateException("please call pause in Main thread!");
  }
  synchronized (_channelPause) {
    _channelPause.add(_channel);
  }
  paused = 1;
  Log.i(TAG,"pause:=" + 1);
  h.postDelayed(closeTask, 10000);
}

继续:

public void resume() {
  if (Looper.myLooper() != Looper.getMainLooper()){
    throw new IllegalThreadStateException("call resume in Main thread!");
  }
  synchronized (_channelPause) {
    _channelPause.remove(_channel);
  }
  h.removeCallbacks(closeTask);
  if (paused == 2){
    Log.i(TAG,"resume:=" + 0);
    openStream();
  }
  Log.i(TAG,"resume:=" + 0);
  paused = 0;
}

可见暂停时,在EasyRTSPClient内部,我们设置了一个暂停标志位,当这个标志位为ture时,我们收到的媒体数据并不回调给上层,而是直接丢弃.这样是不是白白浪费了流量?别急,我们post了一个task,这个task在10秒之后,会关闭流的传输.

而继续播放时,我们会将标志位设置为false,同时将task取消掉,这样,如果在10秒内快速进行暂停和恢复,实际上流并没有断开,这样切换时,用户体验是最好的.而当长时间没有恢复的时候,也会在暂停10秒后把链接关闭,不至于消耗额外的流量.

综上,实现了快速的切换.请看效果:
这里写图片描述

关于EasyPlayer流媒体播放器

An elegant, simple, fast android RTSP/RTMP/HLS/HTTP Player.EasyPlayer support RTSP(RTP over TCP/UDP)version & Pro version,cover all kinds of streaming media!EasyPlayer是一款精炼、高效、稳定的流媒体播放器,分为RTSP版、RTMP版和Pro版三个版本,支持各种各样的流媒体音视频协议和文件的播放,在安防、互联网、教育、录播、IPTV等多个领域大放异彩,广泛应用!

EasyPlayer:https://github.com/EasyDSS/EasyPlayer

点击链接加入群【EasyPlayer】:544917793

获取更多信息

邮件:support@easydarwin.org

EasyDarwin开源流媒体服务器:www.EasyDarwin.org

EasyDSS商用流媒体解决方案:www.EasyDSS.com

EasyNVR无插件直播方案:www.EasyNVR.com

Copyright © EasyDarwin Team 2012-2017

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150131.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Postgresql动态SQL

    Postgresql动态SQLPostgreSQL支持动态SQL,以PL/Pgsql为例,语法如下:EXECUTEcommand-string[INTO[STRICT]target][USINGexpression[,…]];上式中的可选项target表示arecordvariable,arowvariable,oracomma-separatedlistofsimplev…

  • Centos 7配置LAMP「建议收藏」

    Centos 7配置LAMP「建议收藏」LAMP指的Linux(操作系统)、ApacheHTTP服务器,MySQL(有时也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建立web应用平台。所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,和Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点,微软的.NET架构相比,LAMP…

  • 如何在虚拟机上安装win10系统_虚拟机安装系统的步骤

    如何在虚拟机上安装win10系统_虚拟机安装系统的步骤有些用户为了在自己的win10系统上检测一些软件,通常情况会给自己安装一个xp系统虚拟机,这样也能避免测试程序对于主系统的损害,可是win10安装xp虚拟机怎么做呢?接下来小编就带大家来了解一下win10安装xp虚拟机详细步骤。具体方法:1、首先你得去下载一个想要装载在虚拟机上的系统,一定要下载扩展名为.iso的文件。2、然后再去下载一个VMwareWorkstation的虚拟机安装软件,3、然…

  • Java生成UUID方式[通俗易懂]

    Java生成UUID方式[通俗易懂]Java生成UUID方式

  • 知乎免登录插件2021

    在电脑中使用过网页版知乎的小伙伴们应该都知道,在使用前是必须进行登录的,为此小编就带来了知乎免登录插件2021,这是专门针对知乎登录问题而打造的一个浏览器插件脚本工具。虽然之前小编也有介绍过知乎uwp版,但是也有许多人更加偏爱网页版,那么最好就是配合这个脚本插件来进行使用哦,因为在访问网页版时会强制要求你登录账号,否则根本点不进去,无法正常使用,但是有了该插件,只需要启动即可轻松帮助用户实现不登录也可正常使用知乎网页版,并只要启动了知乎免登陆脚本不仅直接免去了登陆的流程,还丝毫不会影响用户浏览其中的问题、文

  • users的权限_user是啥

    users的权限_user是啥MySQL在安装时会自动创建一个名为mysql的数据库,mysql数据库中存储的都是用户权限表。用户登录以后,MySQL会根据这些权限表的内容为每个用户赋予相应的权限。user表是MySQL中最重要的一个权限表,用来记录允许连接到服务器的账号信息。需要注意的是,在user表里启用的所有权限都是全局级的,适用于所有数据库。user表中的字段大致可以分为4类,分别是用户列、权限列、安全列、资源控制列,下面主要介绍这些字段的含义。用户列用户列存储了用户连接MySQL

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号