看到论坛的scrcpy 的源码,https://bbs.ijingyi.com/thread-14867868-1-1.html
在他的源码结构上,适配scrcpy 4.0 https://github.com/Genymobile/scrcpy/releases/tag/v4.0
官方的scrcpy-win32-v4.0.zip
没有论坛那源码的转色相关的DLL ,弄了好几天才搞好, 官方用的SDL3 进行的转色渲染,而且可以自动选择渲染器,内部优先级direct3d12>direct3d11>opengl>vulkan>software,当然也能自选,直接放弃原代码的D3D渲染和GDI渲染
通过这个SDL3可以直接创建一个1*1大小的隐藏的SDL3渲染窗口,隐藏且不可见,当然你也可以按论坛源码的结构把SDL3的渲染窗口 置父 依附在自己的分组框
我是只需要截图,经过测试,安卓内部程序尺寸1820*1024 ADB常规截图需1.5-3秒,scrcpy4.0+sdl3截图只需要15-30毫秒,这效率提升了100倍,而且还能直接用scrcpy4.0的键鼠操作! 这真是神器呀!
下面分享一下关于SDL3的代码,大佬们勿笑
如果真 (多媒体库 = 0 ) 返回 (假)DLL调用 (多媒体库, “SDL_SetMainReady”, , , , , , , , , , , , , , , ) 如果真 (DLL调用 (多媒体库, “SDL_Init”, 32, , , , , , , , , , , , , , ) < 0 ) 返回 (假) SDL窗口 = DLL调用 (多媒体库, “SDL_CreateWindow”, 取指针地址 (“Offscreen”), 1, 1, 8, , , , , , , , , , , ) 如果真 (SDL窗口 = 0 ) 调试输出 (“[离屏] 创建隐藏窗口失败”) 返回 (假) SDL渲染器 = DLL调用 (多媒体库, “SDL_CreateRenderer”, SDL窗口, 取指针地址 (指定渲染器 ), , , , , , , , , , , , , )返回 (SDL渲染器 ≠ 0 )
|
| SDL3_刷新离屏数据 | | | |
| 视频宽 | 整数型 | | | | 视频高 | 整数型 | | | | AVFrame指针 | 整数型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | pY | 整数型 | | | | pU | 整数型 | | | | pV | 整数型 | | | | strideY | 整数型 | | | | strideU | 整数型 | | | | strideV | 整数型 | | |
如果真 (AVFrame指针 = 0 或 SDL渲染器 = 0 ) 返回 ()pY = 指针到整数 (AVFrame指针 + 0)pU = 指针到整数 (AVFrame指针 + 4 )pV = 指针到整数 (AVFrame指针 + 8 )strideY = 指针到整数 (AVFrame指针 + 32 )strideU = 指针到整数 (AVFrame指针 + 36 )strideV = 指针到整数 (AVFrame指针 + 40 ) 如果真 (pY = 0 或 strideY = 0 ) 返回 ()
如果真 (SDL纹理 = 0 或 内部_视频宽 ≠ 视频宽 或 内部_视频高 ≠ 视频高 ) 如果真 (SDL纹理 ≠ 0 ) DLL调用 (多媒体库, “SDL_DestroyTexture”, SDL纹理, , , , , , , , , , , , , , )  SDL纹理 = 0    如果真 (SDL离屏纹理 ≠ 0 ) DLL调用 (多媒体库, “SDL_DestroyTexture”, SDL离屏纹理, , , , , , , , , , , , , , )  SDL离屏纹理 = 0
 SDL纹理 = DLL调用 (多媒体库, “SDL_CreateTexture”, SDL渲染器, 1448433993, 1, 视频宽, 视频高, , , , , , , , , , ) 如果真 (SDL纹理 = 0 )   SDL纹理 = DLL调用 (多媒体库, “SDL_CreateTexture”, SDL渲染器, 842089305, 1, 视频宽, 视频高, , , , , , , , , , )
 SDL离屏纹理 = DLL调用 (多媒体库, “SDL_CreateTexture”, SDL渲染器, 372645892, 2, 视频宽, 视频高, , , , , , , , , , ) 内部_视频宽 = 视频宽  内部_视频高 = 视频高 调试输出 (“[离屏] 纹理重建:”, 视频宽, 视频高, “ YUV纹理:”, SDL纹理, “ 离屏纹理:”, SDL离屏纹理 ) 如果真 (SDL纹理 = 0 或 SDL离屏纹理 = 0 ) 返回 () DLL调用 (多媒体库, “SDL_UpdateYUVTexture”, SDL纹理, 0, pY, strideY, pU, strideU, pV, strideV, , , , , , , ) DLL调用 (多媒体库, “SDL_SetRenderTarget”, SDL渲染器, SDL离屏纹理, , , , , , , , , , , , , )DLL调用 (多媒体库, “SDL_RenderClear”, SDL渲染器, , , , , , , , , , , , , , )DLL调用 (多媒体库, “SDL_RenderTexture”, SDL渲染器, SDL纹理, 0, 0, , , , , , , , , , , )DLL调用 (多媒体库, “SDL_SetRenderTarget”, SDL渲染器, 0, , , , , , , , , , , , , )
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 离屏表面 | 整数型 | | | | 表面pitch | 整数型 | | | | 表面像素指针 | 整数型 | | | | 结果字节集 | 字节集 | | |
如果真 (SDL渲染器 = 0 或 SDL离屏纹理 = 0 ) 返回 (结果字节集 ) DLL调用 (多媒体库, “SDL_SetRenderTarget”, SDL渲染器, SDL离屏纹理, , , , , , , , , , , , , )离屏表面 = DLL调用 (多媒体库, “SDL_RenderReadPixels”, SDL渲染器, 0, , , , , , , , , , , , , )DLL调用 (多媒体库, “SDL_SetRenderTarget”, SDL渲染器, 0, , , , , , , , , , , , , ) 如果真 (离屏表面 ≠ 0 ) 表面pitch = 指针到整数 (离屏表面 + 16 ) 表面像素指针 = 指针到整数 (离屏表面 + 20 ) 如果真 (表面像素指针 ≠ 0 且 表面pitch > 0 )  结果字节集 = 指针到字节集 (表面像素指针, 表面pitch × 内部_视频高 ) DLL调用 (多媒体库, “SDL_DestroySurface”, 离屏表面, , , , , , , , , , , , , , )返回 (结果字节集)
|