CS的小翰翰 2022-07-18 11:03 采纳率: 33.3%
浏览 382
已结题

使用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

  • 写回答

2条回答 默认 最新

  • 脚踏南山 2022-07-18 11:44
    关注

    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

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月24日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 github录制项目
  • ¥15 H.264选择性加密例程
  • ¥50 windows的SFTP服务器如何能批量同步用户信息?
  • ¥15 centos7.9升级python3.0的问题
  • ¥15 如何解决调试dev-出++5.11不成功问题
  • ¥15 安装CentOS6时卡住
  • ¥20 关于#监控系统#的问题,如何解决?(相关搜索:系统软件)
  • ¥20 c语言写的8051单片机存储器mt29的模块程序
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。