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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mqttnet 详解_mqttnet3.0用法

    mqttnet 详解_mqttnet3.0用法1///开源库地址:https://github.com/chkr1011/MQTTnet2///对应文档:https://github.com/chkr1011/MQTTnet/wiki/Client34usingMQTTnet;5usingMQTTnet.Client;6usingMQTTnet.Client.Options;7usingSystem;8usingSystem.T…

    2022年6月25日
  • T10接口_服务端接口和前端接口

    T10接口_服务端接口和前端接口本文适用鼎捷软件T100系列1.azzi700注册接口程序号,接口服务名2.设计器code进行签出,下载(空框架)3.设计数据接收的结构,以及开发函数进行数据处理4.程序上传,无提示则表示成功5.打开http://erp_ip/wstopprd/ws/r/awsp920,如果接口地址返回isok则接口是通过的,还可以使用工具postman或者soapui进行调用测试6.检查日志,T100的接口日志存放于$TEMPDIR或者$TEMPLOG,日志的命名规则是按天的,每天调用的所

    2022年10月20日
  • linux安装mysql8.0.16_mysql安装配置教程

    linux安装mysql8.0.16_mysql安装配置教程1.在/use/local下创建mysql文件夹mkdirmysql2.切换到mysql文件夹下cdmysql3.下载mysqlwgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz也可以直接在官方下载最新版本https://dev.mysql.com/downloads/mysql/选择linux4.解压mysqltar-zx……..

    2022年10月13日
  • Js实用函数合集

    Js实用函数合集随机数生成器Math.random()转换为整数parseInt()日期时间函数(需要用变量调用):varb=newDate();//获取当前时间b.getTime()//获取时间戳b.getFullYear()//获取年份b.getMonth()+1;//获取月份b.getDate()//获取天b.getHours()//获取小时b.getMinutes()//获取分钟b.getSeconds()//获取秒数b.getDay()//获取星期几b.get

    2022年7月27日
  • python stdout

    python stdoutpythonstdout

    2022年11月1日
  • 湖北用什么dns(lol服务器排名)

    转载自lmg360最终编辑37baby选择一个优秀快速的DNSServer,是上网的一大法宝。收集了一些湖北地区的主要DNS服务器,以作备忘。湖北电信:Name:wuhan.net.cnServedby:ns.hbwhptt.net.cn202.103.0.68ns1.wuhan.net.cn202.103.24.81ns1.hbwhptt.net.cn202.103.0.11…

    2022年4月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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