如何使用splitmuxsrc/GStreamer正确连接视频?

i2loujxw  于 2023-05-16  发布在  其他
关注(0)|答案(1)|浏览(129)

我想使用gstreamer的元素splitmuxsrc连接视频,并将要连接的文件列表通过格式位置信号从C传递到splitmuxsrc元素,这里也是How to properly concatenate mp4 videos with GStreamer,但还没有成功。
我一直在努力:
这是可行的:

$ gst-launch-1.0 -v splitmuxsrc location=path/to/*.mp4 ! decodebin ! videoconvert ! autovideosink

在C/C++中:以下不起作用。

splitmuxsrc = gst_element_factory_make("splitmuxsrc", "splitmuxsrc");
g_signal_connect (splitmuxsrc, "format-location", G_CALLBACK (format_location_callback), appCtx);

回调函数:

static GStrv *format_location_callback (GstElement * splitmuxsrc, gpointer udata) {
    char ***pppvid = (char***)malloc(1 * sizeof(char**));
    **pppvid = (char**)malloc(2* sizeof(char*));
    for(int i =0 ; i < 2; i++) {
        *pppvid[i] = (char*)malloc(sizeof(char) * 255);
    }
    *pppvid[0] = "path/to/video1";
    *pppvid[1] = "path/to/video1";

    for(int i =0 ; i < 2; i++) {
        g_print("%s\n", *pppvid[i]);
    }
    return pppvid;
}

我希望管道将连续地流式传输视频列表(format_location_callback)。
错误:

splitmuxsrc(12181,0x113652600) malloc: *** error for object 0x109146750: pointer being freed was not allocated
splitmuxsrc(12181,0x113652600) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6

有人知道如何在回调函数中返回正确的视频路径列表吗?

rsl1atfo

rsl1atfo1#

我发现下面的回调函数可以工作:

static GStrv 
format_location_callback (GstElement * splitmuxsrc, gpointer udata) {
  char **list_of_vids = (char**)malloc(3*sizeof(gchar *));
  list_of_vids[0] = g_build_filename ("", "path/to/vid1", NULL);
  list_of_vids[1] = g_build_filename ("", "path/to/vid2", NULL);

  return list_of_vids;
}

相关问题