我的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变量就可以轻松从暂停状态回到预览状态. 完美避免了上述几个问题.