GStreamer:如何向RTP负载器传递RTP头部扩展属性
解决GStreamer RTP头部扩展属性设置问题
问题梳理
你已经基于GStreamer v1.20的GstRTPHeaderExtension实现了WebRTC色彩空间RTP头部扩展,能成功发送带扩展的RTP数据包,但无法通过caps传递色彩空间属性(colorimetry、chroma-site)给payloader,不清楚具体传递方式是否需要capsfilter。
核心修正与实现步骤
1. 修正代码执行顺序
你当前的代码先调用了add-extension信号,后创建rtph264pay元素,这是错误的——必须先创建payloader元素,再为其添加头部扩展:
// 先创建rtph264pay元素 videopay = gst_element_factory_make("rtph264pay", "videopay"); // 再创建并添加RTP头部扩展 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); g_object_unref(ext); // 释放扩展对象引用,避免内存泄漏
2. 传递色彩空间属性到Payloader
不需要额外的capsfilter元素,直接通过以下两种方式之一传递caps即可:
方式一:链接上游元素时指定视频Caps
将色彩空间信息嵌入到video/x-h264格式的caps中,通过gst_element_link_filtered链接x264enc与rtph264pay,让payloader从上游视频流中获取色彩信息:
colorimetry_str = gst_video_colorimetry_to_string(&colorimetry); GstCaps *video_caps = gst_caps_new_simple("video/x-h264", "colorimetry", G_TYPE_STRING, colorimetry_str, "chroma-site", G_TYPE_STRING, gst_video_chroma_to_string(chroma_site), NULL); // 用带色彩信息的caps链接x264enc和rtph264pay if (!gst_element_link_filtered(x264enc, videopay, video_caps)) { g_printerr("Failed to link x264enc to rtph264pay\n"); // 错误处理逻辑 } gst_caps_unref(video_caps);
方式二:直接设置Payloader的输出RTP Caps
将色彩空间属性直接添加到application/x-rtp格式的caps中,设置为rtph264pay的输出caps,让头部扩展从RTP caps中读取属性:
colorimetry_str = gst_video_colorimetry_to_string(&colorimetry); GstCaps *rtp_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); // 设置rtph264pay的输出caps g_object_set(videopay, "caps", rtp_caps, NULL); gst_caps_unref(rtp_caps);
3. 验证扩展属性生效
可以通过gst-launch-1.0的rtpbin配合rtph264depay和capsfilter接收流,查看RTP caps中的色彩空间属性是否存在,或者用Wireshark抓包查看RTP头部扩展字段是否包含正确的色彩空间编码值。
内容的提问来源于stack exchange,提问作者chronosynclastic
相关产品推荐
相关产品推荐

