【问题标题】:Gstreamer: Signal RTP header extension to the payloaderGstreamer:信号RTP标头扩展到有效负载
【发布时间】:2023-01-21 07:28:32
【问题描述】:

我有一个 RTP 流应用程序,它使用 C API 实现以下管道。

gst-launch-1.0 -v rtpbin name=rtpbin \
videotestsrc ! x264enc ! rtph264pay! rtpbin.send_rtp_sink_0 \
rtpbin.send_rtp_src_0 ! udpsink port=5002 host=127.0.0.1 \
rtpbin.send_rtcp_src_0 ! udpsink port=5003 host=127.0.0.1 sync=false async=false \
udpsrc port=5007 ! rtpbin.recv_rtcp_sink_0

我想为 RTP 数据包添加标头扩展;因此,我使用 GStreamer v1.20 中引入的新 GstRTPHeaderExtension 类创建了一个扩展。我想设置扩展的属性(例如下面示例的颜色空间属性)。 AFAIU 这应该通过将这些作为上限提供给有效载荷元素来完成。但是,我无法弄清楚我应该如何准确地提供这些上限。我需要在这里使用 capsfilter 还是正确的方法?在当前状态下,我可以发送 RTP 数据包并看到添加了扩展但无法设置属性。

代码的相关部分如下:

#define URN_COLORSPACE "http://www.webrtc.org/experiments/rtp-hdrext/color-space"  

const GstVideoColorimetry colorimetry = {
    GST_VIDEO_COLOR_RANGE_0_255,
    GST_VIDEO_COLOR_MATRIX_BT601,
    GST_VIDEO_TRANSFER_BT2020_10,
    GST_VIDEO_COLOR_PRIMARIES_BT2020};

const GstVideoChromaSite chroma_site = GST_VIDEO_CHROMA_SITE_MPEG2; 

ext = gst_rtp_header_extension_create_from_uri(URN_COLORSPACE);
gst_rtp_header_extension_set_id(ext, 1);
g_signal_emit_by_name(videopay, "add-extension", ext);

// other element definitions, links..
videopay = gst_element_factory_make("rtph264pay", "videopay");

colorimetry_str = gst_video_colorimetry_to_string(&colorimetry);
// How to provide these caps to the payloader set the extension properties?
caps = gst_caps_new_simple("application/x-rtp",
                            "media", G_TYPE_STRING, "video",
                             "clock-rate", G_TYPE_INT, 90000,
                             "encoding-name", G_TYPE_STRING, "H264",
                             "colorimetry", G_TYPE_STRING, colorimetry_str,
                             "chroma-site", G_TYPE_STRING,
                             gst_video_chroma_to_string(chroma_site), NULL);

【问题讨论】:

    标签: gstreamer rtp


    【解决方案1】:

    应使用 capsfilter 元素将上限提供给 RTP 有效负载元素的接收器:

    GstElement *capsfilt;    
    capsfilt = gst_element_factory_make("capsfilter", "capsfilter");
    g_object_set(capsfilt, "caps", caps, NULL);
    gst_element_link_many(videosrc, videoenc, capsfilt, videopay, NULL)
    

    其中videosrcvideoencvideopay分别是源、编码器和有效载荷元素。 此外,caps 应具有与编码器元素匹配的媒体类型。例如。 video/x-h264 如果编码器元素是x264enc 的实例。 如果启用auto-header-extension(默认设置为 true),则有效负载将尝试通过将上限传递给扩展来自动启用具有上限中设置的属性的扩展。

    在 gst-launch 管道中,当在负载程序之后插入标头扩展时,上限会自动传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      相关资源
      最近更新 更多