package com.lyyd.server;
import com.android.ddmlib.*;
import com.lyyd.client.ImageIconUtil;
import org.apache.commons.lang3.StringUtils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class Scrcpy {
private String LOCAL_SCRCPY_PATH = Thread.currentThread().getContextClassLoader().getResource("").getPath() + "scrcpy-server.jar";
private static String REMOTE_SCRCPY_PATH = "/data/local/tmp/scrcpy-server.jar";
private IDevice iDevice;
private String mobileId;
private int width;
private int height;
private int maxSize = 800;
private int pid;
private OutputStream controlOutputStream;
public boolean isRunning = false;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
private String scrcpy_version = "1.24";
private int scrcpy_bitrate = 8000000;
Socket controlSocket = null;
private BufferedImage bImage;
public Scrcpy() {
}
public void setiDevice(IDevice iDevice) {
this.iDevice = iDevice;
}
public void setMobileId(String mobileId) {
this.mobileId = mobileId;
}
/**
* scrcpy连接
*
* @throws Exception
*/
public synchronized void start(JLabel label) throws Exception {
if (isRunning) {
return;
}
pushScrcpyToDevice();
CountDownLatch countDownLatch = new CountDownLatch(1);
new Thread(() -> {
try {
String startCmd = String.format(
"CLASSPATH=%s app_process / com.genymobile.scrcpy.Server " +
"%s " + // Scrcpy server version
"log_level=info " + //Log level: info, verbose...
"max_size=%d " + //Max screen width (long side)
"bit_rate=%s " + //Bitrate of video
"max_fps=60 " + //Max frame per second
"lock_video_orientation=-1 " + // Lock screen orientation: LOCK_SCREEN_ORIENTATION
"tunnel_forward=true " + //Tunnel forward
// "crop=- " + // Crop screen
"send_frame_meta=false " + //Send frame rate to client
"control=true " + // Control enabled
"display_id=0 " + // Display id
"show_touches=false " + //Show touches
"stay_awake=true " + //Stay awake
// "level=256,profile=1 " +
// "codec_options=- " + //Codec (video encoding) options
// "encoder_name=OMX.qcom.video.encoder.avc " + //Encoder name
"power_off_on_close=false", //Power off screen after server closed
REMOTE_SCRCPY_PATH,
scrcpy_version,
maxSize,
scrcpy_bitrate);
System.out.println(mobileId + " start scrcpy: " + startCmd);
iDevice.executeShellCommand(startCmd, new MultiLineReceiver() {
@Override
public void processNewLines(String[] lines) {
for (String line : lines) {
if (!StringUtils.isEmpty(line)) {
if (line.contains("Device:")) {
countDownLatch.countDown();
}
}
}
}
@Override
public boolean isCancelled() {
return false;
}
}, 0, TimeUnit.SECONDS);
isRunning = false;
} catch (Exception e) {
throw new RuntimeException(String.format("[%s]启动scrcpy失败", mobileId), e);
}
}).start();
int scrcpyStartTimeoutInSeconds = 10;
boolean scrcpyStartSuccess = countDownLatch.await(scrcpyStartTimeoutInSeconds, TimeUnit.SECONDS);
if (!scrcpyStartSuccess) {
throw new RuntimeException(String.format("[%s]启动scrcpy失败,超时时间:%d秒", mobileId, scrcpyStartTimeoutInSeconds));
}
System.out.println(mobileId + " scrcpy启动完成");
isRunning = true;
int localPort = PortProvider.getScrcpyAvailablePort();
System.out.println("本地端口:" + localPort);
iDevice.createForward(localPort, "scrcpy", IDevice.DeviceUnixSocketNamespace.ABSTRACT);
new Thread(() -> {
try (Socket screenSocket = new Socket("127.0.0.1", localPort);
InputStream screenStream = screenSocket.getInputStream()) {
if (screenStream.read() != 0) {
throw new RuntimeException(String.format("[%s]scrcpy connection error", mobileId));
}
System.out.println(mobileId + " connect scrcpy success");
controlSocket = new Socket("127.0.0.1", localPort);
controlOutputStream = controlSocket.getOutputStream();
for (int i = 0; i < 64; i++) {
screenStream.read();
}
width = screenStream.read() << 8 | screenStream.read();
height = screenStream.read() << 8 | screenStream.read();
setWidth(width);
setHeight(height);
System.out.println(mobileId + " scrcpy width: " + width + " heigth: " + height);
InputStream in = screenSocket.getInputStream();
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(in);
frameGrabber.setFrameRate(60);
frameGrabber.setFormat("h264");
frameGrabber.setVideoBitrate(8000000);
frameGrabber.setVideoOption("preset", "ultrafast");
frameGrabber.start(false);
while (isRunning) {
if (screenSocket != null) {
Frame frame = frameGrabber.grab();
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.convert(frame);
if (bufferedImage != null) {
label.setIcon(ImageIconUtil.createAutoAdjustIcon(bufferedImage, true));
label.setAlignmentX(0.5f);
label.setAlignmentY(0.5f);
}
}
}
} catch (Exception e) {
System.out.println(mobileId + " 处理scrcpy数据失败");
e.printStackTrace();
} finally {
if (controlOutputStream != null) {
try {
controlOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (controlSocket != null) {
try {
controlSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println(mobileId + " �
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
Swing GUI版本Scrcpy投屏Demo源码 (224个子文件)
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
ScrcpyGui.iml 22KB
scrcpy-server.jar 40KB
scrcpy-server.jar 36KB
Scrcpy.java 12KB
RunUI.java 12KB
AdbWrapper.java 5KB
AdbTools.java 5KB
ImageIconUtil.java 3KB
PortProvider.java 3KB
NetUtil.java 1KB
CommonUtil.java 763B
DdmlibException.java 560B
PhysicalSize.java 481B
DebugOutput.java 88B
arc_theme_dark.theme.json 9KB
workspace.xml 12KB
uiDesigner.xml 9KB
pom.xml 2KB
Maven__org_bytedeco_librealsense2_platform_2_50_0_1_5_7.xml 646B
Maven__org_bytedeco_flycapture_platform_2_13_3_31_1_5_7.xml 646B
Maven__org_bytedeco_librealsense_platform_1_12_4_1_5_7.xml 639B
Maven__org_bytedeco_artoolkitplus_platform_2_3_1_1_5_7.xml 639B
Maven__org_bytedeco_libfreenect2_platform_0_2_0_1_5_7.xml 632B
compiler.xml 628B
Maven__org_bytedeco_libfreenect_platform_0_5_7_1_5_7.xml 625B
Maven__org_bytedeco_videoinput_platform_0_200_1_5_7.xml 618B
Maven__org_bytedeco_leptonica_platform_1_82_0_1_5_7.xml 618B
Maven__org_bytedeco_flycapture_windows_x86_64_2_13_3_31_1_5_7.xml 613B
Maven__org_bytedeco_librealsense2_windows_x86_64_2_50_0_1_5_7.xml 613B
Maven__org_bytedeco_tesseract_platform_5_0_1_1_5_7.xml 611B
Maven__org_bytedeco_librealsense2_macosx_x86_64_2_50_0_1_5_7.xml 611B
Maven__org_bytedeco_openblas_platform_0_3_19_1_5_7.xml 611B
Maven__org_bytedeco_libdc1394_platform_2_2_6_1_5_7.xml 611B
Maven__org_bytedeco_librealsense2_linux_x86_64_2_50_0_1_5_7.xml 609B
Maven__org_bytedeco_flycapture_linux_x86_64_2_13_3_31_1_5_7.xml 609B
Maven__org_bytedeco_flycapture_linux_arm64_2_13_3_31_1_5_7.xml 607B
Maven__org_bytedeco_flycapture_linux_armhf_2_13_3_31_1_5_7.xml 607B
Maven__org_bytedeco_librealsense2_windows_x86_2_50_0_1_5_7.xml 607B
Maven__org_bytedeco_librealsense2_linux_armhf_2_50_0_1_5_7.xml 607B
Maven__org_bytedeco_flycapture_windows_x86_2_13_3_31_1_5_7.xml 607B
Maven__org_bytedeco_librealsense2_linux_arm64_2_50_0_1_5_7.xml 607B
Maven__org_bytedeco_librealsense_windows_x86_64_1_12_4_1_5_7.xml 606B
Maven__org_bytedeco_artoolkitplus_android_x86_64_2_3_1_1_5_7.xml 606B
Maven__org_bytedeco_artoolkitplus_windows_x86_64_2_3_1_1_5_7.xml 606B
Maven__org_bytedeco_librealsense_macosx_x86_64_1_12_4_1_5_7.xml 604B
Maven__org_bytedeco_artoolkitplus_linux_ppc64le_2_3_1_1_5_7.xml 604B
Maven__org_bytedeco_artoolkitplus_macosx_x86_64_2_3_1_1_5_7.xml 604B
Maven__org_bytedeco_artoolkitplus_android_arm64_2_3_1_1_5_7.xml 604B
Maven__org_bytedeco_flandmark_platform_1_07_1_5_7.xml 604B
Maven__org_bytedeco_flycapture_linux_x86_2_13_3_31_1_5_7.xml 603B
Maven__org_bytedeco_librealsense2_linux_x86_2_50_0_1_5_7.xml 603B
Maven__org_bytedeco_artoolkitplus_linux_x86_64_2_3_1_1_5_7.xml 602B
Maven__org_bytedeco_librealsense_linux_x86_64_1_12_4_1_5_7.xml 602B
Maven__org_bytedeco_artoolkitplus_linux_arm64_2_3_1_1_5_7.xml 600B
Maven__org_bytedeco_librealsense_linux_arm64_1_12_4_1_5_7.xml 600B
Maven__org_bytedeco_artoolkitplus_android_arm_2_3_1_1_5_7.xml 600B
Maven__org_bytedeco_artoolkitplus_android_x86_2_3_1_1_5_7.xml 600B
Maven__org_bytedeco_artoolkitplus_windows_x86_2_3_1_1_5_7.xml 600B
Maven__org_bytedeco_artoolkitplus_linux_armhf_2_3_1_1_5_7.xml 600B
Maven__org_bytedeco_librealsense_windows_x86_1_12_4_1_5_7.xml 600B
Maven__org_bytedeco_librealsense_linux_armhf_1_12_4_1_5_7.xml 600B
Maven__org_bytedeco_libfreenect2_windows_x86_64_0_2_0_1_5_7.xml 599B
Maven__org_bytedeco_libfreenect2_macosx_x86_64_0_2_0_1_5_7.xml 597B
Maven__org_bytedeco_librealsense_linux_x86_1_12_4_1_5_7.xml 596B
Maven__org_bytedeco_artoolkitplus_linux_x86_2_3_1_1_5_7.xml 596B
Maven__org_bytedeco_libfreenect2_linux_x86_64_0_2_0_1_5_7.xml 595B
Maven__org_bytedeco_libfreenect_windows_x86_64_0_5_7_1_5_7.xml 592B
Maven__org_bytedeco_libfreenect_macosx_x86_64_0_5_7_1_5_7.xml 590B
Maven__org_bytedeco_opencv_platform_4_5_5_1_5_7.xml 590B
Maven__org_bytedeco_libfreenect_linux_ppc64le_0_5_7_1_5_7.xml 590B
Maven__org_bytedeco_libfreenect2_linux_x86_0_2_0_1_5_7.xml 589B
Maven__org_bytedeco_libfreenect_linux_x86_64_0_5_7_1_5_7.xml 588B
Maven__org_bytedeco_libfreenect_windows_x86_0_5_7_1_5_7.xml 586B
Maven__org_bytedeco_libfreenect_linux_arm64_0_5_7_1_5_7.xml 586B
Maven__org_bytedeco_libfreenect_linux_armhf_0_5_7_1_5_7.xml 586B
Maven__org_bytedeco_leptonica_android_x86_64_1_82_0_1_5_7.xml 585B
Maven__org_bytedeco_leptonica_windows_x86_64_1_82_0_1_5_7.xml 585B
Maven__org_bytedeco_videoinput_windows_x86_64_0_200_1_5_7.xml 585B
Maven__org_bytedeco_flycapture_2_13_3_31_1_5_7.xml 583B
Maven__org_bytedeco_leptonica_linux_ppc64le_1_82_0_1_5_7.xml 583B
Maven__org_bytedeco_librealsense2_2_50_0_1_5_7.xml 583B
Maven__org_bytedeco_leptonica_android_arm64_1_82_0_1_5_7.xml 583B
Maven__org_bytedeco_leptonica_macosx_x86_64_1_82_0_1_5_7.xml 583B
Maven__org_bytedeco_libfreenect_linux_x86_0_5_7_1_5_7.xml 582B
Maven__org_bytedeco_leptonica_linux_x86_64_1_82_0_1_5_7.xml 581B
Maven__org_bytedeco_leptonica_android_x86_1_82_0_1_5_7.xml 579B
Maven__org_bytedeco_videoinput_windows_x86_0_200_1_5_7.xml 579B
Maven__org_bytedeco_leptonica_windows_x86_1_82_0_1_5_7.xml 579B
Maven__org_bytedeco_leptonica_android_arm_1_82_0_1_5_7.xml 579B
Maven__org_bytedeco_leptonica_linux_armhf_1_82_0_1_5_7.xml 579B
Maven__org_bytedeco_leptonica_linux_arm64_1_82_0_1_5_7.xml 579B
Maven__org_bytedeco_tesseract_android_x86_64_5_0_1_1_5_7.xml 578B
Maven__org_bytedeco_tesseract_windows_x86_64_5_0_1_1_5_7.xml 578B
Maven__org_bytedeco_libdc1394_windows_x86_64_2_2_6_1_5_7.xml 578B
Maven__org_bytedeco_openblas_android_x86_64_0_3_19_1_5_7.xml 578B
共 224 条
- 1
- 2
- 3
粥截轮
- 粉丝: 14
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0