微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gstreamer 文件描述符保持打开状态

如何解决Gstreamer 文件描述符保持打开状态

当我从 v4lsrc 终止 Gstreamer 管道时,文件描述符没有关闭,我无法从其他进程访问它。我假设我没有正确终止管道。但是在某些情况下(一旦进入 givo 或进行 10 次尝试)我可以让管道正确结束。我认为这是 EOS 传播的问题,但是当我刚刚发送 EOS 并等待 EOS 的回调时,我通常会完全卡住。任何人都可以引导我朝着正确的方向前进吗?

我实际上基本上需要“即时”更改源 v4lsrc 上的分辨率,但是当我尝试更改 capsfilter 上的上限时,我在总线上遇到了错误,而我正是尝试时的位置以新的分辨率重新启动它。所以最好先学习如何正确终止管道,对吗?

(gstreamer 1.14)

    struct GstData{
        GstBus *bus;
        GstElement *pipeline;
        GstElement *source;
        GstElement *capsfilter;
        GstElement *queue;
        GstElement *muxer;
        GstElement *sink;
    } main;
static GstFlowReturn new_sample_jpeg(GstElement * elt,gstreamerUsbCamera * cameraInstance)
{

}

static void new_bus_message(GstBus* bus,GstMessage* msg,gstreamerUsbCamera * cameraInstance) {

    switch (GST_MESSAGE_TYPE(msg)) {
        case GST_MESSAGE_ERROR:
        {
            GError* err;
            gchar* debug;

            gst_message_parse_error(msg,&err,&debug);
            g_print("Error: %s\n",err->message);
            g_error_free(err);
            g_free(debug);

            // Stop the video
            break;
        }
        case GST_MESSAGE_EOS:
            std::cout<<"EOS on pipeline";
            break;
        default:
            qDebug()<<"Message: " << GST_MESSAGE_TYPE(msg);
            break;
    }
}
bool startPipeline(){
     if (!gst_is_initialized()) {
         qWarning()<<"initializing GST";
         setenv("GST_DEBUG",("*:" + std::to_string(3)).c_str(),1);
         gst_init(nullptr,nullptr);
     }
     GstStateChangeReturn ret;
     main.source = gst_element_factory_make ("v4l2src","source");
     g_object_set (main.source,"device","/dev/video0,NULL);

     main.muxer = gst_element_factory_make ("avimux","avimux");
     main.queue = gst_element_factory_make ("queue","app_queue");
     main.capsfilter = gst_element_factory_make ("capsfilter",capsfilter");

     main.sink = gst_element_factory_make("appsink","appsink");
     main.pipeline = gst_pipeline_new ("pipeline_src");
     g_object_set (main.sink,"emit-signals",TRUE,"wait-on-eos",FALSE,"drop",NULL);

    g_object_set (main.sink,"max-buffers",60,NULL);
     if (!main.pipeline || !main.source || !main.muxer || !main.sink || !main.queue || !main.capsfilter) {
       g_printerr ("Not all elements Could be created.\n");
       return false;
     }
     GstCaps *caps = gst_caps_new_simple ("image/jpeg","width",G_TYPE_INT,1920,"height",1080,"io-mode",4,"framerate",GST_TYPE_FRACTION,30,1,"pixel-aspect-ratio","interlace-mode",G_TYPE_STRING,"progresive",NULL);

     g_object_set (G_OBJECT (main.capsfilter),"caps",caps,NULL);
     gst_caps_unref (caps);
     gst_bin_add_many (GST_BIN (main.pipeline),main.source
     if (gst_element_link_many(main.source,main.capsfilter,main.queue,main.sink,NULL) != TRUE) {
         gstFail("Elements Could not be linked-recording line\n");
         return false;
     }

     gst_app_sink_set_emit_signals(GST_APP_SINK(main.sink),true);
     callbackId = g_signal_connect (main.sink,"new-sample",G_CALLBACK (new_sample_jpeg),&main);
     main.bus = gst_element_get_bus(main.pipeline);

     gst_bus_add_signal_watch(main.bus);

     g_signal_connect(main.bus,"message",G_CALLBACK(new_bus_message),&main);

     ret = gst_element_change_state(main.pipeline,GST_STATE_CHANGE_NULL_TO_READY);
     if (ret) ret = gst_element_change_state(main.pipeline,GST_STATE_CHANGE_READY_TO_PAUSED);
     if (ret) ret = gst_element_set_state (main.pipeline,GST_STATE_PLAYING);

     if (ret == GST_STATE_CHANGE_FAILURE) {
       gstFail("Unable to set the pipeline to the playing state.\n");
       return false;
     }
    return true;
}
bool terminatePipeline(){
    bool ret =true;
    gst_element_send_event(main.pipeline,gst_event_new_eos());
    GstMessage *EndMessage = gst_message_new_eos(&main.pipeline->object);
        gst_bus_post(main.bus,EndMessage);
        //if (g_object_is_floating (main.pipeline)) gst_object_ref_sink (main.pipeline);

        /* Free resources */
        if (EndMessage != NULL)
          gst_message_unref (EndMessage);
        usleep(500000); // Important
    if ( gst_element_set_state (main.pipeline,GST_STATE_NULL) != GST_STATE_CHANGE_SUCCESS) ret = false;
    if ( gst_element_set_state (main.sink,GST_STATE_NULL) != GST_STATE_CHANGE_SUCCESS) ret = false;;

    gst_object_unref(main.pipeline)
    mStatusFlags.pipelineRunning = false;
    usleep(500000);

    return ret;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。