首先,我运行此命令将我的所有管道元素设置为已暂停:
int ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
接下来,我检查所有的流水线组件,以确保它们处于暂停状态(确实如此):
GstElement(imagesaver), status = PAUSED, pending = VOID_PENDING
GstElement(saveImageTee), status = PAUSED, pending = VOID_PENDING
GstElement(imagevideoconvert), status = PAUSED, pending = VOID_PENDING
GstElement(imagecapsfilter), status = PAUSED, pending = VOID_PENDING
GstElement(imagevideocrop), status = PAUSED, pending = VOID_PENDING
GstElement(videomuxer), status = PAUSED, pending = VOID_PENDING
GstElement(h264encoder), status = PAUSED, pending = VOID_PENDING
GstElement(imagequeue), status = PAUSED, pending = VOID_PENDING
GstElement(featurescanner), status = PAUSED, pending = PAUSED
GstElement(scannerqueue), status = PAUSED, pending = VOID_PENDING
GstElement(cfilter), status = PAUSED, pending = VOID_PENDING
GstElement(videoconversion), status = PAUSED, pending = VOID_PENDING
GstElement(convertqueue), status = PAUSED, pending = VOID_PENDING
GstElement(crop), status = PAUSED, pending = VOID_PENDING
GstElement(cropQueue), status = PAUSED, pending = VOID_PENDING
GstElement(source), status = PAUSED, pending = VOID_PENDING
然后我尝试播放我的流水线:int ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
这会导致我的所有元素都被设置为NULL
状态
GstElement(imagesaver), status = NULL, pending = VOID_PENDING
GstElement(saveImageTee), status = NULL, pending = VOID_PENDING
GstElement(imagevideoconvert), status = NULL, pending = VOID_PENDING
GstElement(imagecapsfilter), status = NULL, pending = VOID_PENDING
GstElement(imagevideocrop), status = NULL, pending = VOID_PENDING
GstElement(videomuxer), status = NULL, pending = VOID_PENDING
GstElement(h264encoder), status = NULL, pending = VOID_PENDING
GstElement(imagequeue), status = NULL, pending = VOID_PENDING
GstElement(featurescanner), status = NULL, pending = VOID_PENDING
GstElement(scannerqueue), status = NULL, pending = VOID_PENDING
GstElement(cfilter), status = NULL, pending = VOID_PENDING
GstElement(videoconversion), status = NULL, pending = VOID_PENDING
GstElement(convertqueue), status = NULL, pending = VOID_PENDING
GstElement(crop), status = NULL, pending = VOID_PENDING
GstElement(cropQueue), status = NULL, pending = VOID_PENDING
GstElement(source), status = NULL, pending = VOID_PENDING
我在此输出中得到的错误消息是:
Setting pipeline to Play state
Pipeline would not play, returned 2
返回值2是:GST_STATE_CHANGE_ASYNC
,我认为可以通过将fileSink异步属性设置为false:g_object_set(G_OBJECT (fileSink), "async", gboolean(FALSE), NULL);
来修复该值
这是我调用的函数,用于在暂停状态后播放管道:
void ScanningProcessor::PlayPipeline()
{
gst_element_set_state(GST_ELEMENT(fileSink), GST_STATE_PLAYING);
if(GST_STATE(pipeline) != GST_STATE_NULL)
{
MBPLog::Log(LM_CameraLibrary, LS_Informational, "Setting pipeline to Play state");
int ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
if(ret != GST_STATE_PLAYING)
{
MBPLog::Log(LM_CameraLibrary, LS_Error, "Pipeline would not play, returned %d", ret);
gst_element_set_state (pipeline, GST_STATE_NULL);
}
}
}
发布于 2021-09-18 17:10:21
根据流水线的外观,进入播放状态总是异步发生的(因此出现了GST_STATE_CHANGE_ASYNC
返回值)。这是有意义的(例如:在某些情况下,建立连接、获取数据等需要一些时间),但与您的预期不同。
换句话说,如果你真的想检查你是否要进入播放状态,你应该调用gst_element_get_state()
,它实际上会等待(这样会阻塞你的线程)状态改变的发生。
GstStateChangeReturn ret;
GstState state;
GstState pending;
ret = gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
if (ret == GST_STATE_CHANGE_FAILURE) {
MBPLog::Log(LM_CameraLibrary, LS_Error, "Pipeline would not play");
return; // or whatever cleanup you want
} else {
MBPLog::Log(LM_CameraLibrary, LS_Informational, "Pipeline is now in Playing state");
// If you specified an actual timeout instead of GST_CLOCK_TIME_NONE,
// you should check here if the return value is still
// GST_STATE_CHANGE_SUCCESS of course.
}
https://stackoverflow.com/questions/69182641
复制相似问题