DKVideoPlayer播放器之AliyunPlayer解码

关于上面提到的DKVideoPlayer简单使用,可以看上一篇文章:android视频播放器之DKVideoPlayer

这里主要是关于AliyunPlayer配置解码,及切换播放核心的工程类:

阿里云播放器:

首页引入依赖:

implementation 'com.aliyun.sdk.android:AliyunPlayer:5.5.5.1-full'

其次。是关于阿里云的中间件,代码如下:
新建 AliMediaPlayer.java :

public class AliMediaPlayer extends AbstractPlayer {
    private Context mAppContext;
    AliPlayer aliPlayer;
    int videoState = 0;
    long currentPosition = 0;
    int percent = 0;//0-100 百分比
    float netSpeed = 0f;//网速kbps

    public AliMediaPlayer(Context context) {
        mAppContext = context;
    }

    @Override
    public void initPlayer() {
        aliPlayer = AliPlayerFactory.createAliPlayer(mAppContext);
        //设置为软解码
        aliPlayer.enableHardwareDecoder(false);

        //先获取配置
        PlayerConfig config = aliPlayer.getConfig();
        //设置网络超时时间,单位ms
        config.mNetworkTimeout = 5000;
        //设置超时重试次数。每次重试间隔为networkTimeout。networkRetryCount=0则表示不重试,重试策略app决定,默认值为2
        config.mNetworkRetryCount = 2;
        //  配置请求头 refer UA
        //定义header
//            String[] headers = new String[1];
//            headers[0]="Host:xxx.com";//比如需要设置Host到header中。
//            config.setCustomHeaders(headers);
//            config.mUserAgent = "需要设置的UserAgent";
        //最大延迟。注意:直播有效。当延时比较大时,播放器sdk内部会追帧等,保证播放器的延时在这个范围内。
        config.mMaxDelayTime = 5000;
        // 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。
        config.mMaxBufferDuration = 50000;
        //高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。
        config.mHighBufferDuration = 3000;
        // 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。
        config.mStartBufferDuration = 500;
        //设置配置给播放器
        aliPlayer.setConfig(config);
        aliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
            @Override
            public void onPrepared() {
                mPlayerEventListener.onPrepared();
            }
        }); // 准备成功事件

        aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
            @Override
            public void onCompletion() {
                mPlayerEventListener.onCompletion();
            }
        }); // 播放完成事件
        aliPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
            @Override
            public void onStateChanged(int i) {
                if (i==2){//准备成功回调
//                    mPlayerEventListener.onPrepared();
                }else  if (i==3){//播放中回调
                    mPlayerEventListener.onInfo(3, 0);
                }else if (i==6) {//播放完成
//                    mPlayerEventListener.onCompletion();
                }
/*else if (i==7){//播放出错
                    mPlayerEventListener.onError();
                }
* */
                videoState = i;
            }
        });
        //视频宽高变化
        aliPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
            @Override
            public void onVideoSizeChanged(int width, int height) {
                mPlayerEventListener.onVideoSizeChanged(width, height);
            }
        });
        aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
            @Override
            public void onInfo(InfoBean infoBean) {
                if (infoBean.getCode() == InfoCode.CurrentPosition) {
                    currentPosition = infoBean.getExtraValue();
                }
            }
        });
        aliPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
            @Override
            public void onLoadingBegin() {
                mPlayerEventListener.onInfo(MEDIA_INFO_BUFFERING_START, getBufferedPercentage());
            }

            @Override
            public void onLoadingProgress(int i, float v) { //i加载进度 v网速kbps
                percent = i;
                netSpeed = v;
            }

            @Override
            public void onLoadingEnd() {
                mPlayerEventListener.onInfo(MEDIA_INFO_BUFFERING_END, getBufferedPercentage());
            }
        });
        aliPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
            @Override
            public void onError(ErrorInfo errorInfo) {
                mPlayerEventListener.onError();
            }
        });
    }



    @Override
    public void setDataSource(String s, Map<String, String> map) {
        PlayerConfig config = aliPlayer.getConfig();
        //定义header
        String[] headers = new String[map.size()];
        ArrayList<String> list = new ArrayList<>();
        for(Map.Entry<String, String> entry : map.entrySet()){
            list.add(entry.getKey()+":"+entry.getValue());
        }
        for (int i = 0; i < list.size(); i++) {
            headers[i] = list.get(i);
        }

        config.setCustomHeaders(headers);
        aliPlayer.setConfig(config);
        UrlSource urlSource = new UrlSource();
        urlSource.setUri(s);
        aliPlayer.setDataSource(urlSource);
    }

    @Override
    public void setDataSource(AssetFileDescriptor assetFileDescriptor) {

    }

    @Override
    public void start() {
        aliPlayer.start();
    }

    @Override
    public void pause() {
        aliPlayer.pause();
    }

    @Override
    public void stop() {
        aliPlayer.stop();
    }

    @Override
    public void prepareAsync() {
        aliPlayer.prepare();
        aliPlayer.start();
    }

    @Override
    public void reset() {
        aliPlayer.reset();
    }

    @Override
    public boolean isPlaying() {

        return videoState == 3;
    }

    @Override
    public void seekTo(long l) {
        aliPlayer.seekTo(l);
    }

    @Override
    public void release() {
        aliPlayer.release();
    }

    @Override
    public long getCurrentPosition() {
        return currentPosition;
    }

    @Override
    public long getDuration() {
        return aliPlayer.getDuration();
    }

    @Override
    public int getBufferedPercentage() {
        return percent;
    }

    @Override
    public void setSurface(Surface surface) {
        aliPlayer.setSurface(surface);
    }

    @Override
    public void setDisplay(SurfaceHolder surfaceHolder) {
        aliPlayer.setDisplay(surfaceHolder);
    }

    @Override
    public void setVolume(float v, float v1) {
        aliPlayer.setVolume(v);
    }

    @Override
    public void setLooping(boolean b) {
        aliPlayer.setLoop(b);
    }

    @Override
    public void setOptions() {
        aliPlayer.setAutoPlay(true);
    }

    @Override
    public void setSpeed(float v) {
        aliPlayer.setSpeed(v);
    }

    @Override
    public float getSpeed() {
        return aliPlayer.getSpeed();
    }

    @Override
    public long getTcpSpeed() {
        return (long) netSpeed;
    }
}

