GSYVideoPlayer播放视频

本文详细介绍了一种基于Retrofit和RxJava的音视频直播流媒体实现方案,通过解析BigBeas和AlterBean类获取直播流地址,并利用GSYVideoPlayer进行直播播放,展示了从数据获取到播放的完整流程。
  • xml布局
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer>
  • 解析的BigBeas类
public class BigBeas {
    /**
     * message : {"audioUrl":"https://v-rtmp-ngb.qf.56.com/live/3983114_1559345783338?only-audio=1&wsSecret=026bdb2a17f14a3fe9bb339293e7dee9&wsTime=5CF1ED45&cid=1&ver=ngb&cip=ngb&get_url=6","rUrl":"https://v-ngb.qf.56.com/live/3983114_1559345783338.flv?wsSecret=026bdb2a17f14a3fe9bb339293e7dee9&wsTime=5CF1ED45&cid=1&ver=ngb&cip=ngb&get_url=9","hd":3,"sp":2,"push":1,"live":1}
     * status : 200
     */

    private MessageBean message;
    private int status;

    public MessageBean getMessage() {
        return message;
    }

    public void setMessage(MessageBean message) {
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public static class MessageBean {
        /**
         * audioUrl : https://v-rtmp-ngb.qf.56.com/live/3983114_1559345783338?only-audio=1&wsSecret=026bdb2a17f14a3fe9bb339293e7dee9&wsTime=5CF1ED45&cid=1&ver=ngb&cip=ngb&get_url=6
         * rUrl : https://v-ngb.qf.56.com/live/3983114_1559345783338.flv?wsSecret=026bdb2a17f14a3fe9bb339293e7dee9&wsTime=5CF1ED45&cid=1&ver=ngb&cip=ngb&get_url=9
         * hd : 3
         * sp : 2
         * push : 1
         * live : 1
         */

        private String audioUrl;
        private String rUrl;
        private int hd;
        private int sp;
        private int push;
        private int live;

        public String getAudioUrl() {
            return audioUrl;
        }

        public void setAudioUrl(String audioUrl) {
            this.audioUrl = audioUrl;
        }

        public String getRUrl() {
            return rUrl;
        }

        public void setRUrl(String rUrl) {
            this.rUrl = rUrl;
        }

        public int getHd() {
            return hd;
        }

        public void setHd(int hd) {
            this.hd = hd;
        }

        public int getSp() {
            return sp;
        }

        public void setSp(int sp) {
            this.sp = sp;
        }

        public int getPush() {
            return push;
        }

        public void setPush(int push) {
            this.push = push;
        }

        public int getLive() {
            return live;
        }

        public void setLive(int live) {
            this.live = live;
        }
    }
}

  • 解析的AlterBean类
public class AlterBean {


    /**
     * code : 000000
     * streamType : 1
     * url : https://1grauemttgr3nhcjzgezdcpa.ourdvsss.com/v-ngb.qf.56.com/live/3983114_1559345783338.flv?wsSecret=026bdb2a17f14a3fe9bb339293e7dee9&wsTime=5CF1ED45&cid=1&ver=ngb&cip=ngb&wsiphost=ipdbm
     */

    private String code;
    private String streamType;
    private String url;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getStreamType() {
        return streamType;
    }

    public void setStreamType(String streamType) {
        this.streamType = streamType;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

  • Interface接口
public interface MyInterface {

    @GET
    Observable<BigBeas> bigBean(@Url String url);

    @GET
    Observable<AlterBean> alterBean(@Url String url);

}
  • main方法
public class LiveActivity extends AppCompatActivity{

    private StandardGSYVideoPlayer videoPlayer;
    private OrientationUtils orientationUtils;

    String bigBaseUrl = "http://qf.56.com/play/v1/";
    String bigUrl = "http://qf.56.com/play/v1/preLoading.android?roomId=";
    String alterBaseUrl = "https://v-ngb.qf.56.com/live/";
    private Observable<BigBeas> bigBeanObservable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live);
        initView();
    }

