1、安装 pip install scrcpy-client
2、代码:
import collections
import datetime
import scrcpy
import cv2
import time
import adbutils
class ScrcpyThread:
# scrcpy 对象
client = None
# 视频对象
video_writer = None
# 保存视频的路径
video_path = ''
# 保存视频的fps
fps = 10
# 保存视频的size,百分比: 如缩小一半:(0.5, 0.5)
size = (1, 1)
# 保留的帧数
deque = collections.deque(maxlen=1000)
def __save_video(self, frame):
if frame is not None and self.video_writer is not None:
resize_frame = cv2.resize(frame, self.size)
# self.deque.append(resize_frame)
text = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
cv2.putText(resize_frame, text, (5, 25), cv2.FONT_HERSHEY_PLAIN, 2, (0, 255, 255), 2)
self.deque.append(resize_frame)
def init(self, device_id=None):
if self.client:
return
if not device_id:
device_id = adbutils.adb.device().serial
self.client = scrcpy.Client(device=device_id, max_fps=self.fps)
def uninit(self):
# 保存视频 buffer
if self.video_writer is not None:
print(self.video_path)
for frame in self.deque:
self.video_writer.write(frame)
# 关闭 scrcpy client
if self.client is not None:
self.client.stop()
self.client = None
# 释放视频对象
if self.video_writer is not None:
self.video_writer.release()
self.video_writer = None
def set_video_path(self, video_path):
assert video_path, 'video_path 不可为空'
if self.video_writer is not None:
self.video_writer.release()
self.video_path = video_path
fourcc = cv2.VideoWriter_fourcc(*"MP4V")
self.video_writer = cv2.VideoWriter(self.video_path, fourcc,
self.fps, self.size)
def add_listener(self, key, listener):
"""添加侦听函数"""
self.client.add_listener(key, listener)
def remove_listener(self, key, listener):
"""删除侦听函数"""
self.client.remove_listener(key, listener)
def start(self):
assert self.client, '先进行初始化操作: init(device_id)'
self.add_listener(scrcpy.EVENT_FRAME, self.__save_video)
self.client.start(True, True)
self.size = tuple([int(w * r) for w, r in zip(self.client.resolution, self.size)])
def stop(self):
if self.client is not None:
self.client.stop()
scrcpy_thread = ScrcpyThread()
if __name__ == '__main__':
scrcpy_thread.init()
scrcpy_thread.start()
scrcpy_thread.set_video_path(r'..\1.mp4')
time.sleep(5)
scrcpy_thread.stop()
scrcpy_thread.uninit()
3、注意的是,主线程不能异常退出,否则不会保存,若需要实时保存,可以将
self.deque.append(resize_frame)
改成:
self.video_writer.write(frame)
但是需要注意执行的越久,保存的视频文件越大
如果有用就点个赞呗~