我构建了一个自定义GStreamer管道,用于播放RTSP流。与此同时,我想创建一个新的GstPlayer
来使用此管道。问题是,我无法设置GstPlayer
的管道(唯一相关的方法是gst_player_get_pipeline()
。我不明白那里有什么无法为GstPlayer自定义管道。这似乎是基本功能,所以我必须遗漏一些东西。
我的管道:
GstElement *pipeline, *source, *filter, *sink;
// Create pipeline elements
pipeline = gst_pipeline_new ("vdi-pipeline");
source = gst_element_factory_make ("rtspsrc", "vdi-source");
filter = gst_element_factory_make ("decodebin", "vdi-filter");
sink = gst_element_factory_make ("appsink", "vdi-sink");
if (!source || !filter || !sink)
{
__android_log_print (ANDROID_LOG_ERROR, "Error", "A GstElement could not be created. Exiting.");
return;
}
// Add elements to pipeline
gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);
// Link elements together
if (!gst_element_link_many (source, filter, sink, NULL)) {
__android_log_print (ANDROID_LOG_ERROR, "Warning", "Failed to link elements!");
}
答案 0 :(得分:0)
但你可以开箱即用GstPlayer播放rtsp ..为什么你想要自定义管道? 玩家正在使用playbin接受任何类型的网址..它将根据正在播放的内容动态创建管道..
如果你真的不能使用playbin那么修补播放器本身怎么样?我不认为它是用于自定义管道..但你可以破解它here。
然后你将在rtspsrc上挂起newpads和其他回调而不是playbin ..和其他东西 - 我想你不想要这个。
另一种方式是 - 当playbin构造管道时它在里面使用rtspsrc - 你可以从管道对象中获取这个元素并改变一些参数..但要小心,因为在播放过程中更改参数非常棘手......
更新:
嗯,我想我会以某种方式忽略appsink ..我认为你可以设置playbin属性audio-sink或视频接收器来覆盖它以使用appsink。
但是你仍然必须以某种方式从GstPlayer中获取playbin元素或在初始化时设置playbin参数(我不知道如何) - 在这种情况下,如果你要去的话,我会问IRC(freenode,#gstreamer)正确的方向。
也许更好的方法是使用decodebin甚至playbin创建自己的应用程序并在那里传递appsink元素..如果你不玩游戏而不是处理缓冲区,你为什么要使用GstPlayer?
HTH