我有rtsp服务器,我想扩展rtp缓冲区头。为此,我向rtph265pay的src添加了探针,但从未调用过。我的管道:
( appsrc name=vsrc ! nvvidconv ! video/x-raw(memory:NVMM),format=NV12 !
omxh265enc MeasureEncoderLatency=true bitrate=20000000 control-rate=2 !
rtph265pay name=pay0 pt=96 )
我连接探针的代码:
static GstPadProbeReturn test_probe (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data)
{
cout << "i'm here";
}
void mediaConfigure (GstRTSPMediaFactory* factory, GstRTSPMedia* media,
gpointer user_data)
{
GstElement *element, *rtph265pay; GstPad *pad;
element = gst_rtsp_media_get_element (media);
rtph265pay = gst_bin_get_by_name_recurse_up (GST_BIN (element), "pay0");
pad = gst_element_get_static_pad (rtph265pay, "src");
gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER,
(GstPadProbeCallback) test_probe, NULL, NULL);
gst_object_unref (pad);
}
如果我将“ sink”设置为“ src”,则探针可以工作,但是我需要“ src”来更改rtp缓冲区标头...怎么了
我不太熟悉这种类型的gstreamer语法,但是-您可以尝试按照文档描述的方式创建管道吗?我的意思是使用他们在这里使用的模板:Basic tutorial 3: Dynamic pipelines这样,探针始终为我工作:GStreamer: Sending string to another pipeline via UDP
特别是,在创建管道并链接了所有元素之后,并且在播放管道之前,我完全按照您的方式添加了探针:
rtph264pay_src_pad = gst_element_get_static_pad(rtph264pay_HD, "src");
gst_pad_add_probe (rtph264pay_src_pad, GST_PAD_PROBE_TYPE_BUFFER,
(GstPadProbeCallback) set_x_to_rtp_header, NULL, NULL);
gst_object_unref (rtph264pay_src_pad);
[另一个想法:可能是因为rtph265pay的src填充板未链接到任何其他填充板-意味着rtph265pay是管道的末端-元素未将任何缓冲区传递到其src填充板?也许尝试在rtph265pay之后附加一个假钞。