2015-12-04 4 views
1

ОС: Ubuntu
Gstreamer версию 0,10Gstreamer-0,10 код не в поток видео веб-камера над УДП

Я должен разработать приложение для потокового видео с веб-камеры на удаленном компьютере через UDP. Я написал небольшой фрагмент кода, но он запускается на секунду, а затем выдает ошибку.

Ошибка я получаю

*Running... 
Error: Internal data flow error. 
Returned, stopping playback 
Deleting pipeline* 

Может кто-то пожалуйста, точно мне о моей ошибке.
Ниже мой код

GstElement *pipeline, *source, *sink, *muxer, *videoenc, *payloader, *udpsink; 
    GstBus *bus; 
    GMainLoop *loop; 
    // Initialize GStreamer 
    gst_init (&argc, &argv); 

    loop = g_main_loop_new(NULL, FALSE); 
    // Create the elements 
    source = gst_element_factory_make ("v4l2src", "source"); 
    muxer = gst_element_factory_make ("qtdemux", "mux"); 
    // videoenc = gst_element_factory_make("ffdec_mpeg4", "videoenc"); //why this failed 
    videoenc = gst_element_factory_make("ffmpegcolorspace", "videoenc");// but this passed but in both cases app failed to run 
    payloader = gst_element_factory_make("rtpmp4vpay", "rtpmp4vpay"); 
    udpsink = gst_element_factory_make("udpsink", "udpsink"); 

    // Create the empty pipeline 
    pipeline = gst_pipeline_new ("test-pipeline"); 

    if (!pipeline || !source) 
    { 
    g_printerr ("One element could not be created. Exiting.\n"); 
    return -1; 
    } 
    if(!muxer ) 
    { 
    g_printerr ("failed to create muxer Exiting.\n"); 
    return -1; 
    } 
    if(!videoenc) 
    { 
    g_printerr ("failedto create videoenc. Exiting.\n"); 
    return -1; 
    } 

     if(!payloader || !udpsink) 
     { 
      { 
      g_printerr ("One element could not be created out of payloader or udpsink. Exiting.\n"); 
      return -1; 
      } 
     } 

    g_object_set(G_OBJECT(payloader), 
      "config-interval", 0, 
      NULL); 
    g_object_set(G_OBJECT(udpsink), 
       "host", "127.0.0.1", 
       "port", 5000, 
       NULL); 
// we add a message handler 
    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); 
    gst_bus_add_watch (bus, bus_call, loop); 
    gst_object_unref (bus); 


    //set der source 
     g_object_set (G_OBJECT (source), "device", "/dev/video0", NULL); 



      gst_bin_add_many (GST_BIN (pipeline), source, videoenc, payloader, udpsink, NULL); 
       gst_element_link_many (source, videoenc, payloader, udpsink, NULL); 


    // g_print("Linked all the Elements together\n"); 
     gst_element_set_state (pipeline, GST_STATE_PLAYING); 
    // Iterate 
     g_print ("Running...\n"); 
     g_main_loop_run (loop); 

     // Out of the main loop, clean up nicely 
     g_print ("Returned, stopping playback\n"); 
     gst_element_set_state (pipeline, GST_STATE_NULL); 

     g_print ("Deleting pipeline\n"); 
     gst_object_unref (GST_OBJECT (pipeline)); 

} 

ответ

0

Слишком долго для комментариев, я отправлю ответ, и мы увидим, что мы получаем.

Вы определенно должны использовать 0.10? есть уже версия 1.6.1 .. в Ubuntu 15.10 есть встроенный в 1.6 .. в любом случае ..

Я думаю, вам не хватает capsfilter:

GstElement *capsfilter = gst_element_factory_make("capsfilter", "camera_caps"); 
GstCaps *caps = gst_caps_from_string ("video/x-raw-yuv,format=(fourcc)YUY2,width=1280,height=720,framerate=25/1"); 
g_object_set (capsfilter, "caps", caps, NULL); 

Вы должны поместить его сразу после v4l2src элемента ..

Если это не работает, вы можете отлаживать запуск приложения с помощью GST_DEBUG=default:4, который должен печатать, если была проблема с связыванием. Вы также можете создать dot graph трубопровода и проверить, если все взаимосвязано правильно ..

Вы можете ускорить отладку, переписав код команды GST-запуска оболочки:

GST_DEBUG=3 gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-yuv,format=\(fourcc\)YUY2,width=1280,height=720,framerate=25/1 ! ffmpegcolorspace ! rtpmp4vpay ! queue ! udpsink port=5000 host=127.0.0.1

+0

Отлично Mate. На самом деле я все еще получал ошибку после добавления шапок. Так как вы предположили, что я отлаживал и нашел ffmpegcolorspace, а rtpmp4vpay не удалось связать. В командной строке, когда я набираю «gst-launch-0.10 v4l2src! Video/x-raw-yuv, format = \ (fourcc \) YUY2, width = 320, height = 240, framerate = 20/1! Jpegenc! Rtpjpegpay! Udpsink host = 127.0.0.1 port = 5200 "и on Receiver" gst-launch-0.10 udpsrc port = 5200! application/x-rtp, encoding-name = JPEG, payload = 26! rtpjpegdepay! jpegdec! autovideosink "он работает. – samprat

+0

Итак, я исследовал и изменил ffmpegcolorspace на «jpegenc», а в payloader меняю на «rtpjpegpay», и он работает. На самом деле мне нужно кодировать, используя mpeg-4, так что это работает для меня. – samprat

+0

Также к вашему предыдущему комментарию. Его основным требованием в моем проекте было использование только gstreamer-0.10, поэтому мои руки связаны между собой – samprat

 Смежные вопросы

  • Нет связанных вопросов^_^