我正在尝试使用 python + aiortc 流式传输 android 屏幕。我有一个使用 adb + screenrecord 获取设备屏幕的 POC。提供的代码从 screenrecord 的执行中读取原始输出 (h264) 并使用 ffmpeg 和 opencv 显示它。
import subprocess as sp
import cv2
import array
import numpy as np
adbCmd = ['adb', 'exec-out', 'screenrecord', '--output-format=h264', '-']
stream = sp.Popen(adbCmd, stdout= sp.PIPE, universal_newlines = True)
ffmpegCmd = ['ffmpeg', '-i', '-', '-f', 'rawvideo', '-vcodec', 'bmp', '-vf', 'fps=5', '-']
ffmpeg = sp.Popen(ffmpegCmd, stdin=stream.stdout, stdout=sp.PIPE)
while True:
fileSizeBytes = ffmpeg.stdout.read(6)
fileSize = 0
for i in range(4):
fileSize += fileSizeBytes[i + 2] * 256 ** i
bmpData = fileSizeBytes + ffmpeg.stdout.read(fileSize - 6)
image = cv2.imdecode(np.fromstring(bmpData, dtype=np.uint8), 1)
cv2.imshow("im", image)
cv2.waitKey(25)
目前,我正在尝试将 ffmpeg 或 adb exec-out 的输出插入 aiortc 媒体流媒体。基于这个例子,我用下面的代码替换了 recv 方法
async def recv(self):
fileSizeBytes = ffmpeg.stdout.read(6)
fileSize = 0
for i in range(4):
fileSize += fileSizeBytes[i + 2] * 256 ** i
bmpData = fileSizeBytes + ffmpeg.stdout.read(fileSize - 6)
image = cv2.imdecode(numpy.fromstring(bmpData, dtype=numpy.uint8), 1)
frame = VideoFrame.from_ndarray(
image, format="bgr24"
)
pts, time_base = await self.next_timestamp()
frame.pts = pts
frame.time_base = time_base
self.counter += 1
return frame
但是此代码无法从设备屏幕流式传输正确的视频,也不会发生错误。我正在寻找这个问题的解决方案。我正在考虑使用 adbCmd 的直接输出,但它也没有用。