qq_24715319 2023-05-09 14:26 采纳率: 30%
浏览 63
已结题

scrcpy-server.jar 怎么接收屏幕数据

首先我不会Linux ,只会Win系统,我不会C#、C++和JAVA,我会些GOLANG基础和易语言
看scrcpy-server和ffmpeg的源码根本看不懂,所以遇到难度,求爱心人帮解决。

我的对于scrcpy-server的步骤如下:
1、上传到手机:adb push scrcpy-server /data/local/tmp/scrcpy-server.jar
2、提升权限:adb shell chmod 0755 /data/local/tmp/scrcpy-server.jar
3、添加映射:adb forward tcp:3031 localabstract:scrcpy
4、启动应用服务:adb shell CLASSPATH=/data/local/tmp/AuxControl.jar app_process / com.genymobile.scrcpy.Server 1.24 tunnel_forward=true control=false
5、自己用golang编写TCP客户端,连接3031端口,收到实时视频流数据,但是一直没有办法解决沾包问题。

通过外网寻找scrcpy-server 相关资料,得到的是(手机服务端在发送一帧数据包前,会先发送pts 信息,和包长度,所以在客户端进行解码这部分的视频流的时候,先取出12个字节,其中8个字节是long类型,为pts时间戳,4个字节是数据包长度,意味着这一帧的长度,只有将这个长度的内容完整读取,才能正常渲染,如果某一次因为缓冲没有读取完,那只有等待下次继续读取,直到读取到数据的尾部。最后送显),括号的解释看似简单,我采用GO和易语言读取12个字节,在读取后4个字节,一直得不到数据流的真实数据长度。

对于ffmpeg,看不懂源码,更不知道怎么调用DLL来实现。

如果你能解决的问题,参考以下任何一种方式来解决:
1、对于JAVA,直接修改scrcpy-server源码实现,发送完整包,不要分包发送。也可以改为Web Socket方式转发出来,不需要转码,只要完整的H264
2、对于C语言,写成DLL,动态创建Web Socket把数据转发出来
3、关于ws-scrcpy,我是一直没有安装成功过包括WIN和LInux,但是有个docker版本,安装成功了,但是不能控制,对与ws-scrcpy也是不熟悉,NODEJS代码还好,里面又包含了其他的一种语言,至于怎么接收屏幕数据到显示,在到控制等消息格式,更是不清楚。

  • 写回答

4条回答 默认 最新

  • XJTQM 2023-05-09 20:10
    关注

    你遇到的问题挺有难度的,我可以给你提供一些思路和建议。

    针对你在使用GO语言读取12个字节的情况,你可以考虑使用binary.Read()函数,以确保正确地获取相应的数据类型。像这样:

    import (
        "bytes"
        "encoding/binary"
    )
    
    bytesReader := bytes.NewReader(buffer) // buffer是读取到的数据包
    var pts int64
    var length int32
    
    err := binary.Read(bytesReader, binary.LittleEndian, &pts)
    if err != nil {
        panic(err)
    }
    
    err = binary.Read(bytesReader, binary.LittleEndian, &length)
    if err != nil {
        panic(err)
    }
    

    这段代码会自动地将字节流解析成对应的数据类型。

    关于FFmpeg的使用,你可以考虑在GO语言中使用FFmpeg的API或库文件来解决你的问题。你可以使用ffmpeg的API调用,对H264流进行解码,获取每一帧的图像数据。其中,FFmpeg提供了一些已经实现好的解码器,如h264解码器。你需要读取H264流,将读取到的数据通过解码器进行解码,获取每一帧图像的数据。

    此外,如果你打算使用C语言来实现,你可以将FFmpeg封装成DLL库文件,使用C语言中动态链接库的相关函数,将FFmpeg集成到你的代码中。

    针对你提到的ws-scrcpy,它是一种基于Websocket协议的Android设备屏幕共享工具,它可以使用JavaScript或Node.js实现。其中,前端可以通过WebSocket协议获取H264码流并将其展示出来,后端则可以使用FFmpeg进行视频解码,以获取每一帧的图像数据。如果你感兴趣,你可以了解一下WebSocket和Node.js相关的知识,这可能会对你的开发有所帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月17日
  • 修改了问题 5月9日
  • 创建了问题 5月9日

悬赏问题

  • ¥15 bat批处理,关于数据复制问题
  • ¥50 同步两个不同结果的array中某些属性
  • ¥15 悬赏15远程操控解决问题
  • ¥15 CST复制的模型无法单独修改参数?
  • ¥15 前端页面想做个定时任务,但是使用requestAnimationFrame,setinterval和settimeout都不行
  • ¥15 根据以下文字信息,做EA模型图
  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)