Android/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/SrcVideo.java
2026-01-23 15:14:23 +08:00

91 lines
3.4 KiB
Java

package com.xixun.xixunplayer;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.view.Surface;
import android.view.TextureView;
import androidx.annotation.NonNull;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
@SuppressLint("ViewConstructor")
public class SrcVideo extends TextureView implements TextureView.SurfaceTextureListener {
IjkMediaPlayer ijkPlayer;
Surface surface;
float vol;
long bitRate;
public SrcVideo(Context context, String path, float vol, int dur, long seek, boolean useSW) {
super(context);
this.vol = vol;
setSurfaceTextureListener(this);
ijkPlayer = new IjkMediaPlayer();
if(! useSW) {
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-avc", 1);
ijkPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-hevc", 1);
}
//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", 12);
try {
ijkPlayer.setDataSource(path);
ijkPlayer.setLooping(true);
if(Util.isAudioLoss) ijkPlayer.setVolume(0, 0);
else ijkPlayer.setVolume(vol, vol);
ijkPlayer.setOnPreparedListener((IMediaPlayer var1)->{
ijkPlayer.setOnPreparedListener(null);
if(getAlpha() < 0.25) {
ijkPlayer.pause();
var aaa = seek<1000 ? 0 : seek;
ijkPlayer.seekTo(aaa);
ijkPlayer.pause();
ijkPlayer.seekTo(aaa);
} else if(seek>=1000) ijkPlayer.seekTo(seek);
bitRate = ijkPlayer.getBitRate();
var diff = dur - ijkPlayer.getDuration();
if(diff>0 && diff<=1000) ijkPlayer.setLooping(false);
Util.println(" Seek "+seek);
});
ijkPlayer.setOnErrorListener((IMediaPlayer var1, int var2, int var3)->{
Util.println(" Video Error: "+var1+" "+var2+" "+var3);
return true;
});
ijkPlayer.prepareAsync();
} catch (Throwable e) {
Util.makeText(getContext(), Util.toStr(e)).show();
Util.printStackTrace(e);
ijkPlayer = null;
}
}
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
Util.println(" SurfaceTexture Available "+(ijkPlayer==null?"ijkPlayer==null":""));
this.surface = new Surface(surface);
ijkPlayer.setSurface(this.surface);
}
@Override
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {}
@Override
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
Util.println(" SurfaceTexture Destroyed");
return false;
}
@Override
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {}
void release() {
if(ijkPlayer!=null) {
ijkPlayer.release();
ijkPlayer = null;
}
if(surface!=null) {
surface.release();
surface = null;
}
}
}