1. 程式人生 > >區域網無紙化會議封裝,只需三步實現推流和播放

區域網無紙化會議封裝,只需三步實現推流和播放

又名 基於rstp的錄屏直播

結構圖

vlc播放效果

上篇文章

步驟:

1.下載lib到本地,然後依賴

RtspServerAndVlcPlay

git clone https://github.com/wobiancao/RtspServerAndVlcPlay.git

  1. 如果只是推流端,只需要依賴 rtsplibrary

  2. 如果只是播放端,只需要依賴 libvlc-android

重點宣告: rtsplibrary是基於libstreaming開源封裝 libvlc-android是別人開源vlc專案編譯好的,非本人編譯

libvlc-android 原專案地址:

vlc-android-sdk 多點幾個star給作者鼓勵吧

2.推流端

  1. 初始化
    public static final int REQUEST_CODE = 1001;
    private RtspServer mRtspServer;
    private MediaProjectionManager mMediaProjectionManager;
    private ScreenRecordThread mScreenRecord;

    mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
    private ServiceConnection mRtspServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mRtspServer = ((RtspServer.LocalBinder)service).getService();
            mRtspServer.addCallbackListener(mRtspCallbackListener);
            mRtspServer.start();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {}
    };
複製程式碼
  1. 授權成功後開啟錄屏執行緒服務
            //請求授權
            Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
            startActivityForResult(captureIntent, REQUEST_CODE);
            bindService(new Intent(this,RtspServer.class), mRtspServiceConnection, Context.BIND_AUTO_CREATE);
            //授權回撥
             public void onActivityResult(int requestCode, int resultCode, Intent data) {
              try {
                  MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
                  if
(mediaProjection == null){ T.showShort(ServerActivity.this, "程式發生錯誤:[email protected]"); RunState.getInstance().setRun(false); return; } //開啟錄屏執行緒 mScreenRecord = new ScreenRecordThread(this,mediaProjection, this); mScreenRecord.start(); } catch (Exception e){ } } 複製程式碼
  1. 實現H264DataCollecter介面回撥,設定推流資料
@Override
    public void collect(H264Data data) {
        DataUtil.getInstance().putData(data);
    }
複製程式碼

3.播放端

  1. 佈局
<SurfaceView
        android:id="@+id/player_surface"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
複製程式碼
  1. 例項化
    SurfaceView mPlayView;
    private String playUrl = "";
    private LibVLC libVLC = null;
    private MediaPlayer mediaPlayer;
    private SurfaceHolder mSurfaceHolder;

        ArrayList<String> options = new ArrayList<>();
        libVLC = new LibVLC(getApplication(), options);
        mediaPlayer = new MediaPlayer(libVLC);
        mSurfaceHolder = mPlayView.getHolder();//用於設定檢視
        mSurfaceHolder.setFixedSize(DisplayUtils.getDisplayW(this), DisplayUtils.getDisplayH(this));
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mediaPlayer.getVLCVout().setVideoSurface(mPlayView.getHolder().getSurface(), mSurfaceHolder);
        mediaPlayer.getVLCVout().attachViews();
        Media media = new Media(libVLC, Uri.parse(playUrl));
        mediaPlayer.setMedia(media);
複製程式碼
  1. 播放 呼叫mediaPlayer.play();方法即可開始播放
//設定全屏去掉狀態列虛擬鍵 螢幕常亮
private void onPreCreate() {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        //去除title
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //去掉Activity上面的狀態列
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //去掉虛擬按鍵全屏顯示
//        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav
                        // bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//螢幕常亮
    }

public void onExit(View view) {
        finish();
    }

    //物理按鍵 虛擬按鍵 全部遮蔽
    @Override
    public void onBackPressed() {
        return;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_BACK) {
            return true;
        } else {
            return super.onKeyDown(keyCode, event);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mediaPlayer != null) {
            mediaPlayer.pause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mediaPlayer != null) {
            mediaPlayer.play();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

複製程式碼

體驗

qr.png

apk下載地址

本專案github地址

歡迎star

Thanks

libstreaming

AndroidShow

ScreenRecorder

vlc-android-sdk