这里的目标是能够发送一些元数据(时间戳,每个帧中找到的对象),在单个管道或网络上的多个管道(例如,RTP UDP)中发送流。
管道中的:--通过定义一个新的GstMeta API并注册并实现它,这是直接的。然后通过缓冲区探针或其他专门为此目的设计的元素将其添加到GstBuffer中。
网络上的多管道:--我听说过的唯一解决方案是将一个或多个RTP报头扩展添加到来自付费加载器的RTP数据包中。实际上,有些人决定将他们的自定义GstMeta转换为那些头扩展。但这真的是一个很好的用例吗?
还有更多.的另一个想法是创建您自己的自定义媒体类型video/x-mytype,为此您需要在其之上编写一个类型查找函数和一个自动插入器,更不用说处理这个新类型并将其转换为其他外部媒体类型的两个元素了。现在,新类型应该有一个可以处理我刚才提到的元数据的地方。
这是我的研究总结,还有其他我不知道的方法吗?
我非常感谢你对此的投入!
提前感谢!
发布于 2021-12-05 09:42:04
我决定在gstreamer中实现一个新的媒体类型(例如video/x-h265-with-meta)。这种新媒体类型应该具有固有的元数据处理能力。您可以根据您认为适合这种新类型的方式来设计它如何编码/解码元数据。您还需要再编写2个gstreamer元素。一种是将常规video/x-h265转换为video/x-h265-with-meta (例如muxmymeta),另一种是逆转这种转换(例如demuxmymeta)。因此,从本质上说,muxmymeta将通过GstBuffer* API实现读取注入到GstMeta中的元数据,并在传出流中编码。demuxmymeta将从流中解码此类元数据,并将其添加回GstBuffer*。为了确保每个编码的h265帧都有相应的元,muxmymeta必须以这种格式设置它的src大写:
video/x-h265
          stream-format: byte-stream
              alignment: aubyte-stream对于网络传输是强制性的,而au对齐强制整个编码帧作为muxmymeta的输入。
我还使用了rtpgstpay和rtpgstdepay元素与RTP/RTSP一起使用这种新的媒体类型。此时您不需要编写类型查找函数,因为rtpgstpay/rtpgstdepay将能够从大写中看出这一点。这对于GStreamerv1.6.2中的h265流来说很好,但是我必须在gstreamer本身中做一个修复,以使它也能与h264一起工作。最后,要使自动插入器(如decodebin/uridecodebin )解码您的流,必须将demuxmymeta的klass设置为demuxmymeta,并为其设置优先级( none除外),这基本上告诉gstreamer使用这个元素进行解码。
以下是两条用于说明的管道:
( rtspsrc location=rtsp://localhost:8554/test latency=0 ! rtph265depay ! h265parse ! muxmymeta ! rtpgstpay name=pay0 pt=96 ) 
GstRTSPMediaFactory的发射线)在这里,rtsp://localhost:8554/test流是一个常规的h265流video/x-h265。但是假设rtsp服务器将生成rtsp://localhost:8553/test-meta,其类型为video/x-h265-with-meta。
rtspsrc location=rtsp://localhost:8553/test-meta ! rtpgstdepay ! demuxmymeta ! h265parse ! avdec_h265 ! videoconvert ! autovideosink 
有了自动插入器,它看起来就像:uridecodebin uri=rtsp://localhost:8553/test-meta ! autovideosink一样整洁
虽然这似乎是一种长远的解决方案,但它提供了一种在网络上的管道间传输自同步元数据的方法。
https://stackoverflow.com/questions/68098185
复制相似问题