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)

메모리에서 바이트 열을 변환하고 읽기 (파일을 통과하지 않음)


https://stackoverflow.com/questions/48304210/how-to-show-adb-screenshot-directly-in-python
https://pupli.net/2020/09/read-adb-screencap-raw-image-using-python/ 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를 사용했습니다.
https://github.com/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퍼센트 앞당겨졌다.한번 해보세요.

좋은 웹페이지 즐겨찾기