插入gstreamer管道中的媒体类型字符串有什么影响

插入gstreamer管道中的媒体类型字符串有什么影响,gstreamer,Gstreamer,我在gstreamer中见过这种管道运行命令: e、 g 我在一些页面上读到,video/x-raw,format=I420,framerate=25/1,width=640,height=360指定了媒体类型。但我无法理解它会产生什么影响-是否将输入转换为指定的帧速率/格式/宽度/高度等。。或者这就像指定输入已经在这个帧速率/宽度/ht中一样?如果只是指定输入在这个帧速率中,它会对管道产生什么影响等等。。。而不是转变 这真的是必要的还是我们可以忽略它?他们称之为视频/x-raw,format=

我在gstreamer中见过这种管道运行命令:

e、 g

我在一些页面上读到,
video/x-raw,format=I420,framerate=25/1,width=640,height=360
指定了媒体类型。但我无法理解它会产生什么影响-是否将输入转换为指定的帧速率/格式/宽度/高度等。。或者这就像指定输入已经在这个帧速率/宽度/ht中一样?如果只是指定输入在这个帧速率中,它会对管道产生什么影响等等。。。而不是转变


这真的是必要的还是我们可以忽略它?

他们称之为
视频/x-raw,format=I420,framerate=25/1,width=640,height=360
简称为“能力”或“上限”

有时需要明确指定gstreamer管道中元素之间的数据流类型。而caps就是这样做的

为什么有时需要这样做?因为某些gstreamer元素可以接受(或产生) 几种类型的媒体。您可以通过
gst-inspect
命令看到这一点:

$ gst-inspect videotestsrc
...

Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-raw-yuv
                 format: YUY2
           color-matrix: { sdtv, hdtv }
            chroma-site: { mpeg2, jpeg }
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]
      video/x-raw-yuv
                 format: UYVY
           color-matrix: { sdtv, hdtv }
            chroma-site: { mpeg2, jpeg }
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]
      video/x-raw-yuv
                 format: YVYU
           color-matrix: { sdtv, hdtv }
...
这意味着
videotestsrc
具有pad
src
,可以产生各种格式(YUY2、UYVY、YVYU等)、大小、帧率等的输出

这同样适用于
xImageSink

Pad Templates:
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      video/x-raw-rgb
              framerate: [ 0/1, 2147483647/1 ]
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
      video/x-raw-yuv
              framerate: [ 0/1, 2147483647/1 ]
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
它能够以各种格式查看数据流

GStreamer使用调用的过程来决定在两个元素之间使用哪种具体的数据格式。如果用户没有提供任何功能,它会尝试选择“最佳匹配”格式。这就是为什么可以从您的管道中删除功能,并且它仍然可以工作的原因:

$ gst-launch-1.0 -v videotestsrc ! xvimagesink

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstXvImageSink:xvimagesink0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
我添加了
-v
标志以查看gstreamser实际决定使用的caps

但有时会出现gstreamser无法协商数据格式或您有不同偏好的情况

例如,在管道从套接字读取流的情况下,不可能确定猜测数据格式,您需要提供正确的功能

您可以看到,通过执行以下两个管道,指定CAP会产生不同:

$ gst-launch -v videotestsrc ! 'video/x-raw-yuv, width=600, height=600' ! xvimagesink
$ gst-launch -v videotestsrc ! 'video/x-raw-yuv, width=60, height=60' ! xvimagesink

重要的是要理解,功能不是转换数据,而是指定将生成或使用哪些格式元素。

在这种情况下,我是否应该在以下管道中添加CAP,因为它正在向套接字写入rtp数据包filesrc location=/home/ubuntu/DELTA.mpg!mpeg2dec!x264enc!rtph264pay name=pay0 pt=96我不能确定,但我认为您不需要在发送端或接收端指定上限。引自:“H.264的一个非常基本的设计概念是生成自包含的数据包”。但您需要指定正确的有效负载大小(参数
pt=96
)。
$ gst-launch -v videotestsrc ! 'video/x-raw-yuv, width=600, height=600' ! xvimagesink
$ gst-launch -v videotestsrc ! 'video/x-raw-yuv, width=60, height=60' ! xvimagesink