Bash 如何使用无休止的gstreamer视频流创建环形缓冲区

Bash 如何使用无休止的gstreamer视频流创建环形缓冲区,bash,stream,buffer,gstreamer,Bash,Stream,Buffer,Gstreamer,我正在创建一个应用程序,其中使用嵌入式linux开发板(phyBOARD)读取摄像头模块。摄像机以每秒25帧的速度提供连续的数据流,每一帧都保存在主板的RAM(/tmp目录)中。为了控制和读取摄像头模块,我在bash脚本中使用gstreamer命令;Gstreamer版本1.14.1与嵌入式linux yocto相结合 从这个流中,我想获取一个单帧,然后由openCV算法处理。此帧仅在接近时被抓取。每秒2次,因此并非所有的25帧都被使用。但是,每秒25帧是必需的,因为每个帧都使用单独的脚本显示给

我正在创建一个应用程序,其中使用嵌入式linux开发板(phyBOARD)读取摄像头模块。摄像机以每秒25帧的速度提供连续的数据流,每一帧都保存在主板的RAM(/tmp目录)中。为了控制和读取摄像头模块,我在bash脚本中使用gstreamer命令;Gstreamer版本1.14.1与嵌入式linux yocto相结合

从这个流中,我想获取一个单帧,然后由openCV算法处理。此帧仅在接近时被抓取。每秒2次,因此并非所有的25帧都被使用。但是,每秒25帧是必需的,因为每个帧都使用单独的脚本显示给用户

下面我提供了用于启动流并将其所有帧保存到单个jpg文件中的当前代码:

STREAM_BUFFER_SIZE=-1
FILE_LOCATION=/tmp/cameraStreamResults
FRAME_RATE=25/1
FILE_NAME=streamImage.jpg

mkdir -p $FILE_LOCATION # Create new directory if not available

gst-launch-1.0 \
    v4l2src num-buffers=$STREAM_BUFFER_SIZE device=$IPU1_CSI0_DEVICE ! \
    video/x-$COL_FORMAT$FRAME_SIZE,framerate=$FRAME_RATE ! \
    videoconvert ! \
    jpegenc ! \
    multifilesink location=$FILE_LOCATION/$FILE_NAME &
由于流以每秒25帧的速度捕获到单个jpg图像中,因此文件在读取时很可能损坏。这是因为程序试图同时编辑和读取同一文件

我想我可以用一些环形缓冲器。此缓冲区强制流将其帧保存到10个不同的变量中。第1帧进入picture1.jpg,第2帧进入picture2.jpg,依此类推。第10帧之后,下一帧应存储在picture1.jpg中。此解决方案应在读取和更改文件之间提供一个较小的延迟,理论上可减少损坏图片的可能性

不幸的是,我对bash没有太多经验,也不知道如何将此功能添加到gstreamer流中。是否可以在gst-launch-1.0命令下添加多个实例?或者我应该使用另一个脚本,它通过管道连接连接到gstream


提前谢谢

避免过早打开的一种方法是,在处理当前帧文件之前,只等待创建下一个帧文件?也许如果硬件上存在一些内部并发,您需要等待写入2帧。嗨,Gem,这个解决方案听起来很合理。但我不确定如何在gstream命令中实现延迟。在我看来,它就像一条一直在流的小溪。您知道如何在写入文件之前添加延迟吗?或者这个操作应该在读取图像的脚本中执行?我根本不知道gstreamer,所以我只把它看作是bash问题,对不起。在bash中,您可能只有在next/next+1帧文件存在时才可以将每个帧移动到另一个文件夹中,这样第二个文件夹才会显示完整的帧,但如果图像位于硬件托管的虚拟文件夹中,则这可能不太好。