adb를 통해 Squist를 Python으로 고속 가져오기
지금까지 사용한 방법.
adb exec-out screencap -p
에서 출력된 pg 바이트 열을 호스트에 다시 저장하고 PIL과 cv2를 통해 읽습니다.import cv2
def screencap(fname="tmp.png"):
subprocess.run(f"adb exec-out screencap -p > {fname}", shell=True)
return cv2.imread(fname)
메모리에서 바이트 열을 변환하고 읽기 (파일을 통과하지 않음)
np.fromstring
Warning이 있어서 np.frombuffer
로 바꿨어요.cv2의 여러분은 pg를 pg로 변환해서 호스트 쪽으로 가져갈 수 있습니까?
나는 그림의 형식을 몰라서 복사해서 붙일 수 없다.
import cv2
import numpy as np
from PIL import Image
def screencap2cv2():
pipe = subprocess.Popen(
"adb shell screencap -p",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE, shell=True)
image_bytes = pipe.stdout.read()
return cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)
def screencap2pil(width: int, height: int):
pipe = subprocess.Popen(
"adb shell screencap",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE, shell=True)
img_bytes = pipe.stdout.read()
return Image.frombuffer('RGBA', (width, height), img_bytes[12:], 'raw', 'RGBX', 0, 1)
scrcpy 경과
방향성이 조금 바뀌었지만 adb를 통해서는 사기가 아니기 때문에 위에 올려놓을게요.
scrcpy
의python 클라이언트로서 상대적인 유지보수leng-yue/py-scrcpy-client
를 사용했습니다.import scrcpy
import numpy as np
client = scrcpy.Client(device="YOUR_ANDROID_DEVICE_ID", max_fps=5)
client.start(threaded=True)
while True:
if isinstance(client.last_frame, np.ndarray):
# client.last_frame(cv2のRGB順序)をここで調理する
...
if flag_to_stop:
client.stop()
break
비교
가장 빠르면 당연히
scrcpy
이다.다만, 호스트에 부하를 가하지 않기 위해 실기를 사용하면 scrcpy
너무 무겁다.나의 실제 기계 환경에서 위의 두 개와 비교하면 소요 시간이 66퍼센트 앞당겨졌다.한번 해보세요.
Reference
이 문제에 관하여(adb를 통해 Squist를 Python으로 고속 가져오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/lm_mh/articles/2202baa255a5cd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)