【问题标题】:Debugging Gstreamer pipeline with tee and a filesink in C在 C 中使用 tee 和文件接收器调试 Gstreamer 管道
【发布时间】:2020-09-29 21:13:19
【问题描述】:

有一个关于如何使用 GStreamer 及其 https://gist.github.com/crearo/a49a8805857f1237c401be14ba6d3b03 上的 teefilesink 元素构建 C 程序的优秀示例。 (另一个可以在https://gstreamer.freedesktop.org/documentation/tutorials/basic/multithreading-and-pad-availability.html?gi-language=c找到)。

管道tee元素的想法类似于Unix中的tee程序:就像一个T形管,它允许添加管道的分叉,在我的情况下,它用于将视频流显示到屏幕(完美运行)并同时将其写入文件(不起作用 - 文件已创建但保持为空,即关闭程序后大小为0字节)。

我与上面提到的示例不同,因为既没有用于记录的队列元素(因为我也没有用于显示的队列元素,它可以工作),也没有编码器和复用器。尽管这对于最终写入文件的内容可能是个问题,但我希望 会向文件中写入一些内容。

程序会编译。我可以运行哪些其他诊断程序来确定问题?

【问题讨论】:

  • 尝试添加您省略的元素的最小版本,并查看示例是否有效。如果他们这样做,然后调查为什么他们是必要的。如果还是不行,那么问题可能和你想的不一样。

标签: gstreamer


【解决方案1】:

通过注释和取消注释部分代码并仔细观察效果,​​同时将代码与示例进行比较,我意识到除了encoderqueue之外,添加元素的顺序管道似乎发挥了作用(不过我不确定 - 任何 cmets 都值得赞赏)。 对于链接管道,顺序的重要性当然是显而易见的。 重要的部分如下:

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);

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多