|
@@ -0,0 +1,226 @@
|
|
|
+//package com.daya.orchestra.accompany.player;
|
|
|
+//
|
|
|
+//import android.content.Context;
|
|
|
+//import android.media.AudioManager;
|
|
|
+//import android.net.Uri;
|
|
|
+//import android.util.Log;
|
|
|
+//import android.view.SurfaceHolder;
|
|
|
+//
|
|
|
+//import com.cooleshow.base.utils.LOG;
|
|
|
+//import com.daya.orchestra.accompany.common.Constants;
|
|
|
+//
|
|
|
+//import java.io.IOException;
|
|
|
+//
|
|
|
+//import tv.danmaku.ijk.media.player.IMediaPlayer;
|
|
|
+//import tv.danmaku.ijk.media.player.IjkMediaPlayer;
|
|
|
+//
|
|
|
+///**
|
|
|
+// * Author by pq, Date on 2023/5/11.
|
|
|
+// */
|
|
|
+//public class CustomIJKPlayer implements IjkMediaPlayer.OnErrorListener, IjkMediaPlayer.OnCompletionListener, IjkMediaPlayer.OnPreparedListener {
|
|
|
+// public static final String TAG = "CustomPlayer";
|
|
|
+// private Context mContext;
|
|
|
+// IjkMediaPlayer mPlayer;
|
|
|
+// private boolean hasPrepared;
|
|
|
+// private boolean isStoped = false;
|
|
|
+//
|
|
|
+// private boolean isNeedMute = false;
|
|
|
+//
|
|
|
+// private int prepareSeekPosition = -1;//此字段用于选段播放
|
|
|
+//
|
|
|
+// public CustomIJKPlayer() {
|
|
|
+// initPlayer();
|
|
|
+// }
|
|
|
+//
|
|
|
+// private void initPlayer() {
|
|
|
+// if (null == mPlayer) {
|
|
|
+// mPlayer = new IjkMediaPlayer();
|
|
|
+// mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
|
|
|
+// mPlayer.setOnErrorListener(this);
|
|
|
+// mPlayer.setOnCompletionListener(this);
|
|
|
+// mPlayer.setOnPreparedListener(this);
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void setOnCompletionListener(IjkMediaPlayer.OnCompletionListener listener) {
|
|
|
+// if (mPlayer != null) {
|
|
|
+// mPlayer.setOnCompletionListener(listener);
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void play(Context context, Uri dataSource) {
|
|
|
+// hasPrepared = false; // 开始播放前讲Flag置为不可操作
|
|
|
+// isStoped = false;
|
|
|
+// initPlayer(); // 如果是第一次播放/player已经释放了,就会重新创建、初始化
|
|
|
+// try {
|
|
|
+// mPlayer.reset();
|
|
|
+// mPlayer.setDataSource(context, dataSource); // 设置曲目资源
|
|
|
+// mPlayer.prepareAsync(); // 异步的准备方法
|
|
|
+// } catch (IOException e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void play(boolean isMute, float speed,String path) {
|
|
|
+// hasPrepared = false; // 开始播放前讲Flag置为不可操作
|
|
|
+// isStoped = false; //
|
|
|
+// this.isNeedMute = isMute;
|
|
|
+// initPlayer(); // 如果是第一次播放/player已经释放了,就会重新创建、初始化
|
|
|
+// try {
|
|
|
+// mPlayer.reset();
|
|
|
+// initOptions(speed);
|
|
|
+// mPlayer.setDataSource(path); // 设置曲目资源
|
|
|
+// mPlayer.prepareAsync(); // 异步的准备方法
|
|
|
+// } catch (IOException e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// private void initOptions(float speed) {
|
|
|
+// if(speed != Constants.DEFAULT_PLAY_SPEED){
|
|
|
+// mPlayer.setSpeed(speed);
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
|
|
|
+// }
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
|
|
|
+// // 设置缓存策略
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 1);
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5);
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 4);
|
|
|
+// //硬件加速
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
|
|
|
+// // 调整同步设置
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "sync", "audio");
|
|
|
+// }
|
|
|
+//
|
|
|
+// public int getPrepareSeekPosition() {
|
|
|
+// return prepareSeekPosition;
|
|
|
+// }
|
|
|
+//
|
|
|
+// public long getExceptTargetPos(long cu) {
|
|
|
+// //用于选段评测流程 如果有选段快进则需要 按照快进开播播放的位置取
|
|
|
+// long targetPos = getPrepareSeekPosition() != -1 ? cu - getPrepareSeekPosition() : cu;
|
|
|
+// return targetPos;
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void setPrepareSeekPosition(int prepareSeekPosition) {
|
|
|
+// this.prepareSeekPosition = prepareSeekPosition;
|
|
|
+// }
|
|
|
+//
|
|
|
+// public long getCu() {
|
|
|
+// if (mPlayer != null) {
|
|
|
+// long currentPosition = mPlayer.getCurrentPosition();
|
|
|
+// return currentPosition;
|
|
|
+// }
|
|
|
+// return -1;
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// public long getT() {
|
|
|
+// if (mPlayer != null) {
|
|
|
+// long duration = mPlayer.getDuration();
|
|
|
+// return duration;
|
|
|
+// }
|
|
|
+// return -1;
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void start() {
|
|
|
+// if (isStoped) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// // release()会释放player、将player置空,所以这里需要判断一下
|
|
|
+// if (null != mPlayer && hasPrepared) {
|
|
|
+// mPlayer.start();
|
|
|
+// setVolume(isNeedMute ? 0f : 1f);
|
|
|
+// if (prepareSeekPosition > 0) {
|
|
|
+// seekTo(prepareSeekPosition);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void setVolume(float volume) {
|
|
|
+// if (mPlayer != null) {
|
|
|
+// LOG.i(TAG,"setVolume:" + volume + "hasPrepared:" + hasPrepared);
|
|
|
+// mPlayer.setVolume(volume, volume);
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void pause() {
|
|
|
+// if (null != mPlayer && hasPrepared) {
|
|
|
+// mPlayer.pause();
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void seekTo(int position) {
|
|
|
+// if (null != mPlayer && hasPrepared) {
|
|
|
+// mPlayer.seekTo(position);
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 对于播放视频来说,通过设置SurfaceHolder来设置显示Surface。这个方法不需要判断状态、也不会改变player状态
|
|
|
+// public void setDisplay(SurfaceHolder holder) {
|
|
|
+// if (null != mPlayer) {
|
|
|
+// mPlayer.setDisplay(holder);
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// public void stop() {
|
|
|
+// if (mPlayer == null) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// prepareSeekPosition = -1;
|
|
|
+// isStoped = true;
|
|
|
+// hasPrepared = false;
|
|
|
+// Log.i(TAG, "player to stop:" + hasPrepared + "-thread:" + Thread.currentThread().getName());
|
|
|
+// mPlayer.stop();
|
|
|
+// }
|
|
|
+//
|
|
|
+// @Override
|
|
|
+// public void onCompletion(IMediaPlayer iMediaPlayer) {
|
|
|
+// hasPrepared = false;
|
|
|
+// LOG.i(TAG, "onCompletion");
|
|
|
+// // 通知调用处,调用play()方法进行下一个曲目的播放
|
|
|
+// }
|
|
|
+//
|
|
|
+// @Override
|
|
|
+// public boolean onError(IMediaPlayer iMediaPlayer, int i, int i1) {
|
|
|
+// hasPrepared = false;
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+//
|
|
|
+// @Override
|
|
|
+// public void onPrepared(IMediaPlayer iMediaPlayer) {
|
|
|
+// hasPrepared = true; // 准备完成后回调到这里
|
|
|
+// start();
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void setSpeed(float speed) {
|
|
|
+// Log.i(TAG, "setSpeed:" + speed);
|
|
|
+// try {
|
|
|
+// if (mPlayer != null) {
|
|
|
+// if (speed > Constants.MAX_PLAY_SPEED) {
|
|
|
+// speed = Constants.MAX_PLAY_SPEED;
|
|
|
+// }
|
|
|
+// if (speed < Constants.MIN_PLAY_SPEED) {
|
|
|
+// speed = Constants.MIN_PLAY_SPEED;
|
|
|
+// }
|
|
|
+// mPlayer.setSpeed(speed);
|
|
|
+// mPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
|
|
|
+// }
|
|
|
+// } catch (Exception e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// public void release() {
|
|
|
+// hasPrepared = false;
|
|
|
+// isStoped = true;
|
|
|
+// mPlayer.stop();
|
|
|
+// mPlayer.release();
|
|
|
+// mPlayer = null;
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+//}
|