package com.pukka.videoplayertv; import android.content.Context; import android.net.Uri; import android.view.Surface; import android.view.SurfaceHolder; import java.io.FileDescriptor; import java.io.IOException; import java.util.Map; import tv.danmaku.ijk.media.bmiptvplayer.HyMediaPlayer; import tv.danmaku.ijk.media.bmiptvplayer.IMediaPlayer; /** * Author: xjy * Date: 2022/11/23 14:12 * Description: 软终端播放器 */ public class SoftMediaPlayer extends AbstractMediaPlayer { private static final String TAG = "SoftMediaPlayer"; //软终端播放器 private final HyMediaPlayer mHyMediaPlayer; private final Object mInitLock = new Object(); //是否销毁 private boolean mIsReleased; /** *初始化 * */ public SoftMediaPlayer(Context context) { synchronized (mInitLock) { mHyMediaPlayer = new HyMediaPlayer(context); initLister(); } } /** *初始化 * */ public SoftMediaPlayer(Context context, int playerType){ synchronized (mInitLock) { mHyMediaPlayer = new HyMediaPlayer(context,playerType); initLister(); } } /** * 设置SurfaceHolder * */ @Override public void setDisplay(SurfaceHolder sh) { if(null !=mHyMediaPlayer) { if(!mIsReleased) { mHyMediaPlayer.setDisplay(sh); } } } /** * 设置视频源 * */ @Override public void setDataSource(Context context, Uri uri) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.setDataSource(context,uri); } } /** * 设置视频源 * */ @Override public void setDataSource(Context context, Uri uri, Map headers) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.setDataSource(context,uri,headers); } } /** * 设置视频源 * */ @Override public void setDataSource(FileDescriptor fd) throws IOException, IllegalArgumentException, IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.setDataSource(fd); } } /** * 设置视频源 * */ @Override public void setDataSource(String path) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.setDataSource(path); } } /** * 获取视频源 * */ @Override public String getDataSource() { if(null != mHyMediaPlayer){ return mHyMediaPlayer.getDataSource(); } return null; } /** * 开始准备 * */ @Override public void prepareAsync() throws IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.prepareAsync(); } } /** * 播放 * */ @Override public void start() throws IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.start(); } } /** * 停止 * */ @Override public void stop() throws IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.stop(); } } /** * 暂停 * */ @Override public void pause() throws IllegalStateException { if(null != mHyMediaPlayer){ mHyMediaPlayer.pause(); } } @Override public void setScreenOnWhilePlaying(boolean screenOn) { if(null!= mHyMediaPlayer){ mHyMediaPlayer.setScreenOnWhilePlaying(screenOn); } } @Override public int getVideoWidth() { if(null != mHyMediaPlayer) { return mHyMediaPlayer.getVideoWidth(); } return 0; } @Override public int getVideoHeight() { if(null != mHyMediaPlayer) { return mHyMediaPlayer.getVideoHeight(); } return 0; } /** * 是否在播放 * */ @Override public boolean isPlaying() { if(null != mHyMediaPlayer) { return mHyMediaPlayer.isPlaying(); } return false; } /** * 定点播放 * */ @Override public void seekTo(long msec) throws IllegalStateException { if(null != mHyMediaPlayer) { mHyMediaPlayer.seekTo(msec); } } /** * 当前Position * */ @Override public long getCurrentPosition() { if(null != mHyMediaPlayer){ return mHyMediaPlayer.getCurrentPosition(); } return 0; } /** * 获取Duration * */ @Override public long getDuration() { if(null != mHyMediaPlayer){ return mHyMediaPlayer.getDuration(); } return 0; } /** * 销毁播放器 * */ @Override public void release() { if(null != mHyMediaPlayer){ mIsReleased = true; mHyMediaPlayer.release(); resetListeners(); } } /** * 复位 * */ @Override public void reset() { if(null != mHyMediaPlayer){ mHyMediaPlayer.reset(); resetListeners(); } } @Override public void setSpeed(float speed) { } @Override public float getSpeed() { return 0; } /** * 设置声音 * */ @Override public void setVolume(float leftVolume, float rightVolume) { if(null != mHyMediaPlayer){ mHyMediaPlayer.setVolume(leftVolume, rightVolume); } } @Override public int getAudioSessionId() { if(null != mHyMediaPlayer){ mHyMediaPlayer.getAudioSessionId(); } return 0; } @Override public MediaInfo getMediaInfo() { if(null != mHyMediaPlayer){ mHyMediaPlayer.getMediaInfo(); } return null; } public void setLogEnabled(boolean enable) { if(null != mHyMediaPlayer){ mHyMediaPlayer.setLogEnabled(enable); } } @Override public boolean isPlayable() { if(null != mHyMediaPlayer){ return mHyMediaPlayer.isPlayable(); } return false; } @Override public void setAudioStreamType(int streamtype) { if(null != mHyMediaPlayer){ mHyMediaPlayer.setAudioStreamType(streamtype); } } @Override public void setKeepInBackground(boolean keepInBackground) { if(null != mHyMediaPlayer){ mHyMediaPlayer.setKeepInBackground(keepInBackground); } } @Override public int getVideoSarNum() { if(null != mHyMediaPlayer){ return mHyMediaPlayer.getVideoSarNum(); } return 0; } @Override public int getVideoSarDen() { if(null != mHyMediaPlayer){ return mHyMediaPlayer.getVideoSarDen(); } return 0; } @Override public void setWakeMode(Context context, int mode) { if(null != mHyMediaPlayer){ mHyMediaPlayer.setWakeMode(context,mode); } } @Override public void setLooping(boolean looping) { if(null != mHyMediaPlayer){ mHyMediaPlayer.setLooping(looping); } } @Override public boolean isLooping() { if(null != mHyMediaPlayer){ return mHyMediaPlayer.isLooping(); } return false; } @Override public ITrackInfo[] getTrackInfo() { return null; } /** * 设置Surface * */ @Override public void setSurface(Surface surface) { if(null != mHyMediaPlayer){ mHyMediaPlayer.setSurface(surface); } } @Override public int getBufferPercentage() { return 0; } /** * 播放器回调 * onInfo onBufferingUpdate onCompletion onError onPrepared onSeekComplete onVideoSizeChanged * */ private void initLister(){ if(null == mHyMediaPlayer){ return; } mHyMediaPlayer.setOnInfoListener(new IMediaPlayer.OnInfoListener() { @Override public boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) { // TODO: 2023/4/2 放开会报错。。不知道为什么 notifyOnInfo(i,i1); return false; } }); mHyMediaPlayer.setOnBufferingUpdateListener(new IMediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(IMediaPlayer iMediaPlayer, int i) { notifyOnBufferingUpdate(i); } }); mHyMediaPlayer.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() { @Override public void onCompletion(IMediaPlayer iMediaPlayer) { notifyOnCompletion(); } }); mHyMediaPlayer.setOnErrorListener(new IMediaPlayer.OnErrorListener() { @Override public boolean onError(IMediaPlayer iMediaPlayer, int i, int i1) { notifyOnError(i,i1); return false; } }); mHyMediaPlayer.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() { @Override public void onPrepared(IMediaPlayer iMediaPlayer) { notifyOnPrepared(); } }); mHyMediaPlayer.setOnSeekCompleteListener(new IMediaPlayer.OnSeekCompleteListener() { @Override public void onSeekComplete(IMediaPlayer iMediaPlayer) { notifyOnSeekComplete(); } }); mHyMediaPlayer.setOnVideoSizeChangedListener(new IMediaPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(IMediaPlayer iMediaPlayer, int i, int i1, int i2, int i3) { notifyOnVideoSizeChanged(i,i1,i2,i3); } }); } }