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

可以直接用系统的screen_cap指令截图,然后保存成图片流不就行了,何必从视频里搞图片呢

scrcpy 客户端代码走读 H264 裸流解码过程详解,其实我觉得我们就是要做这个事情。https://blog.csdn.net/weixin_38387929/article/details/121534830?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-121534830-blog-117197832.pc_relevant_multi_platform_whitelistv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-121534830-blog-117197832.pc_relevant_multi_platform_whitelistv2&utm_relevant_index=1 。但是不知道怎么在Python项目中应用。

你已经取到帧数据,直接加上头文件不就是图片了

你这里固定接收1024字节的流是不是有问题?
1.H264的流分I帧和P帧,这里的大小是动态的,你用固定buffer接收的话,应该还要做一个拼包拆包的动作
2.视频帧的开头应该是0x00,0x00,0x00,0x00,0x**这样的,只有完整的一帧数据,才能转为图片