GStreamer 预录
GStreamer pre-recording
我正在尝试实现预录
我使用20秒的共享内存作为循环缓冲区。
我使用共享内存作为循环缓冲区,在其中永久记录视频。
当事件发生时,我想将整个缓冲区写入文件,然后录制40秒的视频。
如何立即从共享内存中编码视频并写入文件,然后继续从内存中写入文件一段时间?
您可以要求 gstreamer 队列按如下方式进行预缓冲:
g_object_set (G_OBJECT (queue), "max-size-bytes", 0, NULL);
g_object_set (G_OBJECT (queue), "max-size-buffers", 0, NULL);
g_object_set (G_OBJECT (queue),
"max-size-time", (guint64)threshold_time,
NULL);
/* Drop old buffers when max-size-time is reached */
g_object_set (G_OBJECT (queue), "leaky", 2, NULL);
在队列的衬垫上安装回调:
gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BLOCK,
(GstPadProbeCallback) callback, NULL, NULL);
当您不想在回调中传递缓冲区时 return GST_PAD_PROBE_DROP,以及当您想要传递缓冲区时 return GST_PAD_PROBE_PASS
管道如下:
appsrc-- > queue --> encode --> mux --> filesink
我正在尝试实现预录 我使用20秒的共享内存作为循环缓冲区。 我使用共享内存作为循环缓冲区,在其中永久记录视频。 当事件发生时,我想将整个缓冲区写入文件,然后录制40秒的视频。
如何立即从共享内存中编码视频并写入文件,然后继续从内存中写入文件一段时间?
您可以要求 gstreamer 队列按如下方式进行预缓冲:
g_object_set (G_OBJECT (queue), "max-size-bytes", 0, NULL);
g_object_set (G_OBJECT (queue), "max-size-buffers", 0, NULL);
g_object_set (G_OBJECT (queue),
"max-size-time", (guint64)threshold_time,
NULL);
/* Drop old buffers when max-size-time is reached */
g_object_set (G_OBJECT (queue), "leaky", 2, NULL);
在队列的衬垫上安装回调:
gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BLOCK,
(GstPadProbeCallback) callback, NULL, NULL);
当您不想在回调中传递缓冲区时 return GST_PAD_PROBE_DROP,以及当您想要传递缓冲区时 return GST_PAD_PROBE_PASS
管道如下:
appsrc-- > queue --> encode --> mux --> filesink