又名 基于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签名工具
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX网络编程 卷1:套接字联网API(第3版)
[美]W. 理查德•史蒂文斯(W. Richard Stevens)、比尔• 芬纳(Bill Fenner)、安德鲁 M. 鲁道夫(Andrew M. Rudoff) / 匿名 / 人民邮电出版社 / 2014-6-1 / 129.00
《UNIX环境高级编程(第3版)》是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的第3版。在本书第2版出版后的8年中,UNIX行业发生了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/......一起来看看 《UNIX网络编程 卷1:套接字联网API(第3版)》 这本书的介绍吧!