From d0bbfc22060a19082f235bb642a8a00774098d0a Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期一, 20 三月 2017 15:51:16 +0800 Subject: [PATCH] --- VisitFace/DemoForBsk/app/src/main/java/com/bsk/zhangbo/demoforbsk/ui/fragment/OneFragment.java | 278 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 264 insertions(+), 14 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..7f22d73 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,11 +1,17 @@ package com.bsk.zhangbo.demoforbsk.ui.fragment; +import android.content.res.AssetManager; 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; @@ -15,10 +21,15 @@ 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.ui.activity.TestARGB8888Activity; 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.Collection; +import java.util.Collections; import java.util.List; @@ -26,17 +37,67 @@ * 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; + private EasyRecyclerView mRecyclerViewRegister, mRecyclerViewUser; + + + //鎾斁 + + String mSourceString = "clips/testfile.mp4"; + + SurfaceView mSurfaceView1; + MyGLSurfaceView mGLView1; + SurfaceHolder mSurfaceHolder1; + + VideoSink mSelectedVideoSink; + VideoSink mNativeCodecPlayerVideoSink; + + SurfaceHolderVideoSink mSurfaceHolder1VideoSink; + + GLViewVideoSink mGLView1VideoSink; + boolean mCreated = false; + boolean mIsPlaying = false; + +// SurfaceHolderVideoSink mSurfaceHolder1VideoSink; +// VideoSink mSelectedVideoSink; +// VideoSink mNativeCodecPlayerVideoSink; +// SurfaceView mSurfaceView1; +// SurfaceHolder mSurfaceHolder1; +// boolean mCreated = false; +// boolean mIsPlaying = false; +// String mSourceString = "clips/testfile.mp4"; + + /** + * Native methods, implemented in jni folder + */ +// public static native void createEngine(); +// +// public static native boolean createStreamingMediaPlayer(AssetManager assetMgr, String filename); +// +// public static native void setPlayingStreamingMediaPlayer(boolean isPlaying); +// +// public static native void shutdown(); +// +// public static native void setSurface(Surface surface); +// +// public static native void rewindStreamingMediaPlayer(); + + /** Load jni .so on initialization */ + static { + //System.loadLibrary("native-codec-jni");//xiuxi + } + + public static OneFragment newInstance() { return new OneFragment(); } + @Override protected int getLayoutId() { return R.layout.fragment_one; @@ -53,10 +114,81 @@ 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()); + + + mGLView1 = (MyGLSurfaceView) view.findViewById(R.id.surfaceview2); + mSurfaceView1 = (SurfaceView) view.findViewById(R.id.surfaceview1); + 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 + mGLView1.onResume(); + if (mGLView1VideoSink == null) { + mGLView1VideoSink = new GLViewVideoSink(mGLView1); + } + 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(); + mNativeCodecPlayerVideoSink = mSelectedVideoSink; + } + if (mSourceString != null) { + mCreated = createStreamingMediaPlayer(getResources().getAssets(), + mSourceString); + } + } + if (mCreated) { + mIsPlaying = !mIsPlaying; + setPlayingStreamingMediaPlayer(mIsPlaying); + } + + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + //thread.start();//xiuxi } @Override @@ -69,7 +201,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 +221,16 @@ @Override protected void initData() { +// switchSurface(); mList = new ArrayList(); - for (int i=0;i<25;i++){ + for (int i = 0; i < 25; i++) { mList.add(""); } 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 +238,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"); + shutdown(); + mCreated = false; + mSelectedVideoSink.useAsSinkForNative(); + mNativeCodecPlayerVideoSink = mSelectedVideoSink; + if (mSourceString != null) { + Log.i("@@@", "recreating player"); + mCreated = createStreamingMediaPlayer(getResources().getAssets(), mSourceString); + mIsPlaying = false; + } + } + } + + /** + * Called when the activity is about to be paused. + */ + @Override + public void onPause() { + mIsPlaying = false; + mGLView1.onPause(); + //setPlayingStreamingMediaPlayer(false);//xiuxi + super.onPause(); + } + + @Override + public void onResume() { + super.onResume(); + mGLView1.onResume(); + } + + /** + * Called when the activity is about to be destroyed. + */ + @Override + public void onDestroy() { + shutdown(); + mCreated = false; + super.onDestroy(); + } + + /** + * Native methods, implemented in jni folder + */ +// public static native void createEngine(); + + public static native boolean createStreamingMediaPlayer(AssetManager assetMgr, String filename); + + public static native void setPlayingStreamingMediaPlayer(boolean isPlaying); + + public static native void shutdown(); + + public static native void setSurface(Surface surface); + + public static native void rewindStreamingMediaPlayer(); + + /** Load jni .so on initialization */ + static { + //System.loadLibrary("native-codec-jni");//xiuxi + } + + // 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); + setSurface(s); + } + + } + + + static class GLViewVideoSink extends VideoSink { + + private final MyGLSurfaceView mMyGLSurfaceView; + + GLViewVideoSink(MyGLSurfaceView myGLSurfaceView) { + mMyGLSurfaceView = myGLSurfaceView; + } + + @Override + void setFixedSize(int width, int height) { + } + + @Override + void useAsSinkForNative() { + SurfaceTexture st = mMyGLSurfaceView.getSurfaceTexture(); + Surface s = new Surface(st); + setSurface(s); + s.release(); + } + + } } -- Gitblit v1.8.0