在C中使用tee和FileLink调试Gstreamer管道

在C中使用tee和FileLink调试Gstreamer管道,gstreamer,Gstreamer,关于如何使用GStreamer及其上的tee和filesink元素构造C程序,有一个很好的例子。 (另一个可以在上找到) 管道中的tee元素的思想类似于Unix中的tee程序:就像T形管一样,它允许向管道添加分支,在我的例子中,它用于将视频流显示到屏幕上(工作正常),同时将其写入文件(这不起作用-文件已创建但保持为空,即关闭程序后大小为0字节) 与上面提到的示例不同,我既没有用于录制的队列元素(因为我也没有用于显示的队列元素,这是可行的)虽然最终写入文件的内容可能会有问题,但我认为根本就没有写入

关于如何使用GStreamer及其上的
tee
filesink
元素构造C程序,有一个很好的例子。 (另一个可以在上找到)

管道中的
tee
元素的思想类似于Unix中的
tee
程序:就像T形管一样,它允许向管道添加分支,在我的例子中,它用于将视频流显示到屏幕上(工作正常),同时将其写入文件(这不起作用-文件已创建但保持为空,即关闭程序后大小为0字节)

与上面提到的示例不同,我既没有用于录制的队列元素(因为我也没有用于显示的队列元素,这是可行的)虽然最终写入文件的内容可能会有问题,但我认为根本就没有写入文件的内容


该程序确实可以编译。我可以运行哪些附加诊断来确定问题?

通过注释和取消注释部分代码,并仔细观察效果,同时将代码与示例进行比较,我意识到除了
编码器和
队列
之外nts被添加到管道中似乎起到了一定的作用(不过我不确定——对此的任何评论都值得赞赏)。 对于连接管道,顺序的重要性当然是显而易见的。 重要部分如下:

if (!gst_element_link_many(src, tee, NULL) 
    || !gst_element_link_many(tee, queue_record, encoder, muxer, filesink, NULL)
    || !gst_element_link_many(tee, queue_display, videoconvert, videosink, NULL)) {
    g_error("Failed to link elements");
    return -2;
}
此外,我没有粘贴以下行,这似乎也是必要的:

g_object_set(encoder, "tune", 4, NULL);

尝试添加您忽略的元素的最小版本,并查看示例是否有效。如果有效,则调查其必要性。如果仍然无效,则问题可能与您所想的不同。