Элементы Gstreamer не связаны

#gstreamer

#gstreamer

Вопрос:

Я новичок в Gstreamer, и у меня есть вопрос о том, почему мои элементы не будут соединяться вместе. Вот мой код:

 CustomData data;

data.videosource = gst_element_factory_make("uridecodebin", "source");
cout << "Created source element " << data.videosource << endl;
data.demuxer = gst_element_factory_make("qtdemux", "demuxer");
cout << "Created demux element " << data.demuxer << endl;
data.decoder = gst_element_factory_make("ffdec_h264", "video-decoder");
cout << "Went to the video path " << data.decoder << endl;          
data.videoconvert = gst_element_factory_make("ffmpegcolorspace", "convert"); 
cout << "Created convert element " << data.videoconvert << endl;
data.videosink = gst_element_factory_make("autovideosink", "sink");
cout << "Created sink element " << data.videosink << endl;

if (!data.videosource ||!data.demuxer || !data.decoder || !data.videoconvert || !data.videosink)
{
    g_printerr ("Not all elements could be created.n");
    system("PAUSE");
    return;
}

//Creating the pipeline
data.pipeline = gst_pipeline_new("video-pipeline");
if (!data.pipeline)
{
    g_printerr ("Pipeline could not be created.");
}


//Setting up the object
g_object_set(data.videosource, "uri", videoFileName[camID] , NULL);
//videoFileName[camID] is a char** with the content uri=file:///C://videofiles/...mp4


//Adding elements to the pipeline
gst_bin_add_many(GST_BIN (data.pipeline), data.videosource, data.demuxer, data.decoder, data.videoconvert, data.videosink, NULL);
//This is where the issue occurs
   if(!gst_element_link(data.videosource, data.demuxer)){
        g_printerr("Elements could not be linked. n");
        system("PAUSE");
        return;
}
 

То, что я пытаюсь сделать, это разбить файл mp4 и отобразить только видеоконтент, но по какой-то причине, когда я пытаюсь связать источник и демультиплексор, он выдает false.

Большое вам спасибо, ребята!

Ответ №1:

Давайте посмотрим на конвейер, который вы используете (я буду использовать gst-launch здесь для краткости, но то же самое относится к любым конвейерам GStreamer):

 gst-launch uridecodebin uri=file:///path/to/movie.avi 
   ! qtdemux ! ffdec_h264 ! ffmpegcolorspace 
   ! autovideosink
 

gst-inspect uridecodebin состояния:
Автоматическая загрузка и декодирование URI в необработанный носитель

So uridecodebin берет любой источник аудио / видео и декодирует его, внутренне используя некоторые другие элементы GStreamer.
Его вывод выглядит примерно так video/x-raw-rgb или audio/x-raw-int (необработанное аудио / видео)

qtdemux с другой стороны, принимает поток QuickTime (все еще закодированный) и отключает его.

Но то, что он получает в вашем примере, — это уже декодированное необработанное видео (именно поэтому оно не будет связываться).

Итак, у вас в основном есть два варианта:

  • просто используйте uridecodebin
     gst-launch uridecodebin uri=file:///path/to/movie.avi 
       ! autovideosink
     

    что позволит вашему конвейеру декодировать практически любой видеофайл

  • просто используйте qtdemux ! ffdec_h264 ! ffmpegcolorspace элементы:
     gst-launch filesrc=/path/to/movie.avi 
       ! qtdemux ! ffdec_h264 ! ffmpegcolorspace
       ! autovideosink
     

Однако имейте в виду, что ваш конвейер не воспроизводит аудио.
Чтобы получить это, выполните одно из следующих действий:

  • Просто используйте playbin2
     gst-launch playbin2 uri=file:///path/to/movie.avi
     
  • Также подключите ваш decodebin к аудиоприемнику
    gst-запустите uridecodebin name=d uri= … ! автовидеосиньк d. ! автоаудиосиньк

Комментарии:

1. Большое вам спасибо за подробный ответ. Я многому научился из этого!