如何解决在 Python 中使用 Gstreamer 从相机流读取和保存视频并访问缓冲区
我是 Gstreamer 的初学者,但我设法构建了两个管道来读取和保存大量相机流并在 Python 中使用它们。目前我正在使用 OpenCV VideoCapture 和 VideoWriter 来完成这项工作,但我还需要访问 Gstreamer 缓冲区来检索帧时间戳,因为我需要将捕获的帧与另一个进程同步。有人告诉我,一旦在 VideoCapture 中读取帧,时间戳信息就会丢失,所以我的问题是如何使用我构建的管道访问帧缓冲区?
这是我目前的代码,从四个摄像头读取和写入流。我使用 OpenCV 是因为它到目前为止有效,但它不是必需的,如果可以跳过到 BGR 和 CV 帧的转换,那么我也会很高兴。
import cv2
def gstreamer_in(cam_id):
""" Creates string with gstreamer input pipeline """
gst_in = ('nvarguscamerasrc sensor-id={} ! '
'video/x-raw(memory:NVMM),height=1080,width=1920,framerate=(fraction)30/1,format=NV12 ! '
'nvvidconv ! video/x-raw,format=BGRx ! '
'videoconvert ! video/x-raw,format=BGR ! '
'appsink').format(cam_id)
return gst_in
def gstreamer_out(cam_id):
""" Creates string with gstreamer output pipeline """
gst_out =('appsrc ! autovideoconvert ! '
'omxh265enc ! video/x-h265,stream-format=byte-stream ! '
'h265parse ! filesink location=video_{}.h265 ').format(cam_id)
return gst_out
n_cams = 4
caps = []
writers=[]
for i in range(0,n_cams):
# Create VideoCapture and writers
caps.append(cv2.VideoCapture(gstreamer_in(i),cv2.CAP_GSTREAMER))
writers.append(cv2.VideoWriter(gstreamer_out(i),cv2.CAP_GSTREAMER,i,30,(1920,1080),True))
print("Press q to stop...")
while True:
# Read and write cameras
for i in range(0,n_cams):
ret,frame = caps[i].read()
# read timestamp?
if ret == True:
writers[i].write(frame)
# other process happening here
if cv2.waitKey(1)==ord('q'):
break
# Release
for i in range(0,n_cams):
caps[i].release()
writers[i].release()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。