Android/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/EleVideo.java

103 lines
3.5 KiB
Java
Raw Normal View History

2023-11-09 08:37:59 +08:00
package com.xixun.xixunplayer;
import android.content.Context;
2023-12-01 16:17:06 +08:00
import android.view.SurfaceHolder;
import android.view.SurfaceView;
2023-11-09 08:37:59 +08:00
2023-12-01 16:17:06 +08:00
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
2023-11-09 08:37:59 +08:00
2023-12-01 16:17:06 +08:00
public class EleVideo extends SurfaceView {
2023-11-09 08:37:59 +08:00
2023-12-01 16:17:06 +08:00
IjkMediaPlayer ijkPlayer;
public EleVideo(Context context, String path, float vol) {
2023-11-09 08:37:59 +08:00
super(context);
2023-12-01 16:17:06 +08:00
initIjk(path, vol);
2023-11-09 08:37:59 +08:00
}
2023-12-01 16:17:06 +08:00
// @OptIn(markerClass = UnstableApi.class)
// void initExo(String path, float vol) {
// exoPlayer = new ExoPlayer.Builder(getContext()).build();
// exoPlayer.setMediaItem(MediaItem.fromUri(path));
// exoPlayer.setRepeatMode(ExoPlayer.REPEAT_MODE_ONE);
// exoPlayer.setSeekParameters(SeekParameters.CLOSEST_SYNC);
// exoPlayer.setVolume(vol);
// exoPlayer.setVideoSurfaceView(this);
// }
void initIjk(String path, float vol) {
ijkPlayer = new IjkMediaPlayer();
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", 1);
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
try {
getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
ijkPlayer.setDisplay(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
System.out.println("surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceDestroyed");
}
});
ijkPlayer.setDataSource(path);
ijkPlayer.setLooping(true);
ijkPlayer.setVolume(vol, vol);
ijkPlayer.prepareAsync();
} catch (Throwable e) {
Util.makeText(getContext(), e.getMessage()).show();
e.printStackTrace();
ijkPlayer = null;
}
2023-11-09 08:37:59 +08:00
}
2023-12-01 16:17:06 +08:00
void start() {
if(ijkPlayer!=null) ijkPlayer.start();
// else if(exoPlayer!=null) {
// if(exoPlayer.getPlaybackState()==ExoPlayer.STATE_IDLE) exoPlayer.prepare();
// exoPlayer.play();
// }
}
void pause() {
if(ijkPlayer!=null) {
ijkPlayer.pause();
ijkPlayer.seekTo(0);
2023-11-10 09:47:38 +08:00
}
2023-12-01 16:17:06 +08:00
// if(exoPlayer!=null && exoPlayer.isPlaying()) {
// exoPlayer.pause();
// exoPlayer.seekToDefaultPosition();
// }
2023-11-10 09:47:38 +08:00
}
2023-12-01 16:17:06 +08:00
void release() {
if(ijkPlayer!=null) {
ijkPlayer.release();
ijkPlayer = null;
2023-11-09 08:37:59 +08:00
}
2023-12-01 16:17:06 +08:00
// if(exoPlayer!=null) {
// exoPlayer.release();
// exoPlayer = null;
// }
}
String getState() {
// else if(exoPlayer!=null) {
// var state = exoPlayer.getPlaybackState();
// if(state==ExoPlayer.STATE_IDLE) return "STATE_IDLE";
// if(state==ExoPlayer.STATE_BUFFERING) return "STATE_BUFFERING";
// if(state==ExoPlayer.STATE_READY) return "STATE_READY";
// if(state==ExoPlayer.STATE_ENDED) return "STATE_ENDED";
// }
return "null";
2023-11-09 08:37:59 +08:00
}
2023-12-01 16:17:06 +08:00
@Override
public void onVisibilityAggregated(boolean isVisible) {
super.onVisibilityAggregated(isVisible);
if(isVisible) start();
else pause();
2023-11-09 08:37:59 +08:00
}
}