GNOME Bugzilla – Bug 769780
Obout v4l2src At the same time preview and video switch to preview only have a bug
Last modified: 2016-08-12 21:58:42 UTC
Created attachment 333158 [details] source code hello: I comefrom china, my namer is frank i have gstreamer program have some bugs,You can provide some suggestions?, thank you very much 1)use v4l2src element to realization picture and record ,frist v4l2src can preview camera , SinkPipeline::SinkPipeline(QGraphicsView *parent) : QObject(parent) { GstStateChangeReturn sret; camRecordflg = 0; camPictureflg = 0; //camera preview pipeline pevPipeline = gst_pipeline_new ("xvoverlay"); camPrevSrc = gst_element_factory_make ("v4l2src", NULL); main_valve = gst_element_factory_make ("valve","mainValve"); input_device = "/dev/video0"; camPrevfilter = gst_element_factory_make("capsfilter",NULL); camPrevCaps = gst_caps_from_string("video/x-raw,width=1280,height=720,framerate=60/1"); g_object_set(G_OBJECT(camPrevSrc),"device",input_device,NULL); g_object_set(G_OBJECT(camPrevfilter),"caps",camPrevCaps,NULL); //record video picture pipeline fileSink = gst_element_factory_make("filesink",NULL); camRecordCaps = gst_caps_from_string("video/x-raw,width=1280,height=720,framerate=60/1"); tee = gst_element_factory_make("tee", NULL); camPrev_Queue = gst_element_factory_make("queue",NULL); mp4Mux = gst_element_factory_make("mpegtsmux",NULL); camRecord_Queue = gst_element_factory_make("queue",NULL); camRecordfilter = gst_element_factory_make("capsfilter",NULL); camRecordFileName = "/home/ubuntu/family.mp4"; nvOmx_H264enc = gst_element_factory_make("omxh264enc",NULL); //omxh264enc h264parse = gst_element_factory_make("h264parse",NULL); g_object_set(G_OBJECT(camRecordfilter),"caps",camRecordCaps,NULL); g_object_set(G_OBJECT(fileSink),"location",camRecordFileName,NULL);; g_object_set(G_OBJECT(camPrev_Queue),"max-size-buffers",0,NULL); g_object_set(G_OBJECT(camPrev_Queue),"max-size-time",0,NULL); g_object_set(G_OBJECT(camPrev_Queue),"max-size-bytes",512000000,NULL); g_object_set(G_OBJECT(camRecord_Queue),"max-size-buffers",0,NULL); g_object_set(G_OBJECT(camRecord_Queue),"max-size-time",0,NULL); g_object_set(G_OBJECT(camRecord_Queue),"max-size-bytes",512000000,NULL); //config and link cam_pipline if ((sink = gst_element_factory_make ("xvimagesink", NULL))) { // sret = gst_element_set_state (sink, GST_STATE_READY); if (sret != GST_STATE_CHANGE_SUCCESS) { gst_element_set_state (sink, GST_STATE_NULL); gst_object_unref (sink); } } if (sink == NULL) g_error ("Couldn't find a working video sink."); if(!pevPipeline || ! camPrevSrc || !tee || !main_valve || !camPrev_Queue || !camPrevfilter || !sink || !camRecord_Queue || !camRecordfilter || !nvOmx_H264enc|| !h264parse || !mp4Mux || !fileSink){ g_error ("Someting error."); } //src link to sink // camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) gst_bin_add_many (GST_BIN (pevPipeline), camPrevSrc, tee ,main_valve,camPrev_Queue, camPrevfilter,sink,NULL); if(gst_element_link_many(camPrevSrc,tee,main_valve,NULL) != TRUE || gst_element_link_many(camPrev_Queue,camPrevfilter, sink,NULL) != TRUE || gst_element_link_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) != TRUE){ g_printerr("Elements could not be linked.\n"); gst_object_unref(pevPipeline); } if(mp4Mux==NULL){ g_printerr("Error: mp4Mux == Null\n"); } if(tee==NULL){ g_printerr("Error: TEE == Null\n"); } tee_src_pad_template = gst_element_class_get_pad_template( GST_ELEMENT_GET_CLASS( tee ), "src_%u" ); if (tee_src_pad_template == NULL){ g_printerr("Error: tee_src_pad_template == Null\n"); } tee_camPrev_pad = gst_element_request_pad(tee,tee_src_pad_template,NULL,NULL); g_print("Obtained reques pad %s for tee_camPrev_pad branch.\n", gst_pad_get_name(tee_camPrev_pad)); queue_camPrev_pad = gst_element_get_static_pad(camPrev_Queue,"sink"); tee_camRecord_pad = gst_element_request_pad(tee,tee_src_pad_template,NULL,NULL); g_print("Obtained reques pad %s for tee_camRecord_pad branch.\n", gst_pad_get_name(tee_src_pad_template)); queue_camRecord_pad = gst_element_get_static_pad(camRecord_Queue,"sink"); //gst_pad_link(tee_camRecord_pad,queue_camRecord_pad) != GST_PAD_LINK_OK) if(gst_pad_link(tee_camPrev_pad,queue_camPrev_pad) != GST_PAD_LINK_OK ){ g_printerr("Tee could not be linked.\n"); gst_object_unref(pevPipeline); } //gst_object_unref(queue_camPrev_pad); xwinid = parent->winId(); } 2)second, I use startRecodPipeline() function to preview and record camer, in qt_videooverlay.cpp void SinkPipeline::startRecodPipeline(){ stopPipeline(); //to READY state camRecordflg = 1; gst_pad_unlink(tee_camPrev_pad,queue_camPrev_pad); qDebug("1"); gst_element_unlink_many(camPrevSrc,tee,main_valve,NULL); gst_element_unlink_many(camPrev_Queue,camPrevfilter, sink,NULL); gst_element_unlink_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) ; gst_bin_remove_many (GST_BIN (pevPipeline), camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink,NULL); qDebug("5"); // camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) if(!pevPipeline || ! camPrevSrc || !tee || !camPrev_Queue || !camPrevfilter || !sink || !camRecord_Queue || !camRecordfilter || !nvOmx_H264enc|| !h264parse || !mp4Mux || !fileSink){ g_error ("Someting error."); } qDebug("6"); gst_bin_add_many (GST_BIN (pevPipeline),camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink, camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL); if(gst_element_link_many(camPrevSrc,tee,NULL) != TRUE || gst_element_link_many(camPrev_Queue,camPrevfilter, sink,NULL) != TRUE || gst_element_link_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) != TRUE){ g_printerr("Elements could not be linked.\n"); gst_object_unref(pevPipeline); } if(gst_pad_link(tee_camPrev_pad,queue_camPrev_pad) != GST_PAD_LINK_OK || gst_pad_link(tee_camRecord_pad,queue_camRecord_pad) != GST_PAD_LINK_OK){ g_printerr("Tee could not be linked.\n"); gst_object_unref(pevPipeline); } startPipeline(); //to playing state } 3)then, I use stoRecordPipeline funcation to just preview camera,but have error, v4l2 gstv4l2object.c:2524:gst_v4l2_object_set_format:<v4l2src0>[00m error: Device '/dev/video0' is busy. in debug.txt void SinkPipeline::stopRecodPipeline(){ qDebug("-->Enter int stopRecodPipeline function"); stopPipeline(); camRecordflg = 0; gst_element_send_event(pevPipeline,gst_event_new_eos()); gst_element_send_event(camPrevSrc,gst_event_new_eos()); // if(!gst_pad_unlink(tee_camRecord_pad,queue_camRecord_pad)){ // g_error ("tee_camRecord_pad error."); // } // if(!gst_pad_unlink(tee_camPrev_pad,queue_camPrev_pad)){ // g_error ("tee_camPrev_pad error."); // } //gst_bin_remove(GST_BIN(pevPipeline),camPrevSrc); gst_bin_remove_many (GST_BIN (pevPipeline), camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink, camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL); gst_element_unlink_many(camPrev_Queue,camPrevfilter, sink,NULL); gst_element_unlink_many(camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL); gst_element_unlink_many(camPrevSrc,tee,NULL); qDebug("4"); if(!pevPipeline || ! camPrevSrc || !tee || !camPrev_Queue || !camPrevfilter || !sink || !camRecord_Queue || !camRecordfilter || !nvOmx_H264enc|| !h264parse || !mp4Mux || !fileSink){ g_error ("Someting error."); } g_object_set(G_OBJECT(camPrevSrc),"device",input_device,NULL); g_object_set(G_OBJECT(camPrevfilter),"caps",camPrevCaps,NULL); //src link to sink // camRecord_Queue,camRecordfilter,nvOmx_H264enc,h264parse,mp4Mux,fileSink,NULL) gst_bin_add_many (GST_BIN (pevPipeline), camPrevSrc, tee ,camPrev_Queue, camPrevfilter,sink,NULL); if(gst_element_link_many(camPrevSrc,tee,NULL) != TRUE || gst_element_link_many(camPrev_Queue,camPrevfilter, sink,NULL) != TRUE){ g_printerr("Elements could not be linked.\n"); gst_object_unref(pevPipeline); } //gst_pad_link(tee_camRecord_pad,queue_camRecord_pad) != GST_PAD_LINK_OK) if(gst_pad_link(tee_camPrev_pad,queue_camPrev_pad) != GST_PAD_LINK_OK ){ g_printerr("Tee could not be linked.\n"); gst_object_unref(pevPipeline); } startPipeline(); } Best wishes
Hi Frank, I think the gstreamer-devel mailing list would be a better forum to get help with this problem, since it's not really clear whether there's actually a bug in GStreamer or if it's in your application. You might also want to have a look at the "camerabin" element, which might alreayd provide all the functionality you're looking for.