#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. Большое вам спасибо за подробный ответ. Я многому научился из этого!