首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从暂停到播放时,Gstreamer流水线失败?

从暂停到播放时,Gstreamer流水线失败?
EN

Stack Overflow用户
提问于 2021-09-14 18:07:42
回答 1查看 409关注 0票数 0

首先,我运行此命令将我的所有管道元素设置为已暂停:

int ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);

接下来,我检查所有的流水线组件,以确保它们处于暂停状态(确实如此):

代码语言:javascript
运行
复制
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状态

代码语言:javascript
运行
复制
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

我在此输出中得到的错误消息是:

代码语言:javascript
运行
复制
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);来修复该值

这是我调用的函数,用于在暂停状态后播放管道:

代码语言:javascript
运行
复制
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);
        }
    } 
}
EN

回答 1

Stack Overflow用户

发布于 2021-09-18 17:10:21

根据流水线的外观,进入播放状态总是异步发生的(因此出现了GST_STATE_CHANGE_ASYNC返回值)。这是有意义的(例如:在某些情况下,建立连接、获取数据等需要一些时间),但与您的预期不同。

换句话说,如果你真的想检查你是否要进入播放状态,你应该调用gst_element_get_state(),它实际上会等待(这样会阻塞你的线程)状态改变的发生。

代码语言:javascript
运行
复制
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.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69182641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档