微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Python 中使用 Gstreamer 从相机流读取和保存视频并访问缓冲区

如何解决在 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 举报,一经查实,本站将立刻删除。