如何检查元素的接收器垫是否正在接收数据?
how to check whether a sink pad of an element is receiving data or not?
我想知道如何检查 gstreamer 中元素的接收器垫是否正在获取数据。
如果没有获取数据,我想重置或重新启动管道。
谁能告诉我如何重置或重启管道?重新启动管道时会发生什么?以及如何了解 pad 的传入数据?
您可能希望将 post 分成两个单独的问题。至于重新启动管道,您可以将状态设置为 NULL 然后返回 PLAYING,但我建议重新启动整个过程,因为很多元素无法正确清理。
要检测缓冲区是否进入,您可以在管道的所需位置添加一个 identity
元素,并像这样在其上注册一个回调。然后在您的主线程中验证更新时间是否在所需范围内。也许使用 g_timeout_add()
.
void ir_data_received(GstElement* identity, GstBuffer* buf, gpointer user_data) {
my_object *some_useful_pointer = (my_object*)user_data;
//data is coming in, reset the necessary flag
}
void setup(GstElement * pipeline, my_object *some_useful_pointer) {
GstElement* identity = gst_bin_get_by_name(GST_BIN(pipeline), "identity");
if(identity == NULL) {
//error handling
}
g_signal_connect(G_OBJECT(identity), "handoff", (GCallback)data_received, some_useful_pointer);
}
每秒超时检查:
gboolean check_status(gpointer user_data) {
//check if data is coming in and exit system if it's not
}
g_timeout_add(1000, check_status, some_useful_pointer);
我想知道如何检查 gstreamer 中元素的接收器垫是否正在获取数据。
如果没有获取数据,我想重置或重新启动管道。
谁能告诉我如何重置或重启管道?重新启动管道时会发生什么?以及如何了解 pad 的传入数据?
您可能希望将 post 分成两个单独的问题。至于重新启动管道,您可以将状态设置为 NULL 然后返回 PLAYING,但我建议重新启动整个过程,因为很多元素无法正确清理。
要检测缓冲区是否进入,您可以在管道的所需位置添加一个 identity
元素,并像这样在其上注册一个回调。然后在您的主线程中验证更新时间是否在所需范围内。也许使用 g_timeout_add()
.
void ir_data_received(GstElement* identity, GstBuffer* buf, gpointer user_data) {
my_object *some_useful_pointer = (my_object*)user_data;
//data is coming in, reset the necessary flag
}
void setup(GstElement * pipeline, my_object *some_useful_pointer) {
GstElement* identity = gst_bin_get_by_name(GST_BIN(pipeline), "identity");
if(identity == NULL) {
//error handling
}
g_signal_connect(G_OBJECT(identity), "handoff", (GCallback)data_received, some_useful_pointer);
}
每秒超时检查:
gboolean check_status(gpointer user_data) {
//check if data is coming in and exit system if it's not
}
g_timeout_add(1000, check_status, some_useful_pointer);