又名 基于rstp的录屏直播
步骤:
1.下载lib到本地,然后依赖
git clone https://github.com/wobiancao/RtspServerAndVlcPlay.git
-
如果只是推流端,只需要依赖 rtsplibrary
-
如果只是播放端,只需要依赖 libvlc-android
重点声明: rtsplibrary是基于libstreaming开源封装 libvlc-android是别人开源vlc项目编译好的,非本人编译
libvlc-android 原项目地址: vlc-android-sdk 多点几个star给作者鼓励吧
2.推流端
- 初始化
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) {} }; 复制代码
- 授权成功后开启录屏线程服务
//请求授权 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, "程序发生错误:MediaProjection@1"); RunState.getInstance().setRun(false); return; } //开启录屏线程 mScreenRecord = new ScreenRecordThread(this,mediaProjection, this); mScreenRecord.start(); } catch (Exception e){ } } 复制代码
- 实现H264DataCollecter接口回调,设置推流数据
@Override public void collect(H264Data data) { DataUtil.getInstance().putData(data); } 复制代码
3.播放端
- 布局
<SurfaceView android:id="@+id/player_surface" android:layout_width="match_parent" android:layout_height="match_parent" /> 复制代码
- 实例化
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); 复制代码
- 播放
调用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; } } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 巨杉数据库:我们如何推进商业银行柜面无纸化业务?
- 封装JDBC—非框架开发必备的封装类
- SpringBlade 2.3.2 发布,增加 OSS 封装及单元测试封装
- SpringBlade 2.3.2 发布,增加 OSS 封装及单元测试封装
- docker 封装 alinode
- 封装Apk签名工具
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。