首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用textoverlay和timeoverlay

同时使用textoverlay和timeoverlay
EN

Stack Overflow用户
提问于 2012-10-16 03:23:34
回答 3查看 3.4K关注 0票数 2

我有一个使用GStreamer的小C项目。我想加载一个视频,并将其与字幕(textoverlay)和经过时间(timeoverlay)一起显示。

我的想法是这样的:

代码语言:javascript
复制
- create a textoverlay and set a sample subtitle
- create a timeoverlay
- create a videosink
- put the three elements in a new bin and link them: 
  textoverlay -> timeoverlay -> videosink
- use playbin2 for playback and send the video from playbin2 to the new bin 

下面是我的测试独立应用程序:

代码语言:javascript
复制
// Save as "test.c". Compile with: 
// gcc -o test `pkg-config --cflags --libs gtk+-2.0 gstreamer-0.10 gstreamer-interfaces-0.10` test.c
#include <gst/gst.h>
#include <gtk/gtk.h>

int main(int argc, char **argv) {
    // Init - GTK is only used here as a GUI hook
    gtk_init (&argc, &argv);
    gst_init(0, NULL);

    // Path to file - juts a simple demo file
    char uri[2048];
    sprintf(&uri[0], "file:///tmp/1.mpg");

    // Playbin and URI
    GstElement *playbin2 = gst_element_factory_make ("playbin2", "playbin2");
    g_object_set (G_OBJECT (playbin2), "uri", &uri[0], NULL);

    // Elements - videosink, textoverlay, timeoverlay
    GstElement *videosink = gst_element_factory_make ("sdlvideosink", "videosink");
    GstElement *textoverlay = gst_element_factory_make("textoverlay", "textoverlay");
    GstElement *timeoverlay = gst_element_factory_make("timeoverlay", "timeoverlay");

    // Set sample text in textoverlay
    g_object_set(G_OBJECT(textoverlay), "text", "Test Subtitle", NULL);

    // Create bin, add elements
    GstElement *mybin = gst_bin_new("mybin");
    gst_bin_add (GST_BIN (mybin), videosink);
    gst_bin_add (GST_BIN (mybin), textoverlay);
    gst_bin_add (GST_BIN (mybin), timeoverlay);

    // Get sink pad for textoverlay and make it a ghostpad for bin
    GstPad *pad_textoverlay_sink = gst_element_get_pad(textoverlay, "video_sink");
    gst_element_add_pad(mybin, gst_ghost_pad_new("sink", pad_textoverlay_sink));

    // Link elements: textoverlay -> timeoverlay -> videosink
    gst_element_link_pads(textoverlay, "src", timeoverlay, "sink");
    gst_element_link_pads(timeoverlay, "src", videosink, "sink");

    // Conect the bin to the playbin
    g_object_set (G_OBJECT (playbin2), "video-sink", mybin, NULL);

    // Play video
    gst_element_set_state (playbin2, GST_STATE_PLAYING);

    // GTK Main loop
    gtk_main ();
}

如果我将textoverlay的src pad链接到videosink的接收板(因此跳过了timeoverlay),我就会得到一个视频和一个字幕--就像预期的那样。

如果我更改代码并将timeoverlay的接收板设置为mybin的ghostpad,然后将timeoverlay的src pad链接到videosink (因此跳过了textoverlay) -我得到了一个经过时间的视频,正如预期的那样。

但是,当我尝试级联textoverlay和timeoverlay时,没有视频。它不依赖于videosink -与xvimagesink和ximagesink相同。未显示错误。使用gstreamer-launch它工作得很好,所以很明显我在C中做错了什么-我只是不知道是什么。

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-16 21:53:55

解决这个问题的方法是使用管道而不是bin。

代码语言:javascript
复制
GstElement *mybin = gst_pipeline_new ("my-pipeline");

然而,我仍然不清楚它为什么会这样。GStreamer文档说管道只是一个顶层的bin;我在文档中没有发现关于一个bin中可以驻留多少元素或它们可以做什么的限制。另一方面,playbin2在内部是一个流水线,因此mybin可以是一个常规的bin (只要只使用文本覆盖或时间覆盖,它就可以作为常规的bin工作)。

票数 0
EN

Stack Overflow用户

发布于 2013-08-11 19:30:27

更简单的解决方案是使用gst_element_link_many

代码语言:javascript
复制
gst_element_link_many(textoverlay, timeoverlay, videosink);
票数 1
EN

Stack Overflow用户

发布于 2012-10-16 18:00:07

Textoverlay也需要接收器上的文本流。最好用GST_DEBUG="*:2“来运行你的应用,然后你就会看到关于这方面的警告。

顺便说一句。- char uri;-uri2048(&uri,"file:///tmp/1.mpg");+ gchar *uri = "file:///tmp/1.mpg";:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12902574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档