在gstreamer1在使用rtspclientsink暂停pipeline的问题

我的pipeline流程如下图

 


当我需要暂停整个pipeline, 使用gst_element_set_state (pipeline, GST_STATE_PAUSE), 有概率整个pipeline崩掉,
或者在返回预览gst_element_set_state (pipeline, GST_STATE_PLAYING)的时候, 报错说rtspclientsink sink pad data timeout.

总之使用正常的方法无法正常暂停与返回预览.

研究一番后, 决定用 gst_pad_add_probe 配合 GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM 去阻塞pipeline数据流的方式了暂停.

我是在queue1的sink pad上加入gst_pad_add_probe, 然后在函数里面sleep gstreamer线程:
{
  // remove the probe first
  gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));


  isPausePipeline = TRUE;

    while (isPausePipeline) {
        g_usleep(100 * 1000);
    }

  return GST_PAD_PROBE_OK;

}

上面代码, 我只需要控制isPausePipeline变量就可以轻松从暂停状态回到预览状态. 完美避免了上述几个问题.

GStreamer 是一个开源的多媒体框架,可以在 Java 中使用。以下是在 Java 中使用 GStreamer 的步骤: 1. 安装 GStreamer 在安装 GStreamer 之前,需要先安装以下依赖库: - libgstreamer-plugins-base1.0-dev - libgstreamer1.0-dev - libgstreamer-plugins-good1.0-dev - libgstreamer-plugins-bad1.0-dev 安装完依赖库后,可以通过以下命令安装 GStreamer: ``` sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav ``` 2. 引入 GStreamer 的 Java 绑定库 GStreamer 的 Java 绑定库在 Maven 中是可用的,可以在项目的 pom.xml 文件中添加以下依赖项: ``` <dependency> <groupId>org.freedesktop.gstreamer</groupId> <artifactId>gstreamer-java</artifactId> <version>1.14.4</version> </dependency> ``` 3. 编写 GStreamer 的 Java 代码 以下是一个简单的 GStreamer Java 代码示例,它使用 GStreamer 播放一个视频: ``` import org.freedesktop.gstreamer.*; public class GStreamerExample { public static void main(String[] args) { Gst.init("VideoPlayer", args); Pipeline pipe = new Pipeline(); Element source = ElementFactory.make("filesrc", "source"); source.set("location", "/path/to/video.mp4"); Element decoder = ElementFactory.make("decodebin", "decoder"); Element convert = ElementFactory.make("videoconvert", "convert"); Element sink = ElementFactory.make("autovideosink", "sink"); pipe.addMany(source, decoder, convert, sink); Pipeline.linkMany(source, decoder); decoder.link(convert); convert.link(sink); pipe.play(); Gst.main(); } } ``` 以上代码使用 GStreamer 创建了一个管道(pipeline),其中包含一个文件源(filesrc)、一个解码器(decodebin)、一个视频转换器(videoconvert)和一个视频输出端(autovideosink)。它将视频源(/path/to/video.mp4)连接到解码器,解码器连接到转换器,转换器连接到视频输出端。最后,它启动了管道并进入 GStreamer 的主循环中。 以上就是在 Java 中使用 GStreamer 的简单步骤和示例代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值