可以设置splitmuxsink的初始索引吗?

时间:2019-05-28 12:53:58

标签: gstreamer

我用很少的管道安装了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找不到。 有什么想法吗?

1 个答案:

答案 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应该可以实现相同的行为。