以及阿里云工程类 AliMediaPlayerFactory.java :

public class AliMediaPlayerFactory extends PlayerFactory<AliMediaPlayer> {

    public static AliMediaPlayerFactory create() {
        return new AliMediaPlayerFactory();
    }

    @Override
    public AliMediaPlayer createPlayer(Context context) {
        return new AliMediaPlayer(context);
    }
}

最后就是关于DKVideoPlayer动态配置播放核心的代码:
新建 MyPlayerManager.kt :

class MyPlayerManager {

    companion object{
        //0为EXO,1为aliPlayer,2为androidMedia 3为ijkPlayer
        open fun  checktFactory(kernel: String,videoView: AvVideoView) :AvVideoView{
            val factory = getCurrentPlayerFactory()
            val config = VideoViewManager.getConfig()
            val mPlayerFactoryField: Field = config.javaClass.getDeclaredField("mPlayerFactory")
            mPlayerFactoryField.isAccessible = true
            when(kernel){
                "0" -> if (factory !is ExoMediaPlayerFactory){
                    var playerFactory = ExoMediaPlayerFactory.create()
                    mPlayerFactoryField.set(config, playerFactory);
                    videoView.setPlayerFactory(playerFactory)
                }
                "1" -> if (factory !is AliMediaPlayerFactory){
                    var playerFactory = AliMediaPlayerFactory.create()
                    mPlayerFactoryField.set(config, playerFactory);
                    videoView.setPlayerFactory(playerFactory)
                }
                "2" -> if (factory !is AndroidMediaPlayerFactory){
                    var playerFactory = AndroidMediaPlayerFactory.create()
                    mPlayerFactoryField.set(config, playerFactory);
                    videoView.setPlayerFactory(playerFactory)
                }
                "3" -> if (factory !is IjkPlayerFactory){
                    var playerFactory = IjkPlayerFactory.create()
                    mPlayerFactoryField.set(config, playerFactory);
                    videoView.setPlayerFactory(playerFactory)
                }
            }
            return videoView
        }
        open fun getCurrentPlayerFactory(): Any? {
            val config: VideoViewConfig = VideoViewManager.getConfig()
            var playerFactory: Any? = null
            try {
                val mPlayerFactoryField: Field = config.javaClass.getDeclaredField("mPlayerFactory")
                mPlayerFactoryField.setAccessible(true)
                playerFactory = mPlayerFactoryField.get(config)
            } catch (e: java.lang.Exception) {
                e.printStackTrace()
            }
            return playerFactory
        }
    }


}

最后就是使用:

videoView = MyPlayerManager.checktFactory(0, videoView)

至此,关于DKVideoPlayer切换播放核心以及阿里云解码全部添加完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值