admin
2020-09-19 394c1b925cf8b9ccf98d0b6db3210266d07368ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
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();
    }
}