情况: 我有一个连接到raspberry pi的basler摄像头,我正试图用FFmpg将其馈送到windows PC中的tcp端口,以监控摄像头前面发生的事情
有效的东西: 我设法在raspberry pi上设置了一个python脚本,该脚本负责记录帧、将帧馈送到管道并将其流式传输到tcp端口。从这个端口,我可以使用FFplay显示流
我的问题: FFplay非常适合快速轻松地测试您的方向是否正确,但我想“读取”流中的每一帧,进行一些处理,然后使用opencv显示流。那,我还不能做到
Minimay Represented,这是我在raspberry pi方面使用的代码:
command = ['ffmpeg',
'-y',
'-i', '-',
'-an',
'-c:v', 'mpeg4',
'-r', '50',
'-f', 'rtsp',
'-rtsp_transport',
'tcp','rtsp://192.168.1.xxxx:5555/live.sdp']
p = subprocess.Popen(command, stdin=subprocess.PIPE)
while camera.IsGrabbing(): # send images as stream until Ctrl-C
grabResult = camera.RetrieveResult(100, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
image = grabResult.Array
image = resize_compress(image)
p.stdin.write(image)
grabResult.Release()
在我的电脑上,如果我在终端上使用以下FFplay命令,它将工作并实时显示流:
ffplay -rtsp_flags listen rtsp://192.168.1.xxxx:5555/live.sdp?tcp
在我的电脑上,如果我使用以下python脚本,流将开始,但在cv2.imshow
函数中失败,因为我不确定如何解码它:
import subprocess
import cv2
command = ['C:/ffmpeg/bin/ffmpeg.exe',
'-rtsp_flags', 'listen',
'-i', 'rtsp://192.168.1.xxxx:5555/live.sdp?tcp?',
'-']
p1 = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while True:
frame = p1.stdout.read()
cv2.imshow('image', frame)
cv2.waitKey(1)
有人知道我需要在这两个脚本中更改什么才能开始工作吗?
提前感谢您提供的任何提示
您可以从
p1.stdout
读取解码的帧,将其转换为NumPy数组,然后对其进行整形更改
command
以获取rawvideo
格式和BGR像素格式的解码帧:从
p1.stdout
读取原始视频帧:将读取的字节转换为NumPy数组,并将其重塑为视频帧尺寸:
现在可以显示调用
cv2.imshow('image', frame)
的帧该解决方案假设您预先知道视频帧大小(
width
和height
)下面的代码示例包括一个使用
cv2.VideoCapture
读取width
和height
的部分,但我不确定它是否适用于您的情况(由于'-rtsp_flags', 'listen'
)(如果它确实有效,您可以尝试使用OpenCV而不是FFmpeg进行捕获)以下代码是使用公共RTSP流进行测试的完整“工作示例”:
示例框架(仅供娱乐):
更新:
使用FFprobe读取宽度和高度:
如果您事先不知道视频分辨率,可以使用FFprobe获取信息
下面是使用FFprobe读取
width
和height
的代码示例:相关问题 更多 >
编程相关推荐