我目前遇到的问题是我现在还无法解决,但我希望我能在您的帮助下做到这一点。

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

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

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


然后在我的代码中,进一步放开阀门,将differents元素设置为ready状态,更改filesrc的位置并返回到播放状态。

我看了一个输入选择器,但是当一个切换到另一个时,似乎仍在播放未读文件(cf doc)。是否可以将输入设置为准备好避免这种行为?

非常感谢您的帮助

最佳答案

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

您可以创建2个不同的源迷你管道,这些管道以interpipesink结尾,并且在运行时更改将连接到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);

关于c - 在gstreamer中的两个源之间即时切换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49433453/

10-15 00:23