package com.weikou.beibeivideo.ui.video;
|
|
import android.content.res.Configuration;
|
import android.media.MediaPlayer;
|
import android.os.Bundle;
|
import android.text.TextUtils;
|
import android.util.Log;
|
import android.view.SurfaceHolder;
|
import android.view.SurfaceView;
|
import android.view.View;
|
import android.view.View.OnClickListener;
|
import android.widget.Toast;
|
|
import com.fun.xm.Definition;
|
import com.fun.xm.FSCallback;
|
import com.fun.xm.FSIVideoPlayer;
|
import com.fun.xm.FSPlayer;
|
import com.fun.xm.FSVideoReqData;
|
import com.funshion.video.logger.FSLogcat;
|
import com.funshion.video.util.FSError;
|
import com.lcjian.library.RetainViewFragment;
|
import com.lcjian.library.video.VideoPlayerController;
|
import com.weikou.beibeivideo.BeibeiVideoApplication;
|
import com.weikou.beibeivideo.R;
|
import com.weikou.beibeivideo.util.downutil.StringUtils;
|
import com.weikou.beibeivideo.util.ui.IPageEventListener;
|
|
import java.io.IOException;
|
import java.util.List;
|
|
public class FunshionPlayerFragment extends RetainViewFragment implements OnClickListener {
|
private final static String TAG = FunshionPlayerFragment.class.getName();
|
|
private final static String ACCESS_TOKEN = "Zms4NHZseSwxNjAwNDE4MDQ0LDU0MmQyNDI5ZjY5MGQwODM1OTcyYTM3MDMwOTg3MzNj";
|
public final static String APICODE = "fk84vly";
|
|
//媒体视频播放器
|
private MediaPlayer mVideoPlayer = new MediaPlayer();
|
//视频用 surfaceView
|
private SurfaceView mVideoSurfView;
|
|
//播放逻辑调度
|
private FSIVideoPlayer mFunshionIVideoPlayer;
|
|
//清晰度列表
|
FSVideoReqData mFSVideoReqData;
|
private List<Definition> mDefinitions;
|
private Definition mCurrDefinition;
|
|
private IPageEventListener pageEventListener;
|
|
private VideoPlayerController vpc_funshion;
|
|
public void setPageEventListener(IPageEventListener pageEventListener) {
|
this.pageEventListener = pageEventListener;
|
}
|
|
|
@Override
|
public int getContentResource() {
|
return R.layout.fragment_player_funshion;
|
}
|
|
private void initPlayer() {
|
mVideoSurfView.getHolder().addCallback(mVideoSurfaceViewCallBack);
|
mVideoPlayer.setOnPreparedListener(mOnPreparedListener);
|
mVideoPlayer.setOnErrorListener(mOnErrorListener);
|
initAccessToken();
|
if (getArguments() != null) {
|
String mediaId = getArguments().getString("mediaId");
|
String ep = getArguments().getString("ep");
|
String vid = getArguments().getString("vid");
|
mVideoSurfView.postDelayed(new Runnable() {
|
@Override
|
public void run() {
|
if (StringUtils.isNullOrEmpty(vid))
|
playMedia(mediaId, ep);
|
else
|
playVideo(vid);
|
}
|
}, 1000);
|
}
|
vpc_funshion.setContentView(mVideoSurfView);
|
vpc_funshion.build(getActivity());
|
}
|
|
private void initView(View view) {
|
mVideoSurfView = view.findViewById(R.id.video_view);
|
vpc_funshion = view.findViewById(R.id.vpc_funshion);
|
|
}
|
|
@Override
|
public void onCreateView(View contentView, Bundle savedInstanceState) {
|
initView(contentView);
|
initPlayer();
|
}
|
|
@Override
|
public void onClick(View v) {
|
|
}
|
|
@Override
|
public void onConfigurationChanged(Configuration newConfig) {
|
super.onConfigurationChanged(newConfig);
|
}
|
|
/**
|
* 播放视频
|
*/
|
public synchronized void playVideo(String videoID) {
|
createPlayer();
|
if (mVideoPlayer.isPlaying()) {
|
FSLogcat.e(TAG, "Call player to stop");
|
mVideoPlayer.stop();
|
mVideoPlayer.reset();
|
}
|
//!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放
|
//FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID” 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken
|
mFSVideoReqData = new FSVideoReqData(videoID, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN);
|
try {
|
Log.d(TAG, "request");
|
|
mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
/**
|
* 播放媒体
|
*/
|
public synchronized void playMedia(String mediaID, String epso) {
|
createPlayer();
|
if (mVideoPlayer.isPlaying()) {
|
FSLogcat.e(TAG, "Call player to stop");
|
mVideoPlayer.stop();
|
mVideoPlayer.reset();
|
}
|
//!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放
|
//FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID”epso 媒体分集ID 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken
|
mFSVideoReqData = new FSVideoReqData(mediaID, epso, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN);
|
try {
|
Log.d(TAG, "request");
|
mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
public synchronized void stopPlay() {
|
if (mVideoPlayer != null && mVideoPlayer.isPlaying()) {
|
FSLogcat.e(TAG, "Call player to stop");
|
mVideoPlayer.stop();
|
mVideoPlayer.reset();
|
}
|
}
|
|
|
private void createPlayer() {
|
if (mFunshionIVideoPlayer != null) {
|
return;
|
}
|
try {
|
//APICODE 为风行派申请的APICODE值
|
mFunshionIVideoPlayer = FSPlayer.create(getContext(), mFSCall);
|
//可以打开调试信息方便查询问题
|
mFunshionIVideoPlayer.setDebug(true);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
FSCallback mFSCall = new FSCallback() {
|
|
@Override
|
public void onDefinition(List<Definition> definitions, Definition currDefinition) {
|
for (Definition definition : definitions) {
|
Log.e("FE", "get Definition " + definition);
|
}
|
FunshionPlayerFragment.this.mDefinitions = definitions;
|
FunshionPlayerFragment.this.mCurrDefinition = currDefinition;
|
Toast.makeText(BeibeiVideoApplication.application, "当前清晰度:" + currDefinition.getStringDefinition(), Toast.LENGTH_LONG).show();
|
}
|
|
@Override
|
public void onFailed(FSError arg0) {
|
Log.d(TAG, "onFailed" + arg0);
|
}
|
|
public void onReceiveUrl(String url) {
|
Log.d(TAG, "onReceiveUrl" + url);
|
try {
|
mVideoPlayer.reset();
|
mVideoPlayer.setDataSource(url);
|
mVideoPlayer.prepareAsync();
|
} catch (IllegalArgumentException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
} catch (SecurityException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
} catch (IllegalStateException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
}
|
}
|
};
|
|
|
SurfaceHolder.Callback mVideoSurfaceViewCallBack = new SurfaceHolder.Callback() {
|
|
@Override
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
}
|
|
@Override
|
public void surfaceCreated(SurfaceHolder holder) {
|
mVideoPlayer.setDisplay(holder);
|
}
|
|
@Override
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
}
|
};
|
|
|
MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
|
|
@Override
|
public void onPrepared(MediaPlayer mp) {
|
mFunshionIVideoPlayer.onMediaPlayerPrepared();
|
mp.start();
|
}
|
};
|
|
MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
|
|
@Override
|
public boolean onError(MediaPlayer mp, int what, int extra) {
|
mFunshionIVideoPlayer.onMediaPlayerError(what, extra);
|
return false;
|
}
|
};
|
|
//TODO 获取AcessToken
|
private void initAccessToken() {
|
|
}
|
|
@Override
|
public void onDestroy() {
|
super.onDestroy();
|
stopPlay();
|
if (mFunshionIVideoPlayer != null) {
|
mFunshionIVideoPlayer.onActivityDestroy();
|
mFunshionIVideoPlayer.release();
|
}
|
}
|
|
@Override
|
public void onDetach() {
|
super.onDetach();
|
}
|
|
@Override
|
public void onStop() {
|
super.onStop();
|
if (mVideoPlayer != null && mVideoPlayer.isPlaying())
|
mVideoPlayer.pause();
|
}
|
}
|