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