EasyPusher实现Android手机屏幕桌面直播,实时推送操作画面,用于手游直播等应用
2016-09-25 00:34
711 查看
本文转自EasyDarwin开源团队成员John的博客:http://blog.csdn.net/jyt0551/article/details/52651194
由于Android 5.0提供了捕获当前屏幕画面的SDK,基于该SDK,EasyPusher实现了实时推送手机屏幕画面的功能。经测试,效果很不错,延迟也比较低,画面也比较流畅。该功能可运用到小型会议PPT演示、手游直播等行业。具体来说,MediaProjection 类可以将当前屏幕画面采集到一个surface里面,而MediaCodec可以从一个surface里面获取视频数据源。我们让MediaProjection投射到MediaCodec创建的Surface,MediaCodec就可以获取到MediaProjection投射的视频了。如图所示:
MediaProjectionMediaProjectionSurfaceSurfaceMediaCodecMediaCodecEasyPusherEasyPusher投射屏幕提供视频源编码编码数据通过Pusher推送在这里就不再详细描述代码的实现,主要介绍下两个接口:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
1
2
3
4
5
6
然后,将后者得到的Surface作为第6个参数传给前者,前者就可以获取到屏幕数据了~如下图所示,在VLC访问RTSP地址,即可看到屏幕直播。
![](https://img-blog.csdn.net/20160924155925742)
EasyPusher项目见:https://github.com/EasyDarwin/EasyPusher
由于Android 5.0提供了捕获当前屏幕画面的SDK,基于该SDK,EasyPusher实现了实时推送手机屏幕画面的功能。经测试,效果很不错,延迟也比较低,画面也比较流畅。该功能可运用到小型会议PPT演示、手游直播等行业。具体来说,MediaProjection 类可以将当前屏幕画面采集到一个surface里面,而MediaCodec可以从一个surface里面获取视频数据源。我们让MediaProjection投射到MediaCodec创建的Surface,MediaCodec就可以获取到MediaProjection投射的视频了。如图所示:
MediaProjectionMediaProjectionSurfaceSurfaceMediaCodecMediaCodecEasyPusherEasyPusher投射屏幕提供视频源编码编码数据通过Pusher推送在这里就不再详细描述代码的实现,主要介绍下两个接口:
VirtualDisplay createVirtualDisplay (String name, int width, int height, int dpi, int flags, Surface surface, VirtualDisplay.Callback callback, Handler handler) Creates a VirtualDisplay to capture the contents of the screen. Parameters name String: The name of the virtual display, must be non-empty. 要创建的投射器的名称,非空 width int: The width of the virtual display in pixels. Must be greater than 0. 投射后视频的宽度,这里的宽度就是实际上后面MediaCodec初始化的宽度. height int: The height of the virtual display in pixels. Must be greater than 0. 投射后视频的高度,这里的宽度就是实际上后面MediaCodec初始化的高度. dpi int: The density of the virtual display in dpi. Must be greater than 0. 投射器的像素密度,未理解啥意思,我们直接用DisplayMetrics的densityDpi即可. flags int: A combination of virtual display flags. See DisplayManager for the full list of flags. 我们传 DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR|DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC|DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION 即可。 surface Surface: The surface to which the content of the virtual display should be rendered, or null if there is none initially. 投射器要投射到的Surface callback VirtualDisplay.Callback: Callback to call when the virtual display's state changes, or null if none. 投射器更改后的状态回调,我们这里不需要,传null即可。 handler Handler: The Handler on which the callback should be invoked, or null if the callback should be invoked on the calling thread's main Looper. 回调函数将在该Handler所在的线程调用,我们也不需要,传null即可。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
createInputSurface Surface createInputSurface () Requests a Surface to use as the input to an encoder, in place of input buffers. 该接口创建一个作为编码器输入的Surface。1
2
3
4
5
6
1
2
3
4
5
6
然后,将后者得到的Surface作为第6个参数传给前者,前者就可以获取到屏幕数据了~如下图所示,在VLC访问RTSP地址,即可看到屏幕直播。
EasyPusher项目见:https://github.com/EasyDarwin/EasyPusher
获取更多信息
邮件:support@easydarwin.orgWEB:www.EasyDarwin.orgCopyright © EasyDarwin.org 2012-2016![](http://www.easydarwin.org/skin/easydarwin/images/wx_qrcode.jpg)
相关文章推荐
- EasyPusher实现Android手机屏幕桌面直播,实时推送操作画面,用于手游直播等应用
- EasyPusher实现Android手机屏幕桌面直播,实时推送操作画面,用于手游直播等应用
- [转]EasyPusher实现安卓Android手机直播推送同步录像功能(源码解析)
- 手机Android音视频采集与直播推送,实现单兵、移动监控类应用
- 手机Android音视频采集与直播推送,实现单兵、移动监控类应用
- 手机Android音视频采集与直播推送,实现单兵、移动监控类应用
- 手机Android音视频采集与直播推送,实现单兵、移动监控类应用
- 手机Android音视频采集与直播推送,实现单兵、移动监控类应用
- 手机Android音视频采集与直播推送,实现单兵、移动监控类应用
- 手机Android音视频采集与直播推送,实现单兵、移动监控类应用
- 手机Android音视频採集与直播推送,实现单兵、移动监控类应用
- EasyPusher实现安卓Android手机直播推送同步录像功能(源码解析)
- 基于EasyDarwin EasyPusher实现Android手机直播推送功能
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
- 安卓Android手机直播推送同步录像功能设计与实现源码
- EasyIPCamera实现的桌面采集直播用于课堂、会议、展销同屏等应用
- EasyPusher安卓Android手机直播推送之RTSP流媒体协议流程
- EasyPusher Android实时推送当前屏幕画面
- EasyPusher手机直播编码推送之图像旋转90度后画面重复的问题
- android应用怎么自动操作手机屏幕?