From c56a8e947785f0f4d83edfa59ec89f42a00cf441 Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期二, 28 三月 2017 13:54:06 +0800 Subject: [PATCH] --- VisitFace/DemoForBsk/app/src/main/java/com/bsk/zhangbo/demoforbsk/ui/fragment/OneFragment.java | 289 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 266 insertions(+), 23 deletions(-) diff --git a/VisitFace/DemoForBsk/app/src/main/java/com/bsk/zhangbo/demoforbsk/ui/fragment/OneFragment.java b/VisitFace/DemoForBsk/app/src/main/java/com/bsk/zhangbo/demoforbsk/ui/fragment/OneFragment.java index 8cc21b3..8879093 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/com/bsk/zhangbo/demoforbsk/ui/fragment/OneFragment.java +++ b/VisitFace/DemoForBsk/app/src/main/java/com/bsk/zhangbo/demoforbsk/ui/fragment/OneFragment.java @@ -1,42 +1,77 @@ package com.bsk.zhangbo.demoforbsk.ui.fragment; import android.graphics.Rect; +import android.graphics.SurfaceTexture; import android.os.Bundle; -import android.support.v4.view.ViewPager; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; import android.view.View; import android.widget.RadioButton; import android.widget.RadioGroup; -import android.widget.Toast; import com.bsk.zhangbo.demoforbsk.R; -import com.bsk.zhangbo.demoforbsk.adapter.MyFragmentPagerAdapter; import com.bsk.zhangbo.demoforbsk.adapter.OneBottomRecylerViewAdapter; import com.bsk.zhangbo.demoforbsk.base.BaseFragment; +import com.bsk.zhangbo.demoforbsk.util.RtspFaceNative; import com.bsk.zhangbo.demoforbsk.util.WindowsUtil; +import com.bsk.zhangbo.demoforbsk.widget.MyGLSurfaceView; import com.camnter.easyrecyclerview.widget.EasyRecyclerView; +import com.orhanobut.logger.Logger; import java.util.ArrayList; import java.util.List; + +import cn.com.basic.face.discern.query.item.FacePhotoItem; /** * Created by zhangbo on 2017/2/15. */ -public class OneFragment extends BaseFragment{ +public class OneFragment extends BaseFragment { private RadioGroup mRadioGroup; - private RadioButton mRadioButton1,mRadioButton2; - private View mRadioLine1,mRadioLine2; + private RadioButton mRadioButton1, mRadioButton2; + private View mRadioLine1, mRadioLine2; private OneBottomRecylerViewAdapter mAdapter; private List mList; - private EasyRecyclerView mRecyclerViewRegister,mRecyclerViewUser; - public static OneFragment newInstance() { - return new OneFragment(); + private EasyRecyclerView mRecyclerViewRegister, mRecyclerViewUser; + + //鎾斁 + + String mSourceString = "clips/testfile.mp4"; + + SurfaceView mSurfaceView1; + SurfaceView mSurfaceView2; + SurfaceHolder mSurfaceHolder1; + + VideoSink mSelectedVideoSink; + + + SurfaceHolderVideoSink mSurfaceHolder1VideoSink; + + VideoSink mNativeCodecPlayerVideoSink; + GLViewVideoSink mGLView1VideoSink; + boolean mCreated = false; + boolean mIsPlaying = false; + + /** Load jni .so on initialization */ + static { + System.loadLibrary("rtspface");//xiuxi } + + + private static OneFragment instance = new OneFragment(); + + public static OneFragment getInstance() { + return instance; + } + @Override protected int getLayoutId() { return R.layout.fragment_one; @@ -53,15 +88,93 @@ mRecyclerViewUser = (EasyRecyclerView) view.findViewById(R.id.recyclerview_user); mRadioButton1.setChecked(true); mRecyclerViewRegister.addItemDecoration(new SpaceItemDecoration()); - GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(),2); + GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2); gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); mRecyclerViewRegister.setLayoutManager(gridLayoutManager); mAdapter = new OneBottomRecylerViewAdapter(getActivity()); - } - @Override - protected void initToolbar(Bundle savedInstanceState) { + mSurfaceView2 = (SurfaceView) view.findViewById(R.id.surfaceview2); + mSurfaceView1 = (SurfaceView) view.findViewById(R.id.surfaceview1); + RtspFaceNative.init(); + RtspFaceNative.setSurface(1, mSurfaceView1.getHolder().getSurface()); + RtspFaceNative.setSurface(2, mSurfaceView2.getHolder().getSurface()); + + mSurfaceHolder1 = mSurfaceView1.getHolder(); + + mSurfaceHolder1.addCallback(new SurfaceHolder.Callback() { + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + Logger.e( "surfaceChanged format=" + format + ", width=" + width + ", height=" + + height); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + Logger.e( "surfaceCreated"); + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + Logger.e( "surfaceDestroyed"); + } + + }); + //surfaceview + if (mSurfaceHolder1VideoSink == null) { + mSurfaceHolder1VideoSink = new SurfaceHolderVideoSink(mSurfaceHolder1); + } + mSelectedVideoSink = mSurfaceHolder1VideoSink; + + + //openGL + if(mSurfaceView2 instanceof MyGLSurfaceView) { + ((MyGLSurfaceView)mSurfaceView2).onResume(); + } + if (mGLView1VideoSink == null) { + mGLView1VideoSink = new GLViewVideoSink(mSurfaceView2); + } + mSelectedVideoSink = mGLView1VideoSink; + + + //鎾斁寤惰繜锛堝垵濮嬪寲杈冩參锛屽彲鑳藉鑷存棤娉曟甯告挱鏀撅級 + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(5000); + if (!mCreated) { + if (mNativeCodecPlayerVideoSink == null) { + if (mSelectedVideoSink == null) { + return; + } + mSelectedVideoSink.useAsSinkForNative(); + mSurfaceHolder1VideoSink.useAsSinkForNative(); + //mSelectedVideoSink.useAsSinkForNative(); + //mSurfaceHolder1VideoSink.useAsSinkForNative(); + mNativeCodecPlayerVideoSink = mSelectedVideoSink; + } + if (mSourceString != null) { + //mCreated = createStreamingMediaPlayer(getResources().getAssets(), + // mSourceString); + mCreated = RtspFaceNative.createPlayer(1, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/sub/av_stream"); + mCreated = RtspFaceNative.createPlayer(2, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/sub/av_stream"); + ////mCreated = createPlayer(2, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream"); + } + } + if (mCreated) { + mIsPlaying = !mIsPlaying; + //setPlayingStreamingMediaPlayer(mIsPlaying); + } + + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + thread.start();//xiuxi } @Override @@ -69,7 +182,7 @@ mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { - switch (checkedId){ + switch (checkedId) { case R.id.radio1: mRadioLine1.setVisibility(View.VISIBLE); mRadioLine2.setVisibility(View.INVISIBLE); @@ -89,13 +202,28 @@ @Override protected void initData() { +// switchSurface(); mList = new ArrayList(); - for (int i=0;i<25;i++){ - mList.add(""); + for (int i = 0; i < 125; i++) { + FacePhotoItem item = new FacePhotoItem(); + //item.setType(); + item.setName("寮犱笁"+i); + if (i % 3 == 0) { + item.setStatus("鏉ヨ鐧昏"); + } else { + item.setStatus("绛剧"); + } + if (i % 5 == 0) { + item.setWarning(""); + } else { + item.setWarning("璀﹀憡"); + } + mList.add(item); } mAdapter.setList(mList); mRecyclerViewRegister.setAdapter(mAdapter); } + private class SpaceItemDecoration extends RecyclerView.ItemDecoration { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { @@ -103,17 +231,132 @@ // outRect.bottom = WindowsUtil.dip2px(getActivity(), 7); outRect.right = WindowsUtil.dip2px(getActivity(), 15); - if (parent.getChildLayoutPosition(view) == 0 || parent.getChildLayoutPosition(view) == 1){ - outRect.left = WindowsUtil.dip2px(getActivity(),14); + if (parent.getChildLayoutPosition(view) == 0 || parent.getChildLayoutPosition(view) == 1) { + outRect.left = WindowsUtil.dip2px(getActivity(), 14); } if (parent.getChildLayoutPosition(view) % 2 == 0) { outRect.bottom = WindowsUtil.dip2px(getActivity(), 7); } -// if (parent.getChildLayoutPosition(view) % 2 == 1) { -// outRect.right = WindowsUtil.dip2px(getActivity(), 4); -// }else { -// -// } } } + + void switchSurface() { + if (mCreated && mNativeCodecPlayerVideoSink != mSelectedVideoSink) { + // shutdown and recreate on other surface + Log.i("@@@", "shutting down player"); + RtspFaceNative.shutdown(1); + mCreated = false; + mSelectedVideoSink.useAsSinkForNative(); + mNativeCodecPlayerVideoSink = mSelectedVideoSink; + if (mSourceString != null) { + Log.i("@@@", "recreating player"); + //mCreated = createStreamingMediaPlayer(getResources().getAssets(), mSourceString); + mIsPlaying = false; + mCreated = RtspFaceNative.createPlayer(1, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream"); + mCreated = RtspFaceNative.createPlayer(2, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream"); + ////mCreated = createPlayer(2, "rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream"); + } + } + } + + /** + * Called when the activity is about to be paused. + */ + @Override + public void onPause() { + mIsPlaying = false; + if(mSurfaceView2 instanceof MyGLSurfaceView) { + ((MyGLSurfaceView)mSurfaceView2).onPause(); + } + //setPlayingStreamingMediaPlayer(false);//xiuxi + super.onPause(); + } + + @Override + public void onResume() { + super.onResume(); + if(mSurfaceView2 instanceof MyGLSurfaceView) { + ((MyGLSurfaceView)mSurfaceView2).onResume(); + } + } + + /** + * Called when the activity is about to be destroyed. + */ + @Override + public void onDestroy() { + RtspFaceNative.shutdown(1); + mCreated = false; + super.onDestroy(); + } + + + // VideoSink abstracts out the difference between Surface and SurfaceTexture + // aka SurfaceHolder and GLSurfaceView + static abstract class VideoSink { + + abstract void setFixedSize(int width, int height); + + abstract void useAsSinkForNative(); + + } + + static class SurfaceHolderVideoSink extends VideoSink { + + private final SurfaceHolder mSurfaceHolder; + + SurfaceHolderVideoSink(SurfaceHolder surfaceHolder) { + mSurfaceHolder = surfaceHolder; + } + + @Override + void setFixedSize(int width, int height) { + mSurfaceHolder.setFixedSize(width, height); + } + + @Override + void useAsSinkForNative() { + Surface s = mSurfaceHolder.getSurface(); + Log.i("@@@", "setting surface " + s); + RtspFaceNative.setSurface(1, s); + + + /*SurfaceTexture st = mSurfaceHolder.getSurfaceTexture(); + Surface s = new Surface(st); + RtspFaceNative.setSurface(2, s); + s.release();*/ + } + + } + + + static class GLViewVideoSink extends VideoSink { + + private final SurfaceView SurfaceView; + private final SurfaceHolder mSurfaceHolder; + + GLViewVideoSink(SurfaceView myGLSurfaceView) { + SurfaceView = myGLSurfaceView; + mSurfaceHolder = SurfaceView.getHolder(); + } + + @Override + void setFixedSize(int width, int height) { + mSurfaceHolder.setFixedSize(width, height); + } + + @Override + void useAsSinkForNative() { + if(SurfaceView instanceof MyGLSurfaceView) { + SurfaceTexture st = ((MyGLSurfaceView)SurfaceView).getSurfaceTexture(); + Surface s = new Surface(st); + RtspFaceNative.setSurface(2, s); + s.release(); + } else { + RtspFaceNative.setSurface(2, SurfaceView.getHolder().getSurface()); + } + + } + + } } -- Gitblit v1.8.0