Android开发经验谈Android技术知识

Scrcpy源码阅读

2020-05-23  本文已影响0人  骆驼骑士

1. 简介

开源项目:
https://github.com/Genymobile/scrcpy

项目简介:
通过在手机端使用虚拟显示器进行录屏, 并直接使用手机自带的视频编码器将屏幕数据编码成视频流(格式H264), 并将其发送成PC端, 使用ffmpeg对视频流进行解码, 并通过SDL将手机屏幕镜像显示到电脑屏幕, 并且再通过控制流将PC端的鼠标手势等操作发送给APP端对手机进行远程遥控.

技术点:
该项目使用的技术和云游戏或手机直播使用的技术类似, 包括录屏, 视频流编码, 推流, 视频流解码, 控制流远程操控等. 扩展内容需查看其他笔记: ffmpeg, WebRTC

目录结构:

2. APP端 (Java)

2.1 Server

Server.main()

2.2 DesktopConnection

DesktopConnection.open(device, tunnelForward)

DesktopConnection.receiveControlMessage()

2.3 ScreenEncoder

ScreenEncoder.streamScreen(device, videoFd)

2.4 Controller

Controller.control()

2.5 SurfaceControl

SurfaceControl

为什么用反射去调用 android.view.SurfaceControl 接口,而不是使用如下的接口:

import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;


virtualDisplay = mediaProjection. **createVirtualDisplay** ("WebRTC_ScreenCapture", width, height,
VIRTUAL_DISPLAY_DPI, DISPLAY_FLAGS, new Surface(surfaceTextureHelper.getSurfaceTexture()),
null /* callback */, null /* callback handler */);


这些接口可能需要权限,以及Context,而在命令行运行的dex没有这些。

3. PC端 (C语言)

3.1 main

main()

execute_server: 拉起PC端的命令及参数说明:

adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process
/                                   // unused
com.genymobile.scrcpy.Server        // java main class
1.13                                // version
0                                   // max_size
8000000                             // bit_rate
0                                   // max_fps
-1                                  // lock_video_orientation
false                               // trunel_forward
-                                   // crop
true                                // send frame meta
true                                // iscontrol

NOTE ATTRIBUTES

Created Date: 2020-05-18 04:41:29
Last Evernote Update Date: 2020-05-20 03:22:46

上一篇下一篇

猜你喜欢

热点阅读