使用scrcpy的开源框架,获取到的将h.264视频流保存为图片流遇到困难。

求指导,在多屏幕协作中,想要获取到安卓手机的实时桌面情况,现在已经使用Python获取到安卓手机桌面实时的h246视频流数据(具体样式见截图),尝试使用ffmpeg程序抓取h.264视频流保存为图片流,但是现有资料应该都是c语言格式,不是很方便,其他方法貌似也走不通,求找能将获取到的视频流转为图片流的办法,最好是可以直接实现桌面情况。
问题相关代码,
import subprocess
import socket
import time
 
import numpy as np
 
adb_path = "D:\\scrcpy-win64-v1.24\\adb" //自己adb的位置
port=15555 //端口号
device_uuid=" xxx" //自己设备
scrcpy_server_path = "scrcpy-server"
p = subprocess.Popen(f"{adb_path} -s {device_uuid} push {scrcpy_server_path} /data/local/tmp", shell=True)
p.communicate()
p = subprocess.Popen(f"{adb_path} -s {device_uuid} forward tcp:{port} localabstract:scrcpy", shell=True)
p.communicate()
p = subprocess.Popen(f"{adb_path} -s {device_uuid} shell CLASSPATH=/data/local/tmp/scrcpy-server app_process / com.genymobile.scrcpy.Server 1.24 max_size=1000 log_level=info bit_rate=8000000 tunnel_forward=true", shell=True)
time.sleep(1)
s1 = socket.socket()
s1.connect(("127.0.0.1", port))
temp = s1.recv(1024)
while temp != b'\x00':
    temp = s1.recv(1024)
print("connected: " + str(temp))
s2 = socket.socket()
s2.connect(("127.0.0.1", port))
info_raw = s1.recv(64)
info = info_raw.decode(encoding="utf-8")
width_raw = s1.recv(2)
height_raw = s1.recv(2)
print(info)
width = int.from_bytes(width_raw, byteorder='big')
height = int.from_bytes(height_raw, byteorder='big')
print(width)
print(height)
 
while True:
    data = s1.recv(1024)
    print(f"每一帧数据为{data}")
运行结果及报错内容

img

我的解答思路和尝试过的方法

1、考虑一下使用ffmpeg程序抓取h.264视频流保存为图片,正尝试。
参考文档:https://blog.csdn.net/mynameisdqy/article/details/119348734?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-4-119348734-null-null.pc_agg_new_rank&utm_term=h264%E6%B5%81%20python%20%E8%A7%A3%E6%9E%90rtp&spm=1000.2123.3001.4430
关于H.264编码,比较简单的实现方法是收集全部待传输序列,并通过OpenCV的VideoWriter进行编码、写入文件,后对视频文件进行一次性传输或流式,但不具有实时性。
demo的例子跑完应该是不符合当前情况,但是对于输入流的处理还在看,想法是使用ffmpeg的基础命令去处理。
几天的查询均没有直接使用ffmpeg处理h246的方式,只有通过c语言处理,在考虑是否将获取到的h246视频流传入c语言中处理。
2、考虑使用将视频流发送到浏览器上解析
3、考虑一下Python自带的av.open方法,未成功。

我想要达到的结果

img

while True部分改为一下代码试试。

import numpy as np
import cv2 as cv
while True:
    data = s1.recv(1024)
    print(f"每一帧数据为{data}")
    nparr = np.frombuffer(data, np.uint8)
    # 获取HWC,numpy矩阵
    img_decode = cv.imdecode(nparr, 1)

img

代码渲染层错误。请检查代码漏动。