在gstreamer

时间:2018-03-22 16:10:27

标签: c gstreamer

我目前正面临一个我无法恢复的问题,但我希望能在你的帮助下完成。

我目前开发了一个带有gstreamer的应用程序来播放不同类型的文件:视频和照片(分别是avi和jpg)。用户必须能够在这些不同的文件之间切换。我已经实现了这一点,但如果文件格式不同,则创建一个新的管道。在那里,屏幕随机闪烁加载两个文件。

现在,我只是为了jpg文件而使用阀门,它就像一个魅力。但是,我坚持实现视频文件的步骤,我不知道如何在两个视频文件之间切换:下面的代码不适用于视频文件,它会冻结:

gst-launch-1.0 filesrc name=photosrc ! jpegdec ! valve name=playvalve drop=false ! imxg2dvideosink

然后在我的代码中,我放下阀门,将不同的元素设置为就绪状态,更改filesrc的位置并返回播放状态。

我看一下输入选择器,但是当一个切换到另一个时,看起来非读取文件仍在播放(cf doc)。是否可以将输入设置为准备好以避免此行为?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

查看https://github.com/RidgeRun/gst-interpipe插件。

您可以使用interpipesink创建2个不同的源 mini 管道,并在运行时更改将连接到interpipesrc。确保两端都具有相同的格式。或者使用重新协商功能,但是,我还没有尝试过。

检查wiki是否有动态切换详情:

/* Create pipelines */
GstElement *pipe1 = gst_parse_launch ("videotestsrc ! interpipesink name=camera1", NULL);
GstElement *pipe2 = gst_parse_launch ("videotestsrc ! interpipesink name=camera2", NULL);
GstElement *pipe3 = gst_parse_launch ("interpipesrc name=src listen-to=camera1 ! fakesink", NULL);

/* Grab a reference to the interpipesrc */
GstElement *src = gst_bin_get_by_name(pipe3, "src");

/* Perform the switch */
g_object_set (src, "listen-to", "camera2", NULL);

答案 1 :(得分:0)

对于我来说,为imx6目标编译这个插件似乎有点棘手...... 是否可以像这样更改管道:

 - ----.      .----------.      .---- -
  filesrc     | jpedec   |      | imxg2dsink
      src -> sink       src -> sink   
 - ----'      '----------'      '---- - 

avidemux gstavidemux.c:5678:gst_avi_demux_loop:<demux> error: Internal data stream error.
avidemux gstavidemux.c:5678:gst_avi_demux_loop:<demux> error: streaming stopped, reason not-linked

没有将所有管道设置为null?

我每次更改filesrc的位置时都试图创建一个新的管道,它可以工作,但有时帧缓冲区会闪烁.... 当我在jpeg文件的情况下更改filesrc的位置时,它可以工作。如果我更改avi文件的位置,管道不会正确重启:

isdigit()

谢谢。