package top.huic.flutter_qiniucloud_live_plugin.view; import android.content.Context; import android.util.Log; import android.view.View; import android.widget.TextView; import com.pili.pldroid.player.widget.PLVideoTextureView; import com.pili.pldroid.player.widget.PLVideoView; import java.util.Map; import java.util.Objects; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.StandardMessageCodec; import io.flutter.plugin.platform.PlatformView; import io.flutter.plugin.platform.PlatformViewFactory; import top.huic.flutter_qiniucloud_live_plugin.listener.QiniucloudPlayerListener; import top.huic.flutter_qiniucloud_live_plugin.util.CommonUtil; import top.huic.flutter_qiniucloud_live_plugin.widget.MediaController; /** * 七牛云播放器视图 */ public class QiniucloudPlayerPlatformView extends PlatformViewFactory implements PlatformView, MethodChannel.MethodCallHandler { /** * 日志标签 */ private static final String TAG = QiniucloudPlayerPlatformView.class.getName(); /** * 全局上下文 */ private Context context; /** * 消息器 */ private BinaryMessenger messenger; /** * 全局标识 */ public static final String SIGN = "plugins.huic.top/QiniucloudPlayer"; /** * 播放器 */ private PLVideoView view; /** * 初始化视图工厂,注册视图时调用 */ public QiniucloudPlayerPlatformView(Context context, BinaryMessenger messenger) { super(StandardMessageCodec.INSTANCE); this.context = context; this.messenger = messenger; } /** * 初始化组件,同时也初始化七牛云推流 * 每个组件被实例化时调用 */ private QiniucloudPlayerPlatformView(Context context) { super(StandardMessageCodec.INSTANCE); this.context = context; } @Override public void onMethodCall(MethodCall call, MethodChannel.Result result) { switch (call.method) { case "setDisplayAspectRatio": this.setDisplayAspectRatio(call, result); break; case "start": this.start(call, result); break; case "pause": this.pause(call, result); break; case "stopPlayback": this.stopPlayback(call, result); break; case "getRtmpVideoTimestamp": this.getRtmpVideoTimestamp(call, result); break; case "getRtmpAudioTimestamp": this.getRtmpAudioTimestamp(call, result); break; case "setBufferingEnabled": this.setBufferingEnabled(call, result); break; case "getHttpBufferSize": this.getHttpBufferSize(call, result); break; default: result.notImplemented(); } } @Override public PlatformView create(Context context, int viewId, Object args) { Map<String, Object> params = (Map<String, Object>) args; QiniucloudPlayerPlatformView view = new QiniucloudPlayerPlatformView(context); // 绑定方法监听器 MethodChannel methodChannel = new MethodChannel(messenger, SIGN + "_" + viewId); methodChannel.setMethodCallHandler(view); // 初始化 view.init(params, methodChannel); return view; } @Override public void dispose() { } @Override public View getView() { return view; } /** * 初始化 * * @param params 参数 * @param methodChannel 方法通道 */ private void init(Map<String, Object> params, MethodChannel methodChannel) { // 初始化视图 view = new PLVideoView(context); view.setMediaController(new MediaController(context)); if (params.get("url") != null) { view.setVideoPath(params.get("url").toString()); } // 监听器 QiniucloudPlayerListener listener = new QiniucloudPlayerListener(context, methodChannel); view.setOnPreparedListener(listener); view.setOnInfoListener(listener); view.setOnCompletionListener(listener); view.setOnVideoSizeChangedListener(listener); view.setOnErrorListener(listener); } /** * 设置画面预览模式 */ private void setDisplayAspectRatio(MethodCall call, MethodChannel.Result result) { int mode = CommonUtil.getParam(call, result, "mode"); view.setDisplayAspectRatio(mode); result.success(null); } /** * 播放 */ private void start(MethodCall call, MethodChannel.Result result) { String url = call.argument("url"); if (url != null) { view.setVideoPath(url); } view.start(); result.success(null); } /** * 暂停 */ private void pause(MethodCall call, MethodChannel.Result result) { view.pause(); result.success(null); } /** * 停止播放 */ private void stopPlayback(MethodCall call, MethodChannel.Result result) { view.stopPlayback(); result.success(null); } /** * 在RTMP消息中获取视频时间戳 */ private void getRtmpVideoTimestamp(MethodCall call, MethodChannel.Result result) { result.success(view.getRtmpVideoTimestamp()); } /** * 在RTMP消息中获取音频时间戳 */ private void getRtmpAudioTimestamp(MethodCall call, MethodChannel.Result result) { result.success(view.getRtmpAudioTimestamp()); } /** * 暂停/恢复播放器的预缓冲 */ private void setBufferingEnabled(MethodCall call, MethodChannel.Result result) { boolean enabled = CommonUtil.getParam(call, result, "enabled"); view.setBufferingEnabled(enabled); result.success(null); } /** * 获取已经缓冲的长度 */ private void getHttpBufferSize(MethodCall call, MethodChannel.Result result) { result.success(view.getHttpBufferSize().longValue()); } }