我用很少的管道安装了gstreamer(借助于RidgRun GSTd和gst-interpipe)。 第一个管道使用具有max-files的multifilesink实现快照,并可以设置开始index = start_index。 第二个管道使用splitmuxsink和max-files和max-size-time实现记录
GStreamer 1.10.4
gstd v.0.7.0
multifilesink name=snapshot_sink index=${start_index} max-files=20 location=pic_%04d.jpg
splitmuxsink name=rec_file_sink location=rec_%03d.mpg max-size-time=60000000000 send-keyframe-requests=true max-files=5 muxer=mpegtsmux
问题是,如果我重新启动gstreamer(分别为gstd),则索引将重置。 如果我开始记录第二个管道,索引将从000开始。 我可以在multifilesink管道中设置起始索引,但splitmuxsink找不到。 有什么想法吗?
答案 0 :(得分:0)
我只是自己遇到这个问题,恐怕没有办法仅使用命令行参数来做到这一点。
但是,对于那些不怕进入API并创建gstreamer应用程序的用户,可以使用“格式位置”信号来实现它(请参见splitmuxsink文档)。
在C / C ++中,您可以如下定义信号处理程序:
static gchar* cb_FormatLocation(GstElement* splitmux, guint fragment_id, const int* offset)
{
char* location;
g_object_get(splitmux, "location", &location, nullptr);
gchar* fileName = g_strdup_printf(location, fragment_id + *offset);
g_free(location);
return fileName;
}
,在管道定义中,您所需要做的就是计算偏移量并将其传递给g_signal_connect
:
#include <filesystem>
...
GstElement* sink = gst_element_factory_make("splitmuxsink", "sink");
...
std::filesystem::path fileTemplate = "/path/to/folder/%04d.mp4";
int offset = 0;
while (std::filesystem::exists(g_strdup_printf(fileTemplate.c_str(), offset))) offset++;
g_object_set(sink, "location", fileTemplate.c_str(), nullptr);
g_signal_connect (sink, "format-location", G_CALLBACK(cb_FormatLocation), &offset);
旁注:确保offset
变量在应用程序终止之前没有被破坏。
使用Python API应该可以实现相同的行为。