Gstreamer调试管道c++

Gstreamer debug pipeline c++

本文关键字:c++ 管道 调试 Gstreamer      更新时间:2023-10-16

我正试图将gstreamer bash脚本代码转换为c++代码,但我无法将调试日志保存到文件中

这是我的代码

int main(int argc, char *argv[])
{
      YoctoLinuxSystem* hola;
      //hola->YoctoLinuxSystem();
	  CustomData DataTest, DataDvi;
	  GstBus *bus;
	  GstMessage *msg;
	  GstStateChangeReturn ret;
	  GMainLoop *loop;	
	  
	  //vector<string> lines = YoctoLinuxSystem::getCmdOutputAsLines("./scripts/get_system_temps.sh");
	  
     gst_init (&argc, &argv);
	 loop = g_main_loop_new (NULL, FALSE);
	 
	 /******************************/
	 /****AJUSTES GSTREAMER TEST****/
	 /******************************/
	 DataTest.source = gst_element_factory_make ("videotestsrc", "source");
	 DataTest.capsfilter = gst_element_factory_make ("capsfilter","caps");
	 DataTest.sink = gst_element_factory_make ("imxipuvideosink", "sink");
	 
	 DataTest.pipeline = gst_pipeline_new ("test-pipeline"); 
	 
	   if (!DataTest.pipeline || !DataTest.source || !DataTest.capsfilter || !DataTest.sink) {
	    g_printerr ("Not all elements could be created.n");
	    return -1;
	  }	 
	  /* Modify the source's properties */
	  g_object_set (DataTest.source, "pattern", 0, NULL);
	  g_object_set(DataTest.capsfilter, "caps", gst_caps_new_simple("video/x-raw", "framerate", GST_TYPE_FRACTION, 25, 1,"width", G_TYPE_INT, 1920, "height", G_TYPE_INT, 1080, "format", G_TYPE_STRING, "RGB", NULL), NULL);
	  
	  /* Build the pipeline */
	  gst_bin_add_many (GST_BIN (DataTest.pipeline), DataTest.source, DataTest.capsfilter, DataTest.sink, NULL);
	  if (gst_element_link (DataTest.source, DataTest.capsfilter) != TRUE) {
	    g_printerr ("Elements source-caps could not be linked.n");
	    gst_object_unref (DataTest.pipeline);
	    return -1;
	  }
	  if (gst_element_link (DataTest.capsfilter, DataTest.sink) != TRUE) {
	    g_printerr ("Elements caps-sink could not be linked.n");
	    gst_object_unref (DataTest.pipeline);
	    return -1;
	  }
	   gst_element_link_many (DataTest.source, DataTest.capsfilter, DataTest.sink, NULL);
	   
	   
	   /******************************/
	   /****AJUSTES GSTREAMER DVI****/
	   /******************************/
	   DataDvi.source = gst_element_factory_make ("v4l2src", "source");
	   DataDvi.sink = gst_element_factory_make ("imxipuvideosink", "sink");
	   	 
	   DataDvi.pipeline = gst_pipeline_new ("test-pipeline"); 
	   	 
	   if (!DataDvi.pipeline || !DataDvi.source || !DataDvi.sink) {
	   	    g_printerr ("Not all elements could be created.n");
	   	    return -1;
	   }	 
	   	  /* Modify the source's properties */
	   g_object_set (DataDvi.source, "device", "/dev/video0", NULL);
	   	   	  
	   	  /* Build the pipeline */
	   gst_bin_add_many (GST_BIN (DataDvi.pipeline), DataDvi.source, DataDvi.sink, NULL);
	   
	   if (gst_element_link (DataDvi.source, DataDvi.sink) != TRUE) {
	   	    g_printerr ("Elements caps-sink could not be linked.n");
	   	    gst_object_unref (DataDvi.pipeline);
	   	    return -1;
	   }
	   gst_element_link_many (DataDvi.source, DataDvi.sink, NULL);
	   	   
	   	   
	   GST_DEBUG=2;
	   	   
	   ifstream fileread;
	  // fileread.open("/var/log/data.log");
	   
	 while(1)
	 {	    
		 ifstream fileread("/var/log/data.log");
		
		 if (!fileread.good())
		 {
		  /* Start playing */
		  //g_print ("Now playing: n");
		  gst_element_set_state (DataDvi.pipeline, GST_STATE_PAUSED);
		  ret = gst_element_set_state (DataTest.pipeline, GST_STATE_PLAYING);
		  if (ret == GST_STATE_CHANGE_FAILURE) {
			g_printerr ("Unable to set the pipeline to the playing state.n");
			gst_object_unref (DataTest.pipeline);
			return -1;
		  }
		 }
		 
		 else
		 {
			 gst_element_set_state (DataTest.pipeline, GST_STATE_PAUSED);
			 ret = gst_element_set_state (DataDvi.pipeline, GST_STATE_PLAYING);
           
           /*HERE I NEED TO KNOW THE DEBUG OF THE PIPELINE*/
           
			 if (ret == GST_STATE_CHANGE_FAILURE) {
			 	g_printerr ("Unable to set the pipeline to the playing state.n");
			 	gst_object_unref (DataDvi.pipeline);
			 	return -1;
			 }
		 }
	 }
  
    g_print ("SALEn");
  return 0;
 }

我正在使用gstreamer-1.0库,我已经看到我需要使用GST_DEBUG_FILE,但我不知道如何从c++调用这些函数。

谢谢你的帮助!

调试和日志记录基础设施背后有丰富的API。请查看此文档。

例如,当环境变量尚未设置时,可以设置一些默认值。

if (!gst_debug_is_active()) {
    gst_debug_set_active(TRUE);
    GstDebugLevel dbglevel = gst_debug_get_default_threshold();
    if (dbglevel < GST_LEVEL_ERROR) {
        dbglevel = GST_LEVEL_ERROR;
        gst_debug_set_default_threshold(dbglevel);
    }
}

为此,上一张海报正确地向您建议了环境变量GST_DEBUG_FILE。您可以在gst_init()之前执行putenv()。

如果你想获得更多的乐趣,你可以替换默认的日志函数gst_debug_log_default()。您可以添加自己的via gst_debug_add_log_function();则删除默认值gst_debug_remove_log_function(gst_debug_log_default)。如果你只是想更改文件,那么gst_debug_add_log_function (gst_debug_log_default, log_file, NULL),对于一些打开并准备好的FILE* log_file

GST_DEBUG_FILE是环境变量,所以它与C++无关。

你可以用之类的东西

export GST_DEBUG_FILE=~/gst.log

在运行应用程序之前。或者在bash启动脚本中添加类似的内容。