package com.asha.md360player4android;
import android.content.Context;
import android.content.res.AssetManager;
import android.view.Surface;
import java.io.IOException;
import java.io.InputStream;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
import tv.danmaku.ijk.media.player.misc.IMediaDataSource;
/**
* Created by hzqiujiadi on 16/4/5.
* hzqiujiadi ashqalcn@gmail.com
*
* http://developer.android.com/intl/zh-cn/reference/android/media/MediaPlayer.html
* status
*/
public class MediaPlayerWrapper implements IMediaPlayer.OnPreparedListener {
protected IMediaPlayer mPlayer;
private IjkMediaPlayer.OnPreparedListener mPreparedListener;
private static final int STATUS_IDLE = 0;
private static final int STATUS_PREPARING = 1;
private static final int STATUS_PREPARED = 2;
private static final int STATUS_STARTED = 3;
private static final int STATUS_PAUSED = 4;
private static final int STATUS_STOPPED = 5;
private int mStatus = STATUS_IDLE;
public void init(){
mStatus = STATUS_IDLE;
mPlayer = new IjkMediaPlayer();
mPlayer.setOnPreparedListener(this);
mPlayer.setOnInfoListener(new IMediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(IMediaPlayer mp, int what, int extra) {
return false;
}
});
enableHardwareDecoding();
}
private void enableHardwareDecoding(){
if (mPlayer instanceof IjkMediaPlayer){
IjkMediaPlayer player = (IjkMediaPlayer) mPlayer;
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 60);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-fps", 0);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
}
}
public void setSurface(Surface surface){
if (getPlayer() != null){
getPlayer().setSurface(surface);
}
}
public void openRemoteFile(String url){
try {
mPlayer.setDataSource(url);
} catch (IOException e) {
e.printStackTrace();
}
}
public void openAssetFile(Context context, String assetPath) {
try {
AssetManager am = context.getResources().getAssets();
final InputStream is = am.open(assetPath);
mPlayer.setDataSource(new IMediaDataSource() {
@Override
public int readAt(long position, byte[] buffer, int offset, int size) throws IOException {
return is.read(buffer, offset, size);
}
@Override
public long getSize() throws IOException {
return is.available();
}
@Override
public void close() throws IOException {
is.close();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public IMediaPlayer getPlayer() {
return mPlayer;
}
public void prepare() {
if (mPlayer == null) return;
if (mStatus == STATUS_IDLE || mStatus == STATUS_STOPPED){
mPlayer.prepareAsync();
mStatus = STATUS_PREPARING;
}
}
public void stop(){
if (mPlayer == null) return;
if (mStatus == STATUS_STARTED || mStatus == STATUS_PAUSED){
mPlayer.stop();
mStatus = STATUS_STOPPED;
}
}
public void pause(){
if (mPlayer == null) return;
if (mPlayer.isPlaying() && mStatus == STATUS_STARTED) {
mPlayer.pause();
mStatus = STATUS_PAUSED;
}
}
private void start(){
if (mPlayer == null) return;
if (mStatus == STATUS_PREPARED || mStatus == STATUS_PAUSED){
mPlayer.start();
mStatus = STATUS_STARTED;
}
}
public void setPreparedListener(IMediaPlayer.OnPreparedListener mPreparedListener) {
this.mPreparedListener = mPreparedListener;
}
@Override
public void onPrepared(IMediaPlayer mp) {
mStatus = STATUS_PREPARED;
start();
if (mPreparedListener != null) mPreparedListener.onPrepared(mp);
}
public void resume() {
start();
}
public void destroy() {
stop();
if (mPlayer != null) {
mPlayer.setSurface(null);
mPlayer.release();
}
mPlayer = null;
}
}