[英]Gstreamer Elements not linking
我是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。
非常感谢你们!
让我们看一下您正在使用的管道(为简洁起见,我将在这里使用gst-launch
,但对于任何GStreamer管道也是如此):
gst-launch uridecodebin uri=file:///path/to/movie.avi \
! qtdemux ! ffdec_h264 ! ffmpegcolorspace \
! autovideosink
gst-inspect uridecodebin
状态:
自动插入URI并将其解码到原始媒体
因此, 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
qtdemux ! ffdec_h264 ! ffmpegcolorspace
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名= d URI = ...! 自动视频接收器d。 ! 自动音频接收器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.