我目前正面临一个我无法恢复的问题,但我希望能在你的帮助下完成。
我目前开发了一个带有gstreamer的应用程序来播放不同类型的文件:视频和照片(分别是avi和jpg)。用户必须能够在这些不同的文件之间切换。我已经实现了这一点,但如果文件格式不同,则创建一个新的管道。在那里,屏幕随机闪烁加载两个文件。
现在,我只是为了jpg文件而使用阀门,它就像一个魅力。但是,我坚持实现视频文件的步骤,我不知道如何在两个视频文件之间切换:下面的代码不适用于视频文件,它会冻结:
gst-launch-1.0 filesrc name=photosrc ! jpegdec ! valve name=playvalve drop=false ! imxg2dvideosink
然后在我的代码中,我放下阀门,将不同的元素设置为就绪状态,更改filesrc的位置并返回播放状态。
我看一下输入选择器,但是当一个切换到另一个时,看起来非读取文件仍在播放(cf doc)。是否可以将输入设置为准备好以避免此行为?
非常感谢您的帮助
答案 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()
谢谢。