package com.shuyu.gsyvideoplayer;
import android.media.AudioManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.Surface;
import com.shuyu.gsyvideoplayer.model.GSYModel;
import java.io.IOException;
import java.util.Map;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkLibLoader;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
/**
* Created by shuyu on 2016/12/11.
*/
public class GSYPreViewManager implements IMediaPlayer.OnPreparedListener, IjkMediaPlayer.OnSeekCompleteListener {
public static String TAG = "GSYPreViewManager";
private static GSYPreViewManager videoManager;
public static final int HANDLER_PREPARE = 0;
public static final int HANDLER_SETDISPLAY = 1;
public static final int HANDLER_RELEASE = 2;
private IjkMediaPlayer mediaPlayer;
private HandlerThread mMediaHandlerThread;
private GSYPreViewManager.MediaHandler mMediaHandler;
private boolean seekToComplete = true;
private static IjkLibLoader ijkLibLoader; //自定义so包加载类
public static synchronized GSYPreViewManager instance() {
if (videoManager == null) {
videoManager = new GSYPreViewManager();
}
return videoManager;
}
public GSYPreViewManager() {
IjkLibLoader libLoader = GSYVideoManager.getIjkLibLoader();
mediaPlayer = (libLoader == null) ? new IjkMediaPlayer() : new IjkMediaPlayer(libLoader);
ijkLibLoader = libLoader;
mMediaHandlerThread = new HandlerThread(TAG);
mMediaHandlerThread.start();
mMediaHandler = new GSYPreViewManager.MediaHandler((mMediaHandlerThread.getLooper()));
}
public class MediaHandler extends Handler {
public MediaHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case HANDLER_PREPARE:
initVideo(msg);
break;
case HANDLER_SETDISPLAY:
showDisplay(msg);
break;
case HANDLER_RELEASE:
if (mediaPlayer != null) {
mediaPlayer.release();
}
break;
}
}
}
private void initVideo(Message msg) {
try {
mediaPlayer.release();
initIJKPlayer(msg);
mediaPlayer.setOnPreparedListener(GSYPreViewManager.this);
mediaPlayer.setOnSeekCompleteListener(this);
mediaPlayer.setVolume(0, 0);
mediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
}
private void initIJKPlayer(Message msg) {
mediaPlayer = (ijkLibLoader == null) ? new IjkMediaPlayer() : new IjkMediaPlayer(ijkLibLoader);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(((GSYModel) msg.obj).getUrl(), ((GSYModel) msg.obj).getMapHeadData());
} catch (IOException e) {
e.printStackTrace();
}
}
private void showDisplay(Message msg) {
if (msg.obj == null && mediaPlayer != null) {
mediaPlayer.setSurface(null);
} else {
Surface holder = (Surface) msg.obj;
if (mediaPlayer != null && holder.isValid()) {
mediaPlayer.setSurface(holder);
}
}
}
@Override
public void onPrepared(IMediaPlayer mp) {
mp.pause();
seekToComplete = true;
}
@Override
public void onSeekComplete(IMediaPlayer mp) {
seekToComplete = true;
}
public void prepare(final String url, final Map<String, String> mapHeadData, boolean loop, float speed) {
if (TextUtils.isEmpty(url)) return;
Message msg = new Message();
msg.what = HANDLER_PREPARE;
GSYModel fb = new GSYModel(url, mapHeadData, loop, speed);
msg.obj = fb;
mMediaHandler.sendMessage(msg);
}
public void releaseMediaPlayer() {
Message msg = new Message();
msg.what = HANDLER_RELEASE;
mMediaHandler.sendMessage(msg);
}
public void setDisplay(Surface holder) {
Message msg = new Message();
msg.what = HANDLER_SETDISPLAY;
msg.obj = holder;
mMediaHandler.sendMessage(msg);
}
public IjkMediaPlayer getMediaPlayer() {
return mediaPlayer;
}
public boolean isSeekToComplete() {
return seekToComplete;
}
public void setSeekToComplete(boolean seekToComplete) {
this.seekToComplete = seekToComplete;
}
}