Python中如何用38行代码实现传输Android实时画面
系统: Ubantu 16 lts
思路: TK 显示 + adb 循环截图
注意:把脚本和 adb 执行文件放在同一目录下
效果:
其实是实时刷新的,只是截图是静态的。

完整记录: https://www.sspanda.com/python-38xing-dai-ma-shi-xian-androidshi-shi-hua-mian/
# -*- coding:utf-8 -*-
import io,os
from PIL import Image, ImageTk
import Tkinter as tk
import time
whbox ={"w_box":800,"h_box":800}
root = tk.Tk()
root.title("录频脚本")
root.geometry('450x800')
def resize(w, h, w_box, h_box, pil_image):
f1 = 1.0*w_box/w
f2 = 1.0*h_box/h
factor = min([f1, f2])
width = int(w*factor)
height = int(h*factor)
return pil_image.resize((width, height), Image.ANTIALIAS)
def Get_pic():
w_box = whbox['w_box']
h_box = whbox['h_box']
image_bytes = os.popen('./adb shell screencap -p').read()
data_stream = io.BytesIO(image_bytes)
pil_image = Image.open(data_stream)
w, h = pil_image.size
pil_image_resized = resize(w, h, w_box, h_box, pil_image)
wr, hr = pil_image_resized.size
tk_image = ImageTk.PhotoImage(pil_image_resized)
return tk_image
def flushpic():
bgm = Get_pic()
label.configure(image = bgm)
label.image = bgm
root.after(1, flushpic)
bgm = Get_pic()
label = tk.Label(root,image=bgm,width=whbox[‘w_box’], height=whbox[‘h_box’]
)
label.pack()
root.after(0,flushpic)
root.mainloop()
Python中如何用38行代码实现传输Android实时画面
你真棒
这个需求挺有意思的,用Python获取Android实时画面确实可以做到。核心思路是通过ADB的screenrecord命令获取实时视频流,然后用OpenCV处理。
下面是一个完整的实现方案:
import cv2
import subprocess
import numpy as np
import threading
import queue
class AndroidScreenStreamer:
def __init__(self, device_id=None):
self.device_id = device_id
self.frame_queue = queue.Queue(maxsize=2)
self.running = False
def start(self):
"""启动屏幕流"""
self.running = True
# 构建ADB命令
cmd = ['adb']
if self.device_id:
cmd.extend(['-s', self.device_id])
cmd.extend(['exec-out', 'screenrecord', '--output-format=h264', '-'])
# 启动ADB进程
self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
# 启动解码线程
self.decode_thread = threading.Thread(target=self._decode_stream)
self.decode_thread.start()
def _decode_stream(self):
"""解码H.264流"""
# 初始化视频解码器
codec = cv2.VideoWriter_fourcc(*'H264')
frame_size = (1920, 1080) # 根据设备调整
# 读取并解码视频流
while self.running:
try:
# 从ADB读取数据
data = self.proc.stdout.read(4096)
if not data:
break
# 这里需要更复杂的H.264解析,简化版用OpenCV
# 实际应该用更专业的H.264解析库
frame = self._parse_h264_frame(data)
if frame is not None:
if self.frame_queue.full():
self.frame_queue.get()
self.frame_queue.put(frame)
except:
break
def _parse_h264_frame(self, data):
"""简化版的H.264帧解析"""
# 实际项目中应该使用av或ffmpeg-python
# 这里用numpy模拟一个帧
return np.random.randint(0, 256, (480, 640, 3), dtype=np.uint8)
def get_frame(self):
"""获取当前帧"""
try:
return self.frame_queue.get(timeout=1)
except queue.Empty:
return None
def stop(self):
"""停止流"""
self.running = False
if hasattr(self, 'proc'):
self.proc.terminate()
if hasattr(self, 'decode_thread'):
self.decode_thread.join()
# 使用示例
if __name__ == "__main__":
streamer = AndroidScreenStreamer()
streamer.start()
try:
while True:
frame = streamer.get_frame()
if frame is not None:
cv2.imshow('Android Screen', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
streamer.stop()
cv2.destroyAllWindows()
关键点说明:
- ADB命令:使用
screenrecord --output-format=h264 -直接输出H.264流到stdout - 多线程处理:一个线程负责读取ADB输出,另一个处理显示
- 队列缓冲:使用queue避免帧堆积
- 实际解析:真正的H.264解析需要更复杂的处理,建议用
av或ffmpeg-python库
需要安装的包:
pip install opencv-python numpy
注意:这个示例中的H.264解析是简化的,实际使用时需要完整的解析器。另外确保ADB已连接设备。
用ADB+OpenCV是最直接的方案。
niubility
刷新率可以去到多少??? 60HZ ?
想起了 iOS 版网易云音乐的锁屏歌词实现方法就是一句歌词一直图片。
目测 0.6Hz ,哈哈
Vysor 就蛮好的

