Python将ffmpeg流实时传输到numpy
我试图在python中通过ffmpeg实时从rtp流中获取帧。在我的服务器上,帧通过管道从numpy阵列传输到ffmpeg,并应在客户端通过管道传输回numpy以进行进一步操作。服务器创建一个sdp文件,该文件作为输入提供给客户端。 看起来是这样的:Python将ffmpeg流实时传输到numpy,python,ffmpeg,Python,Ffmpeg,我试图在python中通过ffmpeg实时从rtp流中获取帧。在我的服务器上,帧通过管道从numpy阵列传输到ffmpeg,并应在客户端通过管道传输回numpy以进行进一步操作。服务器创建一个sdp文件,该文件作为输入提供给客户端。 看起来是这样的: v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 127.0.0.1 t=0 0 a=tool:libavformat 58.42.102 m=video 5004 RTP/AVP 96 b=AS:19
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 58.42.102
m=video 5004 RTP/AVP 96
b=AS:19000
a=rtpmap:96 H265/90000
使用ffplay或VLC可以接收流,但使用我的python代码不能接收流,一开始每帧大约需要5秒,图像只是一些随机的彩色像素。
客户:
dimension = '{}x{}'.format(480, 240)
sdf_file = "video.sdp"
command = ['FFMPEG',
'-protocol_whitelist', 'udp,rtp,file,pipe,crypto,data',
'-i', sdf_file,
'-pix_fmt', 'bgr24',
'-r', '24',
'-video_size', dimension,
'-f', 'image2pipe', '-']
size = 480 * 240 * 3
proc = sp.Popen(command, stdout=sp.PIPE)
while True:
try:
tic = time.perf_counter()
frame = proc.stdout.read(size)
print(frame)
if frame is None:
print('no input')
break
image = np.frombuffer(frame, dtype='uint8').reshape(240, 480, 3)
toc = time.perf_counter()
print(f"performed calc in {(toc - tic) * 1000:0.4f} miliseconds")
cv2.imshow('received', image)
except Exception as e:
print(e)
cv2.destroyAllWindows()
proc.stdin.close()
proc.wait()
有什么想法吗,我怎样才能实时得到这些帧?谢谢你的帮助