0

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

我想从这个流中抓取一个帧,然后由 openCV 算法处理。此帧仅被抓取 appr。每秒 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 帧之后,下一帧应存储在图片 1.jpg 中。此解决方案应在读取和更改文件之间提供一个小的延迟,并且理论上可以减少图片损坏的可能性。

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

提前致谢!

4

0 回答 0