C 了解GStreamer管道

C 了解GStreamer管道,c,gstreamer,C,Gstreamer,我有一个抽象的问题,还有一个具体的例子。我刚刚开始与GStreamer合作,我试图了解管道的流动。我希望对任何给定任务的管道中应该存在什么样的元素有一个良好的直觉。我最近完成了一个教程,使用tee显示测试音频的视频表示()。现在,我试图让GStreamer播放一个.ogg文件并显示类似的图形表示。我一定是想错了,但我找到了一种构建ogg管道的方法,发现 sudo gst-launch-0.10 filesrc file.ogg ! oggdemux ! vorbisdec ! audioconv

我有一个抽象的问题,还有一个具体的例子。我刚刚开始与GStreamer合作,我试图了解管道的流动。我希望对任何给定任务的管道中应该存在什么样的元素有一个良好的直觉。我最近完成了一个教程,使用tee显示测试音频的视频表示()。现在,我试图让GStreamer播放一个.ogg文件并显示类似的图形表示。我一定是想错了,但我找到了一种构建ogg管道的方法,发现

sudo gst-launch-0.10 filesrc file.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
因此,我使用T形三通构建了一条管道:

if (gst_element_link_many (data.audio_source, data.tee, NULL) != TRUE) {
  g_printerr ("Elements #1 could not be linked.\n");
  linked = FALSE;
}
if (gst_element_link_many (data.audio_queue, data.oggdemux, data.vorbisdec, data.audio_convert, data.audio_resample, data.audio_sink, NULL) != TRUE) {
  g_printerr ("Elements #2 could not be linked.\n");
  linked = FALSE;
}
if (gst_element_link_many (data.video_queue, data.visual, data.video_convert, data.video_sink, NULL) != TRUE) {
  g_printerr ("Elements #3 could not be linked.\n");
  linked = FALSE;
}

但我有个错误告诉我“元素#2无法链接,但我不确定为什么不允许这种模式。请帮忙!谢谢。

如果其他人正在处理此问题,请前往。另外,如果要使用playbin2指定本地文件,只需将
uri
参数设置为
file:///myfile.ogg

您是否尝试将oggdemux置于音频队列之前?这似乎是GStreamer中的常见做法。链接data.audio\u source->data.oggdemux->data.tee,如果这是你的意思,那么也无法实现。不,我的意思是
audio\u source->tee
,就像你在代码中所做的那样(元素#1),但是元素#2将是
oggdemux->audio queue->vorbisdec->…
。同样的错误是:data.oggdemux,data.audio\u队列,data.vorbisdec,data.audioconvert,data.audioresample,data.autoaudiosink关于:
oggdemux->vorbisdec->audio\u队列->…
?是否需要
音频队列
?您是否尝试单独链接元素(并查看链接失败的位置)?此外,oggdemux和vorbisdec不链接的原因是您无法直接链接解复用器和解码器。解复用器不需要pad,只在数据开始通过时创建pad,因此需要创建一个信号处理程序,以便在调用“pad ADTED”信号时添加pad。