diff --git a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java index e0da52982..ac2d8a8d7 100644 --- a/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java +++ b/live/src/main/java/com/yunbao/live/utils/LiveExoPlayerManager.java @@ -14,17 +14,21 @@ import com.google.android.exoplayer2.analytics.PlaybackStats; import com.google.android.exoplayer2.analytics.PlaybackStatsListener; import com.google.android.exoplayer2.video.VideoSize; +/** + * 直播间播放器管理器 + * 通过预加载子播放器来实现无缝切换分辨率功能 + */ public class LiveExoPlayerManager { - private final int MODEL_PLAY1 = 0; - private final int MODEL_PLAY2 = 1; + private final int MODEL_PLAY1 = 0;//当前主播放器 + private final int MODEL_PLAY2 = 1;//当前子播放器 private Context mContext; private ExoPlayer player1, player2; - private SurfaceView mainView; + private SurfaceView mainView;//渲染视图 private int status = MODEL_PLAY1; private Player.Listener listener; - private boolean isSwitchUrl = false; + private boolean isSwitchUrl = false;//是否为主动切换播放器 private String TAG = "播放"; - private int playBufferIndex = 0; + private int playBufferIndex = 0;//卡顿计数器 private Handler handler; public LiveExoPlayerManager(Context mContext) { @@ -75,6 +79,9 @@ public class LiveExoPlayerManager { } + /** + * 延迟1秒还未恢复播放则认为卡顿了,可以切分辨率了 + */ private Runnable buffRunnable = new Runnable() { @Override public void run() { @@ -185,6 +192,11 @@ public class LiveExoPlayerManager { }); } + /** + * 开始播放 + * + * @param url 地址 + */ public void startUrl(String url) { isSwitchUrl = true; playBufferIndex = 0; @@ -194,6 +206,11 @@ public class LiveExoPlayerManager { getNowPlayer().play(); } + /** + * 无缝切换 + * + * @param url 地址 + */ public void switchUrl(String url) { Log.i(TAG, "switchUrl: " + url); playBufferIndex = 0; @@ -206,26 +223,44 @@ public class LiveExoPlayerManager { return MediaItem.fromUri(url); } + /** + * 获取当前播放器 + */ public ExoPlayer getNowPlayer() { return status == MODEL_PLAY1 ? player1 : player2; } + /** + * 获取下一个播放器。 + */ private ExoPlayer getNextPlayer() { return status == MODEL_PLAY1 ? player2 : player1; } + /** + * 是否正在播放 + */ public boolean isPlaying() { return getNowPlayer().isPlaying(); } + /** + * 停止播放 + */ public void stop() { getNowPlayer().stop(); } + /** + * 开始播放 + */ public void play() { getNowPlayer().play(); } + /** + * 释放播放器 + */ public void release() { player1.release(); player2.release(); diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index e61d64f3f..d3209358a 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -34,6 +34,7 @@ import com.lxj.xpopup.XPopup; import com.lxj.xpopup.core.BasePopupView; import com.lxj.xpopup.interfaces.XPopupCallback; import com.lzf.easyfloat.EasyFloat; +import com.lzy.okserver.OkDownload; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; import com.yunbao.common.utils.Bus; @@ -284,118 +285,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { return; } - if (TextUtils.isEmpty(url) || mVideoView == null) { return; } - - /*mPlayer.setObserver(new V2TXLivePlayerObserver() { - - - - @Override - public void onWarning(V2TXLivePlayer player, int code, String msg, Bundle extraInfo) { - super.onWarning(player, code, msg, extraInfo); - Log.i(TAG, "onWarning: " + "player = " + player + ", code = " + code + ", msg = " + msg + ", extraInfo = " + extraInfo); - if (code == 2105) { - // mPlayer.resumeVideo(); - // mPlayer.resumeAudio(); - mPlayer.stopPlay(); - mPlayer.startPlay(purl); - } - debugView.setText("播放警告code=" + code + " msg=" + msg); - } - - @Override - public void onVideoPlayStatusUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayStatus status, V2TXLiveDef.V2TXLiveStatusChangeReason reason, Bundle extraInfo) { - super.onVideoPlayStatusUpdate(player, status, reason, extraInfo); - //Log.i(TAG, "onVideoPlayStatusUpdate: " + "player = " + player + ", status = " + status + ", reason = " + reason + ", extraInfo = " + extraInfo); - } - - @Override - public void onAudioPlayStatusUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayStatus status, V2TXLiveDef.V2TXLiveStatusChangeReason reason, Bundle extraInfo) { - super.onAudioPlayStatusUpdate(player, status, reason, extraInfo); - //Log.i(TAG, "onAudioPlayStatusUpdate: " + "player = " + player + ", status = " + status + ", reason = " + reason + ", extraInfo = " + extraInfo); - } - - @Override - public void onPlayoutVolumeUpdate(V2TXLivePlayer player, int volume) { - super.onPlayoutVolumeUpdate(player, volume); - - } - - @Override - public void onStatisticsUpdate(V2TXLivePlayer player, V2TXLiveDef.V2TXLivePlayerStatistics statistics) { - super.onStatisticsUpdate(player, statistics); - Map taskMap = OkDownload.getInstance().getTaskMap(); - StringBuilder buffer = new StringBuilder(); - buffer.append("|"); - for (String key : taskMap.keySet()) { - DownloadTask task = taskMap.get(key); - buffer.append(task.progress.fileName).append(":"); - int status = task.progress.status; - switch (status) { - case 0: - buffer.append("无状态"); - break; - case 1: - buffer.append("等待"); - break; - case 2: - buffer.append("下载中:").append(task.progress.fraction); - break; - case 3: - buffer.append("暂停"); - break; - case 4: - buffer.append("错误"); - break; - case 5: - buffer.append("完成"); - - break; - } - - buffer.append("|"); - } - hideCover(); - String debugText = "视频码率:" + statistics.videoBitrate + "\n" + - "音频码率:" + statistics.audioBitrate + "\n" + - "FPS:" + statistics.fps + "\n" + - "CPU:" + statistics.appCpu + "\n" + - "剩余内存:" + DeviceUtils.getMemory(mContext) + "\n" + - "分辨率:" + statistics.height + "x" + statistics.width + "\n" + - "播放状态:" + mPlayer.isPlaying() + "\n" + - "运行时间:" + (System.currentTimeMillis() - CrashSaveBean.getInstance().getStartTime()) / 1000 + "\n"; - debugView.setText(debugText); - Log.i(TAG, "onStatisticsUpdate: " + JSON.toJSONString(statistics) + " |当前下载数 : " + OkDownload.getInstance().getTaskMap().size() + buffer); - if (statistics.height > statistics.width) { - videoLandscape = VIDEO_VERTICAL; - } else { - videoLandscape = VIDEO_HORIZONTAL; - } - if (statistics.fps == 0) { - OkDownload.getInstance().pauseAll(); - } else { - OkDownload.getInstance().startAll(); - } - } - - @Override - public void onSnapshotComplete(V2TXLivePlayer player, Bitmap image) { - super.onSnapshotComplete(player, image); - } - - @Override - public void onRenderVideoFrame(V2TXLivePlayer player, V2TXLiveDef.V2TXLiveVideoFrame videoFrame) { - super.onRenderVideoFrame(player, videoFrame); - } - - @Override - public void onReceiveSeiMessage(V2TXLivePlayer player, int payloadType, byte[] data) { - super.onReceiveSeiMessage(player, payloadType, data); - } - });*/ if (mPlayer.isPlaying()) { mPlayer.stop(); } @@ -1187,6 +1079,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { Player.Listener.super.onPlaybackStateChanged(playbackState); if (playbackState == Player.STATE_BUFFERING) { showLoadingDialog(); + OkDownload.getInstance().pauseAll(); } } @@ -1195,6 +1088,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { Player.Listener.super.onIsPlayingChanged(isPlaying); if (isPlaying) { hideCover(); + OkDownload.getInstance().startAll(); } } }