now we can show screen android to the browser yea yea yea!
This commit is contained in:
parent
d6cba315ec
commit
35ebde967d
3 changed files with 20 additions and 17 deletions
|
|
@ -33,7 +33,7 @@ const MainLayout = () => {
|
||||||
<div>
|
<div>
|
||||||
<Sidebar />
|
<Sidebar />
|
||||||
<Header />
|
<Header />
|
||||||
<main className="fixed pt-[5rem] pl-[21rem]">
|
<main className="absolute top-[5rem] left-[21rem]">
|
||||||
<Outlet />
|
<Outlet />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,11 @@ import AdbWebCredentialStore from '@yume-chan/adb-credential-web'
|
||||||
import { Adb, AdbDaemonTransport } from '@yume-chan/adb'
|
import { Adb, AdbDaemonTransport } from '@yume-chan/adb'
|
||||||
import useAdb from '../hooks/useAdb'
|
import useAdb from '../hooks/useAdb'
|
||||||
import type { AdbScrcpyVideoStream } from '@yume-chan/adb-scrcpy'
|
import type { AdbScrcpyVideoStream } from '@yume-chan/adb-scrcpy'
|
||||||
import { AdbScrcpyClient, AdbScrcpyOptions2_1 } from '@yume-chan/adb-scrcpy'
|
import { AdbScrcpyClient, AdbScrcpyOptions1_22 } from '@yume-chan/adb-scrcpy'
|
||||||
import { WebCodecsDecoder } from '@yume-chan/scrcpy-decoder-webcodecs'
|
import { WebCodecsDecoder } from '@yume-chan/scrcpy-decoder-webcodecs'
|
||||||
import {
|
import {
|
||||||
ScrcpyLogLevel1_18,
|
ScrcpyLogLevel1_18,
|
||||||
ScrcpyOptions2_2,
|
ScrcpyOptions1_25,
|
||||||
ScrcpyVideoCodecId
|
ScrcpyVideoCodecId
|
||||||
} from '@yume-chan/scrcpy'
|
} from '@yume-chan/scrcpy'
|
||||||
import { useCallback, useRef, useState } from 'react'
|
import { useCallback, useRef, useState } from 'react'
|
||||||
|
|
@ -78,7 +78,7 @@ const AndroidPage: React.FC = () => {
|
||||||
|
|
||||||
async function scrcpyConnect() {
|
async function scrcpyConnect() {
|
||||||
const server: ArrayBuffer = await fetch(
|
const server: ArrayBuffer = await fetch(
|
||||||
new URL('../scrcpy/scrcpy_server_v2.2', import.meta.url)
|
new URL('../scrcpy/scrcpy_server_v1.25', import.meta.url)
|
||||||
).then(res => res.arrayBuffer())
|
).then(res => res.arrayBuffer())
|
||||||
|
|
||||||
await AdbScrcpyClient.pushServer(
|
await AdbScrcpyClient.pushServer(
|
||||||
|
|
@ -92,7 +92,7 @@ const AndroidPage: React.FC = () => {
|
||||||
)
|
)
|
||||||
|
|
||||||
const res = await adb!.subprocess.spawn(
|
const res = await adb!.subprocess.spawn(
|
||||||
'CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.2'
|
'CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 1.25'
|
||||||
)
|
)
|
||||||
|
|
||||||
res.stdout.pipeThrough(new DecodeUtf8Stream()).pipeTo(
|
res.stdout.pipeThrough(new DecodeUtf8Stream()).pipeTo(
|
||||||
|
|
@ -103,25 +103,25 @@ const AndroidPage: React.FC = () => {
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
const scrcpyOption = new ScrcpyOptions2_2({
|
const scrcpyOption = new ScrcpyOptions1_25({
|
||||||
audio: false,
|
|
||||||
maxFps: 60,
|
maxFps: 60,
|
||||||
control: false,
|
control: true,
|
||||||
video: true,
|
|
||||||
logLevel: ScrcpyLogLevel1_18.Debug,
|
logLevel: ScrcpyLogLevel1_18.Debug,
|
||||||
stayAwake: true,
|
stayAwake: true
|
||||||
cleanup: true
|
|
||||||
})
|
})
|
||||||
const _client = await AdbScrcpyClient.start(
|
const _client = await AdbScrcpyClient.start(
|
||||||
adb!,
|
adb!,
|
||||||
'/data/local/tmp/scrcpy-server.jar',
|
'/data/local/tmp/scrcpy-server.jar',
|
||||||
'2.2',
|
'1.25',
|
||||||
new AdbScrcpyOptions2_1(scrcpyOption)
|
new AdbScrcpyOptions1_22(scrcpyOption)
|
||||||
)
|
)
|
||||||
|
|
||||||
const videoStream: AdbScrcpyVideoStream | undefined =
|
const videoStream: AdbScrcpyVideoStream | undefined =
|
||||||
await _client?.videoStream
|
await _client?.videoStream
|
||||||
const _decoder = new WebCodecsDecoder(ScrcpyVideoCodecId.H264)
|
const _decoder = new WebCodecsDecoder(ScrcpyVideoCodecId.H264)
|
||||||
|
|
||||||
|
_decoder.renderer.style.maxHeight = 'inherit'
|
||||||
|
|
||||||
screenRef.current?.appendChild(_decoder.renderer)
|
screenRef.current?.appendChild(_decoder.renderer)
|
||||||
videoStream?.stream.pipeTo(_decoder.writable)
|
videoStream?.stream.pipeTo(_decoder.writable)
|
||||||
setDecoder(_decoder)
|
setDecoder(_decoder)
|
||||||
|
|
@ -138,6 +138,9 @@ const AndroidPage: React.FC = () => {
|
||||||
function scrcpyDisconnect() {
|
function scrcpyDisconnect() {
|
||||||
decoder?.dispose()
|
decoder?.dispose()
|
||||||
client?.close()
|
client?.close()
|
||||||
|
if (decoder && screenRef.current) {
|
||||||
|
screenRef.current.removeChild(decoder.renderer)
|
||||||
|
}
|
||||||
setClient(undefined)
|
setClient(undefined)
|
||||||
setDecoder(undefined)
|
setDecoder(undefined)
|
||||||
}
|
}
|
||||||
|
|
@ -147,8 +150,9 @@ const AndroidPage: React.FC = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div className="overflow-y-auto flex flex-row w-[1080px] h-full">
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div ref={screenRef} className="flex-grow-[0.7] h-full"></div>
|
||||||
|
<div className="justify-center items-center flex-grow-[0.3]">
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<button
|
<button
|
||||||
className="btn btn-primary"
|
className="btn btn-primary"
|
||||||
|
|
@ -166,8 +170,7 @@ const AndroidPage: React.FC = () => {
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-white">{adb && device ? device.name : ''}</div>
|
<div className="bg-white">{adb && device ? device.name : ''}</div>
|
||||||
</div>
|
</div>
|
||||||
<div ref={screenRef}></div>
|
</div>
|
||||||
</>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
BIN
client-electron/src/scrcpy/scrcpy_server_v1.25
Normal file
BIN
client-electron/src/scrcpy/scrcpy_server_v1.25
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue