zoukankan      html  css  js  c++  java
  • 萤石云视频播放开发

    集成:

    dependencies { compile 'com.hikvision.ezviz:ezviz-sdk:4.5.1' }

    添加权限:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    

    配置 build.gradle:

    defaultConfig {
           ...
            targetSdkVersion 22//小于23
           ...
            ndk {
                abiFilters "armeabi-v7a"//只支持32位
            }
        }
         sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    

    注意:

    目前提供所有so均为32位,只能在armeabi-v7a引用。

    当时碰到一个其他的sdk支持62位的,只能加上ndk { abiFilters "armeabi"},最后跟其他的sdk厂家要了一个32位的so文件,在app—>src->main下创建了一个armeabi-v7a文件夹,如下图:

    targetSdkVersion设置为23及以上,在android6.0系统的手机上会出现没有权限崩溃的情况,因为android6.0牵扯到Dangerous Permissions问题,如果需要使用高版本,需要自己处理Dangerous Permissions。

    AndroidManifest.xml:

    <activity
            android:name="com.videogo.main.EzvizWebViewActivity"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden"
        </activity>
    
    <!-- receive 登录时使用,如果用web断登录则不需要,登录流程web端已经写好,只需拿到AccessToken设置一下就好,调用setAccessToken()方法。--> <receiver android:name="you_BroadcastReceiver" android:exported="false" > <intent-filter> <action android:name="com.videogo.action.OAUTH_SUCCESS_ACTION" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>

    Application初始化:

    /**
     *  APP_KEY请替换成自己申请的
     */
    EZOpenSDK.initLib(this, APP_KEY, "");
    

    1.初始化EZPlayer调用EZOpenSDK的createPlayer,详见api; 
    2.预览播放成功后可以进行以下操作:录像、拍照、画面翻转、对讲、云台控制、声音开关、视频画面缩放、拖动进度播放,详见api的EZPlayer,其中设备控制该接口的如云台控制和镜头显示功能、对讲,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看EZDeviceInfo对象的属性值来判断具体方法; 
    3.关于对讲功能,如果预览播放有声音输出,则在开启对讲前需要关闭预览播放的声音closeSound,关闭对讲后开启预览播放的声音openSound,详见demo; 
    4.EZOpenSDK中的setVideoLevel设置视频清晰度(videoLevel),此调节可以在视频播放前设置也可以在视频播放成功后设置,视频播放成功后设置了清晰度需要先停止播放stopRealPlay然后重新开启播放startRealPlay才能生效; 
    5.开始播放之后在消息回调中会收到a、成功消息:EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS,b、失败消息:EZRealPlayConstants.MSG_REALPLAY_PLAY_FAIL,失败回调时查看errorCode,如果为400035(需要输入验证码)和400036(验证码错误),则需要开发者自己处理让用户重新输入验证密码,并调用setPlayVerifyCode设置密码,然后重新启动播放。

    播放视频类的代码:

    package com.everyoo.smarthome.ui;
    
    import android.content.Context;
    import android.content.Intent;
    import android.content.res.Configuration;
    import android.graphics.Bitmap;
    import android.graphics.drawable.BitmapDrawable;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.os.Parcelable;
    import android.os.SystemClock;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.view.animation.Animation;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.PopupWindow;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.andbase.library.http.AbHttpUtil;
    import com.andbase.library.http.listener.AbStringHttpResponseListener;
    import com.andbase.library.http.model.AbRequestParams;
    import com.everyoo.smarthome.R;
    import com.everyoo.smarthome.ui.scan.main.CaptureActivity;
    import com.everyoo.smarthome.util.DataManager;
    import com.everyoo.smarthome.util.EZUtils;
    import com.everyoo.smarthome.util.HttpConfig;
    import com.everyoo.smarthome.util.SharePreferenceUtil;
    import com.everyoo.smarthome.util.ToastUtil;
    import com.videogo.errorlayer.ErrorInfo;
    import com.videogo.exception.BaseException;
    import com.videogo.exception.ErrorCode;
    import com.videogo.exception.InnerException;
    import com.videogo.openapi.EZConstants;
    import com.videogo.openapi.EZPlayer;
    import com.videogo.openapi.bean.EZCameraInfo;
    import com.videogo.openapi.bean.EZDeviceInfo;
    import com.videogo.realplay.RealPlayStatus;
    import com.videogo.util.ConnectionDetector;
    import com.videogo.util.LogUtil;
    import com.videogo.util.MediaScanner;
    import com.videogo.util.SDCardUtil;
    import com.videogo.util.Utils;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.Serializable;
    import java.util.Calendar;
    import java.util.List;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import static android.app.Activity.RESULT_OK;
    import static com.everyoo.smarthome.HomeApplication.getOpenSDK;
    import static com.videogo.openapi.EZConstants.EZRealPlayConstants.MSG_SET_VEDIOMODE_FAIL;
    import static com.videogo.realplay.RealPlayMsg.MSG_SET_VEDIOMODE_SUCCESS;
    
    /**
     * Created by tom on 2017/11/15.
     */
    
    public class HomeTopCameraFragment extends Fragment implements SurfaceHolder.Callback, View.OnClickListener, Handler.Callback {
    
        private static final String TAG = "HomeTopCameraFragment";
    
        public static final int MSG_PLAY_UI_UPDATE = 200;
        public static final int CAMERA_LIST = 2020;
    
        private String deviceSerial;
    
        private SurfaceView mRealPlaySv;
        private SurfaceHolder mRealPlaySh;
        private Button mRealPlayBtn;
        private Button mRealPlaySoundBtn;
        private Button mRealPlayQualityBtn;
        private Button mRealPlayPreviouslyBtn;
        private Button mRealPlayTalkBtn;
        private Button mRealPlayVideoBtn;
        private Button add_device;
        private LinearLayout ll_no_camera;
        private PopupWindow mQualityPopupWindow = null;
        private EZConstants.EZVideoLevel mCurrentQulityMode = EZConstants.EZVideoLevel.VIDEO_LEVEL_HD;
        /**
         * 标识是否正在播放
         */
        private int mStatus = RealPlayStatus.STATUS_INIT;
    
        /**
         * 演示点预览控制对象
         */
        private EZPlayer mEZPlayer;
    
        private List<EZDeviceInfo> mCameraList;
        private EZDeviceInfo mDeviceInfo = null;
        private EZCameraInfo mCameraInfo = null;
        private Handler mHandler = new Handler(this);
        private int mSoundType = 0;
        private boolean mIsOnTalk =false;
        private boolean mIsRecording = false;
        private TextView tv_device_name,device_list,mRealPlayRecordTv;
        private ImageView iv_play;
    
        /**
         * 定时器
         */
        private Timer mUpdateTimer = null;
        /**
         * 定时器执行的任务
         */
        private TimerTask mUpdateTimerTask = null;
    
        private String mRecordTime = null;
        /**
         * 录像时间
         */
        private int mRecordSecond = 0;
    
        private SharePreferenceUtil sharePreferenceUtil;
        private String deviceName;
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                //播放成功的回调
                case EZConstants.EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS:
                    startUpdateTimer();
                    break;
                case  MSG_SET_VEDIOMODE_SUCCESS:
                    closeQualityPopupWindow();
                    setVideoLevel();
                    if (mStatus == RealPlayStatus.STATUS_START) {
                        // 停止播放
                        stopRealPlay();
                        //下面语句防止stopRealPlay线程还没释放surface, startRealPlay线程已经开始使用surface
                        //因此需要等待500ms
                        SystemClock.sleep(500);
                        // 开始播放
                        startRealPlay();
                    }
                    break;
                case EZConstants.EZRealPlayConstants.MSG_SET_VEDIOMODE_FAIL:
                    closeQualityPopupWindow();
                    setVideoLevel();
                    ToastUtil.showToast(getActivity(),"切换视频质量失败");
                    break;
                case MSG_PLAY_UI_UPDATE:
                    if (mIsRecording) {
                        updateRecordTime();
                    }
                    break;
    
            }
            return false;
        }
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 保持屏幕常亮
            getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    
        @Nullable
        @Override
        public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view;
    
            view = inflater.inflate(R.layout.ez_realplay_page, container, false);
    
            mRealPlaySv = (SurfaceView) view.findViewById(R.id.realplay_sv);
            mRealPlaySh = mRealPlaySv.getHolder();
            mRealPlaySh.addCallback(this);
    
            mRealPlayBtn = (Button) view.findViewById(R.id.realplay_play_btn);
            mRealPlayBtn.setOnClickListener(this);
            mRealPlaySoundBtn = (Button) view.findViewById(R.id.realplay_sound_btn);
            mRealPlaySoundBtn.setOnClickListener(this);
            mRealPlayQualityBtn = (Button) view.findViewById(R.id.realplay_quality_btn);
            mRealPlayQualityBtn.setOnClickListener(this);
            mRealPlayPreviouslyBtn = (Button) view.findViewById(R.id.realplay_previously_btn);
            mRealPlayPreviouslyBtn.setOnClickListener(this);
            mRealPlayTalkBtn = (Button) view.findViewById(R.id.realplay_talk_btn);
            mRealPlayTalkBtn.setOnClickListener(this);
            mRealPlayVideoBtn = (Button) view.findViewById(R.id.realplay_video_btn);
            mRealPlayVideoBtn.setOnClickListener(this);
    
            mRealPlayRecordTv = (TextView) view.findViewById(R.id.tv_video_time);
    
            tv_device_name = (TextView) view.findViewById(R.id.tv_device_name);
            iv_play = (ImageView) view.findViewById(R.id.iv_play);
    
            ll_no_camera = (LinearLayout) view.findViewById(R.id.ll_no_camera);
            add_device = (Button) view.findViewById(R.id.add_device);
            add_device.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getActivity(), CaptureActivity.class);
                    startActivity(intent);
                }
            });
    
            device_list = (TextView) view.findViewById(R.id.device_list);
            device_list.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getActivity(), CameraListActivity.class);
                    startActivityForResult(intent,CAMERA_LIST);
                }
            });
    
            return view;
        }
    
        @Override
        public void onStart() {
            super.onStart();
            initData();
        }
    
        @Override
        public void onPause() {
            super.onPause();
            stopRealPlay();
        }
    
        private void initData() {
           getAccessToken();
    
        }
    
        private void getAccessToken() {
            sharePreferenceUtil = new SharePreferenceUtil(getActivity());
            AbRequestParams params = new AbRequestParams();
            params.put("userid", sharePreferenceUtil.getUserId());
            params.put("accesstoken", sharePreferenceUtil.getAccessToken());
            AbHttpUtil.getInstance(getActivity()).post(HttpConfig.get_token, params, new AbStringHttpResponseListener() {
                @Override
                public void onStart() {
    
                }
    
                @Override
                public void onFinish() {
    
                }
    
                @Override
                public void onFailure(int statusCode, String content, Throwable error) {
    
                }
    
                @Override
                public void onSuccess(int statusCode, String content) {
                    JSONObject object;
                    try {
                        object = new JSONObject(content);
                        if (object.optString("result").equals("2003")) {
                            JSONObject info = object.optJSONObject("info");
                            String accessToken = info.optString("accessToken");
                            String expireTime = info.optString("expireTime");
                            sharePreferenceUtil = new SharePreferenceUtil(getActivity());
                            sharePreferenceUtil.putString("CameraAccessToken",accessToken);
                            sharePreferenceUtil.putString("CameraExpireTime",expireTime);
                            getOpenSDK().setAccessToken(accessToken);
                            getDeviceList();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        private void getDeviceList() {
            sharePreferenceUtil = new SharePreferenceUtil(getActivity());
            AbRequestParams params = new AbRequestParams();
            params.put("userid", sharePreferenceUtil.getUserId());
            params.put("accesstoken", sharePreferenceUtil.getAccessToken());
            AbHttpUtil.getInstance(getActivity()).post(HttpConfig.getCamera_list, params, new AbStringHttpResponseListener() {
                @Override
                public void onStart() {
    
                }
    
                @Override
                public void onFinish() {
    
                }
    
                @Override
                public void onFailure(int statusCode, String content, Throwable error) {
    
                }
    
                @Override
                public void onSuccess(int statusCode, String content) {
                    JSONObject object;
                    try {
                        object = new JSONObject(content);
                        if (object.optString("result").equals("2003")) {
                            JSONArray info = object.optJSONArray("info");
                            if (info!=null && info.length()>0) {
                                JSONObject object1 = info.optJSONObject(0);
                                deviceSerial = object1.optString("deviceSerial");
                                deviceName = object1.getString("deviceName");
                                if (deviceSerial != null) {
                                    new GetCamersInfoListTask().execute();
                                    ll_no_camera.setVisibility(View.GONE);
                                }
                            }else {
                                ll_no_camera.setVisibility(View.VISIBLE);
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == CAMERA_LIST){
                if (resultCode == RESULT_OK){
                    deviceSerial = data.getStringExtra("deviceSerial");
                    Log.d(TAG, "onActivityResult: "+deviceSerial);
                    new GetCamersInfoListTask().execute();
                }
            }
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            if (mEZPlayer != null) {
                mEZPlayer.setSurfaceHold(holder);
            }
            mRealPlaySh = holder;
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mEZPlayer != null) {
                mEZPlayer.setSurfaceHold(null);
            }
            mRealPlaySh = null;
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.realplay_play_btn:
                    if (mStatus != RealPlayStatus.STATUS_STOP) {
                        stopRealPlay();
                    } else {
                        startRealPlay();
                    }
                    break;
                case R.id.realplay_previously_btn:
                    onCapturePicBtnClick();
                    break;
                case R.id.realplay_video_btn:
                    onRecordBtnClick();
                    break;
                case R.id.realplay_talk_btn:
                    if(mIsOnTalk){
                        stopVoiceTalk();
                    }else {
                        startVoiceTalk();
                    }
                    break;
    
                case R.id.realplay_quality_btn:
                    openQualityPopupWindow(mRealPlayQualityBtn);
                    break;
    
                case R.id.realplay_sound_btn:
                    setRealPlaySound();
                    break;
                default:
                    break;
            }
        }
    
        /**
         * 开始播放
         *
         * @see
         * @since V2.0
         */
        private void startRealPlay() {
            // 增加手机客户端操作信息记录
            LogUtil.debugLog(TAG, "startRealPlay");
    
            if (mStatus == RealPlayStatus.STATUS_START || mStatus == RealPlayStatus.STATUS_PLAY) {
                return;
            }
    
            // 检查网络是否可用
            if (!ConnectionDetector.isNetworkAvailable(getActivity())) {
                // 提示没有连接网络
                ToastUtil.showToast(getActivity(), "没有连接网络");
                return;
            }
    
            mStatus = RealPlayStatus.STATUS_START;
    
            if (mCameraInfo != null) {
                if (mEZPlayer == null) {
                    mEZPlayer = getOpenSDK().createPlayer(mCameraInfo.getDeviceSerial(), mCameraInfo.getCameraNo());
                }
    
                if (mEZPlayer == null)
                    return;
                if (mDeviceInfo == null) {
                    return;
                }
                if (mDeviceInfo.getIsEncrypt() == 1) {
                    mEZPlayer.setPlayVerifyCode(DataManager.getInstance().getDeviceSerialVerifyCode(mCameraInfo.getDeviceSerial()));
                }
                mEZPlayer.setHandler(mHandler);
                mEZPlayer.setSurfaceHold(mRealPlaySh);
                mEZPlayer.startRealPlay();
                mRealPlayBtn.setBackgroundResource(R.mipmap.camera_pause);
                iv_play.setVisibility(View.GONE);
            }
        }
        /**
         * 停止播放
         *
         * @see
         * @since V1.0
         */
        private void stopRealPlay() {
            LogUtil.debugLog(TAG, "stopRealPlay");
            mStatus = RealPlayStatus.STATUS_STOP;
    
            if (mEZPlayer != null) {
                mEZPlayer.stopRealPlay();
                mRealPlayBtn.setBackgroundResource(R.mipmap.camera_play);
            }
            iv_play.setVisibility(View.VISIBLE);
        }
    
        /**
         * 调节声音
         */
        private void setRealPlaySound() {
            if (mEZPlayer != null) {
                if (mSoundType == 0) {
                    mEZPlayer.closeSound();
                    mSoundType = 1;
                    mRealPlaySoundBtn.setBackgroundResource(R.mipmap.camera_novoice);
                } else {
                    mEZPlayer.openSound();
                    mSoundType = 0;
                    mRealPlaySoundBtn.setBackgroundResource(R.mipmap.camera_voice);
                }
            }
        }
    
        /**
         * 设备对讲
         *
         * @see
         * @since V2.0
         */
        private void startVoiceTalk() {
            LogUtil.debugLog(TAG, "startVoiceTalk");
            if (mEZPlayer == null) {
                LogUtil.debugLog(TAG, "EZPlaer is null");
                return;
            }
            if (mCameraInfo == null) {
                return;
            }
            mIsOnTalk = true;
    
            if (mEZPlayer != null) {
                mEZPlayer.closeSound();
            }
            mEZPlayer.startVoiceTalk();
            mRealPlayTalkBtn.setBackgroundResource(R.mipmap.camera_talking);
        }
    
        /**
         * 停止对讲
         *
         * @see
         * @since V2.0
         */
        private void stopVoiceTalk() {
            if (mCameraInfo == null || mEZPlayer == null) {
                return;
            }
            LogUtil.debugLog(TAG, "stopVoiceTalk");
    
            mEZPlayer.stopVoiceTalk();
            mRealPlayTalkBtn.setBackgroundResource(R.mipmap.camera_talk);
    
        }
    
        /**
         * 开始录像
         *
         * @see
         * @since V1.0
         */
        private void onRecordBtnClick() {
            if (mIsRecording) {
                stopRealPlayRecord();
                return;
            }
    
            if (!SDCardUtil.isSDCardUseable()) {
                // 提示SD卡不可用
                Utils.showToast(getActivity(), "SD卡不可用");
                return;
            }
    
            if (SDCardUtil.getSDCardRemainSize() < SDCardUtil.PIC_MIN_MEM_SPACE) {
                // 提示内存不足
                Utils.showToast(getActivity(), "内存不足");
                return;
            }
    
            if (mEZPlayer != null) {
    
                //mAudioPlayUtil.playAudioFile(AudioPlayUtil.RECORD_SOUND);
                mIsRecording =true;
    
                //时间作为文件命名
                java.util.Date date = new java.util.Date();
                String strRecordFile = Environment.getExternalStorageDirectory().getPath() + "/EZOpenSDK/Records/" + String.format("%tY", date)
                        + String.format("%tm", date) + String.format("%td", date) + "/"
                        + String.format("%tH", date) + String.format("%tM", date) + String.format("%tS", date) + String.format("%tL", date) + ".mp4";
    
                mRealPlayVideoBtn.setBackgroundResource(R.mipmap.camera_videoing);
                if (mEZPlayer.startLocalRecordWithFile(strRecordFile))
                {
                    ToastUtil.showToast(getActivity(),"录像成功");
                } else {
                    ToastUtil.showToast(getActivity(),"录像失败");
                }
            }
        }
    
        /**
         * 停止录像
         *
         * @see
         * @since V1.0
         */
        private void stopRealPlayRecord() {
            if (mEZPlayer == null || !mIsRecording) {
                return;
            }
    
            //mAudioPlayUtil.playAudioFile(AudioPlayUtil.RECORD_SOUND);
            mEZPlayer.stopLocalRecord();
            mRealPlayVideoBtn.setBackgroundResource(R.mipmap.camera_video);
            mIsRecording = false;
            mRealPlayRecordTv.setVisibility(View.GONE);
        }
        /**
         * 启动定时器
         *
         * @see
         * @since V1.0
         */
        private void startUpdateTimer() {
            stopUpdateTimer();
            // 开始录像计时
            mUpdateTimer = new Timer();
            mUpdateTimerTask = new TimerTask() {
                @Override
                public void run() {
    
                    // 更新录像时间
                    if (mEZPlayer != null && mIsRecording) {
                        // 更新录像时间
                        Calendar OSDTime = mEZPlayer.getOSDTime();
                        if (OSDTime != null) {
                            String playtime = Utils.OSD2Time(OSDTime);
                            if (!TextUtils.equals(playtime, mRecordTime)) {
                                mRecordSecond++;
                                //mRecordTime = playtime;
                            }
                        }
                    }
                    if (mHandler != null) {
                        mHandler.sendEmptyMessage(MSG_PLAY_UI_UPDATE);
                    }
                }
            };
            // 延时1000ms后执行,1000ms执行一次
            mUpdateTimer.schedule(mUpdateTimerTask, 0, 1000);
        }
        /**
         * 停止定时器
         *
         * @see
         * @since V1.0
         */
        private void stopUpdateTimer() {
            mHandler.removeMessages(MSG_PLAY_UI_UPDATE);
            // 停止录像计时
            if (mUpdateTimer != null) {
                mUpdateTimer.cancel();
                mUpdateTimer = null;
            }
    
            if (mUpdateTimerTask != null) {
                mUpdateTimerTask.cancel();
                mUpdateTimerTask = null;
            }
        }
        /**
         * 更新录像时间
         *
         * @see
         * @since V1.0
         */
        private void updateRecordTime() {
    
            if (mIsRecording) {
                mRealPlayRecordTv.setVisibility(View.VISIBLE);
            } else {
                mRealPlayRecordTv.setVisibility(View.GONE);
            }
            // 计算分秒
            int leftSecond = mRecordSecond % 3600;
            int minitue = leftSecond / 60;
            int second = leftSecond % 60;
    
            // 显示录像时间
            String recordTime = String.format("%02d:%02d", minitue, second);
            mRealPlayRecordTv.setText(recordTime);
        }
    
        /**
         * 抓拍按钮响应函数
         *
         * @since V1.0
         */
        private void onCapturePicBtnClick() {
    
            if (!SDCardUtil.isSDCardUseable()) {
                // 提示SD卡不可用
                Utils.showToast(getActivity(), "SD卡不可用");
                return;
            }
    
            if (SDCardUtil.getSDCardRemainSize() < SDCardUtil.PIC_MIN_MEM_SPACE) {
                // 提示内存不足
                Utils.showToast(getActivity(), "内存不足");
                return;
            }
    
            if (mEZPlayer != null) {
    
                Thread thr = new Thread() {
                    @Override
                    public void run() {
                        Bitmap bmp = mEZPlayer.capturePicture();
                        if (bmp != null) {
                            try {
    
                                // 用时间命名
                                java.util.Date date = new java.util.Date();
                                final String path = Environment.getExternalStorageDirectory().getPath() + "/EZOpenSDK/CapturePicture/" + String.format("%tY", date)
                                        + String.format("%tm", date) + String.format("%td", date) + "/"
                                        + String.format("%tH", date) + String.format("%tM", date) + String.format("%tS", date) + String.format("%tL", date) +".jpg";
    
                                if (TextUtils.isEmpty(path)) {
                                    bmp.recycle();
                                    bmp = null;
                                    return;
                                }
                                EZUtils.saveCapturePictrue(path, bmp);
    
                                MediaScanner mMediaScanner = new MediaScanner(getActivity());
                                mMediaScanner.scanFile(path, "jpg");
                                getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        ToastUtil.showToast(getActivity(),"保存到相册");
                                    }
                                });
                            } catch (InnerException e) {
                                e.printStackTrace();
                            } finally {
                                if (bmp != null) {
                                    bmp.recycle();
                                    bmp = null;
                                    return;
                                }
                            }
                        }
                        super.run();
                    }
                };
                thr.start();
            }
        }
    
        /**
         * 视频质量,2-高清,1-标清,0-流畅
         * @param anchor
         */
        private void openQualityPopupWindow(View anchor) {
            if (mEZPlayer == null) {
                return;
            }
            closeQualityPopupWindow();
            LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            ViewGroup layoutView = (ViewGroup) layoutInflater.inflate(R.layout.realplay_quality_items, null, true);
    
            Button qualityHdBtn = (Button) layoutView.findViewById(R.id.quality_hd_btn);
            qualityHdBtn.setOnClickListener(mOnPopWndClickListener);
            Button qualityBalancedBtn = (Button) layoutView.findViewById(R.id.quality_balanced_btn);
            qualityBalancedBtn.setOnClickListener(mOnPopWndClickListener);
            Button qualityFlunetBtn = (Button) layoutView.findViewById(R.id.quality_flunet_btn);
            qualityFlunetBtn.setOnClickListener(mOnPopWndClickListener);
    
            // 视频质量,2-高清,1-标清,0-流畅
            if (mCameraInfo.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET) {
                qualityFlunetBtn.setEnabled(false);
            } else if (mCameraInfo.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_BALANCED) {
                qualityBalancedBtn.setEnabled(false);
            } else if (mCameraInfo.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_HD) {
                qualityHdBtn.setEnabled(false);
            }
    
            int height = 105;
    
            qualityFlunetBtn.setVisibility(View.VISIBLE);
            qualityBalancedBtn.setVisibility(View.VISIBLE);
            qualityHdBtn.setVisibility(View.VISIBLE);
    
            height = Utils.dip2px(getActivity(), height);
            mQualityPopupWindow = new PopupWindow(layoutView, RelativeLayout.LayoutParams.WRAP_CONTENT, height, true);
            mQualityPopupWindow.setBackgroundDrawable(new BitmapDrawable());
            mQualityPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
    
                @Override
                public void onDismiss() {
                    LogUtil.infoLog(TAG, "KEYCODE_BACK DOWN");
                    mQualityPopupWindow = null;
                    closeQualityPopupWindow();
                }
            });
            try {
                mQualityPopupWindow.showAsDropDown(anchor, - Utils.dip2px(getActivity(), 5),
                        -(height + anchor.getHeight() + Utils.dip2px(getActivity(), 8)));
            } catch (Exception e) {
                e.printStackTrace();
                closeQualityPopupWindow();
            }
        }
    
        private void closeQualityPopupWindow() {
            if (mQualityPopupWindow != null) {
                dismissPopWindow(mQualityPopupWindow);
                mQualityPopupWindow = null;
            }
        }
        private void dismissPopWindow(PopupWindow popupWindow) {
            if (popupWindow != null && !getActivity().isFinishing()) {
                try {
                    popupWindow.dismiss();
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    
        private View.OnClickListener mOnPopWndClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.quality_hd_btn:
                        setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_HD);
                        break;
                    case R.id.quality_balanced_btn:
                        setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_BALANCED);
                        break;
                    case R.id.quality_flunet_btn:
                        setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET);
                        break;
                    default:
                        break;
                }
            }
        };
        /**
         * 码流配置 清晰度 2-高清,1-标清,0-流畅
         *
         * @see
         * @since V2.0
         */
        private void setQualityMode(final EZConstants.EZVideoLevel mode) {
            // 检查网络是否可用
            if (!ConnectionDetector.isNetworkAvailable(getActivity())) {
                // 提示没有连接网络
                Utils.showToast(getActivity(), "没有连接网络");
                return;
            }
    
            if (mEZPlayer != null) {
    
                Thread thr = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Log.d("ssssssss", "run:"+mCameraInfo.getDeviceSerial()+"......"+mCameraInfo.getCameraNo());
                            String deviceSerial = mCameraInfo.getDeviceSerial();
                            int cameraNo = mCameraInfo.getCameraNo();
                            getOpenSDK().setVideoLevel(deviceSerial, cameraNo, mode.getVideoLevel());
                            mCurrentQulityMode = mode;
                            Message msg = Message.obtain();
                            msg.what = MSG_SET_VEDIOMODE_SUCCESS;
                            mHandler.sendMessage(msg);
                            LogUtil.i(TAG, "setQualityMode success");
                        } catch (BaseException e) {
                            mCurrentQulityMode = EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET;
                            e.printStackTrace();
                            Message msg = Message.obtain();
                            msg.what = MSG_SET_VEDIOMODE_FAIL;
                            mHandler.sendMessage(msg);
                            LogUtil.i(TAG, "setQualityMode fail");
                        }
    
                    }
                }) {
                };
                thr.start();
            }
        }
        private void setVideoLevel() {
            if (mCameraInfo == null || mEZPlayer == null || mDeviceInfo == null) {
                return;
            }
    
            if (mDeviceInfo.getStatus() == 1) {
                mRealPlayQualityBtn.setEnabled(true);
            } else {
                mRealPlayQualityBtn.setEnabled(false);
            }
    
            /************** 本地数据保存 需要更新之前获取到的设备列表信息,开发者自己设置 *********************/
            mCameraInfo.setVideoLevel(mCurrentQulityMode.getVideoLevel());
    
            // 视频质量,2-高清,1-标清,0-流畅
            if (mCurrentQulityMode.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET.getVideoLevel()) {
                mRealPlayQualityBtn.setText(R.string.quality_flunet);
            } else if (mCurrentQulityMode.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_BALANCED.getVideoLevel()) {
                mRealPlayQualityBtn.setText(R.string.quality_balanced);
            } else if (mCurrentQulityMode.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_HD.getVideoLevel()) {
                mRealPlayQualityBtn.setText(R.string.quality_hd);
            }
        }
        /**
         * 获取事件消息任务
         */
        private class GetCamersInfoListTask extends AsyncTask<Void, Void, EZDeviceInfo> {
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
    
            }
    
            @Override
            protected EZDeviceInfo doInBackground(Void... params) {
                if (getActivity().isFinishing()) {
                    return null;
                }
                if (!ConnectionDetector.isNetworkAvailable(getActivity())) {
                    return null;
                }
    
                try {
                    EZDeviceInfo result = null;
    
                    result = getOpenSDK().getDeviceInfo(deviceSerial);
    
                    return result;
    
                } catch (BaseException e) {
                    ErrorInfo errorInfo = (ErrorInfo) e.getObject();
                    LogUtil.debugLog(TAG, errorInfo.toString());
    
                    return null;
                }
            }
    
            @Override
            protected void onPostExecute(EZDeviceInfo result) {
                super.onPostExecute(result);
                if (getActivity().isFinishing()) {
                    return;
                }
    
                if (result != null) {
                    ll_no_camera.setVisibility(View.GONE);
                    mDeviceInfo = result;
                    mCameraInfo = EZUtils.getCameraInfoFromDevice(mDeviceInfo, 0);
                    if (tv_device_name!=null && deviceName !=null){
                        tv_device_name.setText(deviceName);
                    }
                    startRealPlay();
                }else {
                    ll_no_camera.setVisibility(View.VISIBLE);
                }
            }
        }
    }
    

      

  • 相关阅读:
    $GLOBALS超级全局变量
    归来
    Mscorlib.dll 里的 System.Internal 类是干嘛的?
    Query Composition using Functional Programming Techniques in C# 3.0
    反射之人千万不能错过的 EmitHelper
    给自己的Blog程序添加对Windows Live Writer的支持
    WebService的应用之winform身份验证
    c# static 的全部用法收集整理
    ASP.NET设置网站图标
    C# 2.0 之 static class (转)
  • 原文地址:https://www.cnblogs.com/IT-lss/p/7991107.html
Copyright © 2011-2022 走看看