    private void initView() {

        videoPlayer = findViewById(R.id.view);

        // RXJAVA+Retrofit获取最外层的数据
        Retrofit.Builder builder = new Retrofit.Builder();
        builder.baseUrl(bigBaseUrl);
        builder.addConverterFactory(GsonConverterFactory.create());
        builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
        Retrofit build = builder.build();

        MyInterface myInterface = build.create(MyInterface.class);
        String index = getIntent().getStringExtra("index");

        if (index.equals("1")) {
            bigBeanObservable = myInterface.bigBean(bigUrl + "520166");
        } else if (index.equals("2")) {
            bigBeanObservable = myInterface.bigBean(bigUrl + "520529");
        }
        bigBeanObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<BigBeas>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(BigBeas bigBeas) {
                        BigBeas.MessageBean message = bigBeas.getMessage();
                        String rUrl = message.getRUrl();
                        Log.i("MyCL", "rUrl" + rUrl);
                        //RXJAVA+Retrofit获取里面的数据
                        Retrofit.Builder builder1 = new Retrofit.Builder();
                        builder1.baseUrl(alterBaseUrl);
                        builder1.addConverterFactory(GsonConverterFactory.create());
                        builder1.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
                        Retrofit build1 = builder1.build();
                        MyInterface myInterface1 = build1.create(MyInterface.class);
                        Observable<AlterBean> alterBeanObservable = myInterface1.alterBean(rUrl);
                        alterBeanObservable
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(new Observer<AlterBean>() {
                                    @Override
                                    public void onSubscribe(Disposable d) {

                                    }

                                    @Override
                                    public void onNext(AlterBean alterBean) {
                                        String url = alterBean.getUrl();
                                        //GSY播放直播
                                        videoPlayer.setUp(url, true, "直播拉流");
                                        //增加封面
                                        ImageView imageView = new ImageView(LiveActivity.this);
                                        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                                        imageView.setImageResource(R.mipmap.ic_launcher);
                                        videoPlayer.setThumbImageView(imageView);
                                        //增加title
                                        videoPlayer.getTitleTextView().setVisibility(View.VISIBLE);
                                        //设置返回键
                                        videoPlayer.getBackButton().setVisibility(View.VISIBLE);
                                        //设置旋转
                                        orientationUtils = new OrientationUtils(LiveActivity.this, videoPlayer);
                                        //设置全屏按键功能,这是使用的是选择屏幕,而不是全屏
                                        videoPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() {
                                            @Override
                                            public void onClick(View v) {
                                                orientationUtils.resolveByClick();
                                            }
                                        });
                                        //是否可以滑动调整
                                        videoPlayer.setIsTouchWiget(true);
                                        //设置返回按键功能
                                        videoPlayer.getBackButton().setOnClickListener(new View.OnClickListener() {
                                            @Override
                                            public void onClick(View v) {
                                                onBackPressed();
                                            }
                                        });
                                        videoPlayer.startPlayLogic();
                                    }

                                    @Override
                                    public void onError(Throwable e) {

                                    }

                                    @Override
                                    public void onComplete() {

                                    }
                                });
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

//        String url = "https://1grauemttgr3nhcjsgyzdocy.ourdvsss.com/v-ngb.qf.56.com/live/520700_1559347358299.flv?wsSecret=bc19e7f4df5713fe48037ce93f601ed1&wsTime=5CF1C9DD&cid=1&ver=ngb&cip=ngb&wsiphost=ipdbm";




    }

<think>嗯,用户想找关于GSYVideoPlayer实现多视频播放的解决方案或者使用指南。首先,我需要回顾一下之前提供的引用内容,看看有没有相关的信息。引用1提到GSYVideoPlayer支持三种视频列表展现方式,包括满屏播放、自适应播放和滑动自动播放,这可能和多视频播放有关。引用2和3涉及到布局添加和依赖配置,而引用4提到了缓存大小的调整。用户的问题是多视频播放的实现方式、使用教程和自定义配置。那我需要结合这些引用内容,整理出一个结构清晰的回答。首先,多视频播放通常是在列表中使用,比如RecyclerView或者ViewPager,所以可能需要结合这些组件。然后,引用1中的左右滑动VP+Fragment+RecyclerView的模式应该是一个关键点,需要详细说明如何实现滑动切换和自动播放。接下来,使用教程部分应该包括依赖添加、布局配置和初始化设置。引用3提到添加GSYVideoPlayer的依赖,以及网络权限和横屏设置,这些都是基础步骤。然后,如何在列表中使用,比如在RecyclerView的ViewHolder中绑定播放器,处理滑动时的释放逻辑,可能需要参考引用2中的布局控件和引用3的代码示例。 自定义配置方面,引用4提到了缓存大小的调整,这部分可以包括如何修改缓存设置。另外,可能还有播放器样式的自定义,比如UI控件的隐藏或显示,引用3中的横屏设置也是一个配置点。性能优化部分,比如预加载和内存管理,需要确保多个视频播放时不会占用过多资源,引用1中的三种展现方式可能涉及不同的优化策略。 用户可能还会关心如何实现自动播放,比如当滑动到某个item时自动开始播放,这可能需要监听滚动事件,并在适当的时候调用播放器的start方法。同时,处理多个播放器实例,避免同时播放多个视频,这涉及到在滑动时释放上一个播放器的资源。 需要确保回答中提到的步骤都是可行的,并且代码示例正确。比如在RecyclerView的Adapter中如何绑定播放器,处理点击事件和滑动事件。还要注意配置的细节,比如网络权限、横屏设置,这些在引用3中已经提到,需要正确引用。 最后,生成相关问题,可能涉及性能优化、常见问题解决、与其他库的集成等,这些都是用户可能进一步想了解的内容。需要确保问题与多视频播放相关,并且引导用户深入探索。</think>### GSYVideoPlayer视频播放实现方案 #### 一、多视频播放核心实现方式 1. **列表容器组合方案** 使用`RecyclerView+ViewPager+Fragment`组合实现多视频容器,支持左右滑动切换视频流[^1]。关键实现步骤: ```xml <!-- 主布局 --> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. **自动播放控制逻辑** 通过`RecyclerView.OnScrollListener`监听滚动状态,实现滑动停止时自动播放: ```java recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { startAutoPlay(recyclerView); } } }); ``` 3. **多实例管理策略** 采用`Map<Integer, GSYVideoPlayer>`存储播放器实例,通过`onViewRecycled`回收不可见项的资源: ```java @Override public void onViewRecycled(@NonNull ViewHolder holder) { GSYVideoPlayer.releaseAllVideos(); super.onViewRecycled(holder); } ``` #### 二、关键配置教程 1. **基础依赖配置** 在build.gradle中添加最新依赖: ```groovy implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-java:v8.1.9-jitpack' implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-arm64:v8.1.9-jitpack' [^3] ``` 2. **播放器布局定制** 自定义播放器样式示例: ```xml <com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/player" android:layout_width="match_parent" android:layout_height="200dp" app:setEnlargeActionBar="false" app:setAutoFullWithSize="true"/> [^2] ``` 3. **缓存策略优化** 调整视频缓存策略(需在Application初始化): ```java ProxyCacheManager.DEFAULT_MAX_SIZE = 1024 * 1024 * 1024; //1GB缓存 CacheFactory.setCacheManager(ProxyCacheManager.class); [^4] ``` #### 三、高级功能实现 1. **无缝续播功能** 通过`GSYVideoOptionBuilder`保存播放进度: ```java GSYVideoOptionBuilder() .setVideoAllCallBack(new GSYSampleCallBack() { @Override public void onPrepared(String url, Object... objects) { super.onPrepared(url, objects); seekTo(url.lastPosition); //恢复进度 } }); ``` 2. **多分辨率支持** 配置多清晰度切换: ```java List<GSYVideoModel> models = new ArrayList<>(); models.add(new GSYVideoModel("标清", url1)); models.add(new GSYVideoModel("高清", url2)); GSYVideoOptionBuilder.setVideoModels(models); ``` 3. **播放状态同步** 使用`GSYVideoEventCallback`实现跨页面状态同步: ```java player.setVideoEventListener((event, data) -> { if (event == GSYVideoView.CURRENT_STATE_PLAYING) { EventBus.getDefault().post(new VideoStateEvent(true)); } }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值