GSYVideoPlayer 视频播放

本文介绍如何在Android项目中集成GSYVideoPlayer库,实现视频播放功能。包括依赖添加、布局设置、代码初始化及常见问题解决,如声音画面不同步等。
1 -->implementation 'com.shuyu:GSYVideoPlayer:2.1.3' 

2

<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
    android:layout_width="match_parent"
    android:id="@+id/video_player"
    android:layout_height="match_parent"></com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer>

3

package com.cherishTang.laishou.laishou.main.activity;

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.cherishTang.laishou.R;
import com.cherishTang.laishou.util.apiUtil.StringUtil;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;

import java.util.ArrayList;
import java.util.List;

import tv.danmaku.ijk.media.player.IjkMediaPlayer;

/**
 * Created by CherishTang on 2019/3/19.
 * describe
 */
public class VideoViewActivity extends AppCompatActivity {
    private Bundle bundle;
    private String path;
    private String title;
    StandardGSYVideoPlayer videoPlayer;
    OrientationUtils orientationUtils;
String test=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.video_view_activity);
        bundle = getIntent().getExtras() == null ? new Bundle() : getIntent().getExtras();
        path = bundle.getString("path");
        title = bundle.getString("title");
        if (StringUtil.isEmpty(path)) {
            Toast.makeText(this,"播放地址错误",Toast.LENGTH_LONG).show();
            return;
        }
        init();
    }

    private void init() {
        videoPlayer =  (StandardGSYVideoPlayer)findViewById(R.id.video_player);

        String source1 = path;
        videoPlayer.setUp(source1, true, title);
        /**
         * 12、视频声音画面不同步。
         *
         * 模拟器的不接!
         *
         * 1、是否关闭了硬解码!
         *
         * 2、Activity的config是否配置了!
         *
         * 3、视频的分辨率和帧数是多少,机器是否支持的了
         *
         * 第3步可以通过尝试降低倍数:
         */
        VideoOptionModel videoOptionModel =
                new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 50);
        List<VideoOptionModel> list = new ArrayList<>();
        list.add(videoOptionModel);
        GSYVideoManager.instance().setOptionModelList(list);
        //增加封面
        ImageView imageView = new ImageView(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(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
    protected void onPause() {
        super.onPause();
        videoPlayer.onVideoPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        videoPlayer.onVideoResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (orientationUtils != null)
            orientationUtils.releaseListener();
    }

    @Override
    public void onBackPressed() {
        //先返回正常状态
        if (orientationUtils.getScreenType() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
            videoPlayer.getFullscreenButton().performClick();
            return;
        }
        //释放所有
        videoPlayer.setVideoAllCallBack(null);
        super.onBackPressed();
    }


}

以上简单视频播放完成

如需详细讲解

https://github.com/CarGuo/GSYVideoPlayer

<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)); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值