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

124 lines
4.0 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-11 15:17:48 +08:00
import androidx.annotation.OptIn;
import androidx.media3.common.MediaItem;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.SeekParameters;
import tv.danmaku.ijk.media.player.IMediaPlayer;
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-11 15:17:48 +08:00
public class EleVideo extends SurfaceView implements SurfaceHolder.Callback {
2023-11-09 08:37:59 +08:00
2023-12-11 15:17:48 +08:00
String path;
float vol;
2023-12-01 16:17:06 +08:00
IjkMediaPlayer ijkPlayer;
2023-12-11 15:17:48 +08:00
ExoPlayer exoPlayer;
2023-12-01 16:17:06 +08:00
public EleVideo(Context context, String path, float vol) {
2023-11-09 08:37:59 +08:00
super(context);
2023-12-11 15:17:48 +08:00
this.path = path;
this.vol = vol;
initIjk();
2023-11-09 08:37:59 +08:00
}
2023-12-11 15:17:48 +08:00
@OptIn(markerClass = UnstableApi.class)
void initExo() {
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);
exoPlayer.prepare();
}
void initIjk() {
2023-12-01 16:17:06 +08:00
ijkPlayer = new IjkMediaPlayer();
2023-12-11 15:17:48 +08:00
//ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
2023-12-01 16:17:06 +08:00
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 {
2023-12-11 15:17:48 +08:00
getHolder().addCallback(this);
2023-12-01 16:17:06 +08:00
ijkPlayer.setDataSource(path);
ijkPlayer.setLooping(true);
ijkPlayer.setVolume(vol, vol);
2023-12-11 15:17:48 +08:00
ijkPlayer.setOnPreparedListener((IMediaPlayer var1)->{
if(ijkPlayer.getBitRate() > 12000000) {
getHolder().removeCallback(this);
release();
initExo();
}
if(isShown()) start();
});
2023-12-01 16:17:06 +08:00
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-11 15:17:48 +08:00
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(ijkPlayer!=null) 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");
}
2023-11-09 08:37:59 +08:00
2023-12-01 16:17:06 +08:00
void start() {
if(ijkPlayer!=null) ijkPlayer.start();
2023-12-11 15:17:48 +08:00
else if(exoPlayer!=null) {
if(exoPlayer.getPlaybackState()==ExoPlayer.STATE_IDLE) exoPlayer.prepare();
exoPlayer.play();
}
2023-12-01 16:17:06 +08:00
}
void pause() {
if(ijkPlayer!=null) {
ijkPlayer.pause();
ijkPlayer.seekTo(0);
2023-11-10 09:47:38 +08:00
}
2023-12-11 15:17:48 +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-11 15:17:48 +08:00
if(exoPlayer!=null) {
exoPlayer.release();
exoPlayer = null;
}
2023-12-01 16:17:06 +08:00
}
String getState() {
2023-12-11 15:17:48 +08:00
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";
}
2023-12-01 16:17:06 +08:00
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
}
}