Gstreamer管道语法

Gstreamer管道语法,gstreamer,Gstreamer,我使用gstreamer管道将mp4文件编码为不同的比特率。我使用来自gst流媒体服务器的代码构建了管道。管道似乎不起作用。我无法理解这里的管道语法来调试它 gst-launch-1.0 filesrc location=video_test.mp4 name=src ! \ decodebin name=dec queue name=vqueue ! \ videosegmentclip name=vclip ! \ videoconvert ! \ video/x-raw,

我使用gstreamer管道将mp4文件编码为不同的比特率。我使用来自gst流媒体服务器的代码构建了管道。管道似乎不起作用。我无法理解这里的管道语法来调试它

gst-launch-1.0 filesrc location=video_test.mp4 name=src ! \
  decodebin name=dec queue name=vqueue ! \
  videosegmentclip name=vclip ! \
  videoconvert ! \
  video/x-raw, format=I420 ! \
  videocrop top=0 bottom=0 left=0 right=0 ! \
  queue ! \
  tee name=vtee queue name=aqueue max-size-time=5000000000 max-size-bytes=0 max-size-     buffers=0 ! \
  audiosegmentclip name=aclip ! \
  audioconvert ! \
  audio/x-raw, channels=2 ! \
  audioresample ! \
  audio/x-raw, rate=48000 ! \
  voaacenc bitrate=128000 ! \
  queue ! \
  tee name=atee vtee. ! \
  queue ! \
  videoscale add-borders=false ! \
  video/x-raw,pixel-aspect-ratio=1/1,width=1280,height=720 ! \
  x264enc name=venc0 bitrate=2372 tune=zerolatency ! \
  queue ! \
  mp4mux name=mux0 ! \
  watchdog timeout=5000 ! \
  filesink name=sink0 location=out0.mp4  atee. ! \
  queue ! \
  mux0. \ 
上面是完整的管道。对我来说,最困难的部分是理解下面的内容

decodebin name=dec queue name=vqueue
没有!在上面的行中,不应该有一个!在decodebin和队列之间

tee name=vtee queue name=aqueue... ! audiosegmentclip
在上面的一行中,有一个名为vtee(videotee)但链接到audiosegmentclip的T形三通。这是怎么回事

tee name=atee vtee. ! queue
在上面的一行中,有一个名为atee的T形三通,紧接着是vtee。这是什么意思?元素后面有一个句号(.)的意义是什么


任何解释gstreamer管道语法的链接都将非常有用。

您想要的一般概念可以在该管道中找到。其主要区别在于:

  • 不需要T形三通,因为
    decodebin
    有许多水槽垫可连接到不同的媒体类型
  • 我首先逻辑地处理视频,将其推送到多路复用器,然后是音频。我发现在管道中将音频和视频元素混合在一起会在逻辑上把我搞砸,而且先处理一个然后处理另一个更容易
  • 我删除了一些您可能需要添加的项目(一些队列设置和过滤器)

    gst-launch-1.0 filesrc location=test.mp4 name=src!decodebin name=dec\
    队列名称=vqueue!videosegmentclip name=vclip!视频转换\
    视频/x-raw,格式=I420!视频裁剪顶部=0底部=0左=0右=0\
    videoscale添加边框=错误\
    视频/x-raw,像素纵横比=1/1,宽度=1280,高度=720\
    x264enc名称=venc0比特率=2372调谐=零延迟!队列多路复用器。十二月\
    audiosegmentclip name=aclip!音频转换!音频/x-raw,通道=2\
    音频重采样!音频/x-raw,速率=48000!voaacenc比特率=128000!\
    队列mp4mux name=mux!看门狗超时=5000\
    filesink name=sink0 location=out0.mp4


  • 我也在努力学习语法。gst-launch-1.0手册页上说:

    管道由元素和链接组成。元素可以放入 不同种类的箱子。可以在中指定元素、链接和容器 管道 任何顺序的描述

    我一想到这个就糊涂了!(链接)类似于bash管道,元素类似于生成和接收数据的bash命令,因此必须有一个与之关联的命令列表!。在gstreamer中,情况并非如此。管道描述是按任意顺序排列的元素、链接和容器的列表。这是我的语法尝试(不包括箱子和帽子)。请注意,
    *
    表示变量数量,
    /
    表示备选方案之一

    pipeline = pipeline_item*
    pipeline_item = element / link
    element = NAME property*
    property = NAME=VALUE
    link = ! / pad ! pad
    pad = ELEMENT_NAME. / ELEMENT_NAME.padnames
    padnames = NAME / NAME,padnames
    
    或者,用英语总结一下:

    • 名称是一个元素
    • NAME=VALUE是一个属性
    • 名字。或NAME.PAD是一个PAD(注意两种形式后面的.)
    • !!是一个链接,可以像这样使用:
      • 元素1!元素2
      • element1 name=e1 element2 name=e2 e1!e2
      • element1 name=e1 element2 name=e2 e1.src!e2.水槽

    您需要将bin链接到队列
    decodebin name=dec!队列名称=vqueue
    和发球台
    发球台名称=vtee!queue name=aqueue…
    这给了我一个不同的错误GST\u管道语法。y:616:GST\u parse\u perform\u link:无法将aqueue链接到ACLI,这很有意义,因为您正在尝试向其发送视频剪辑…谢谢Trent。我是gstreamer的新手。我的目标是分割音频和视频流,然后用特定比特率对其进行编码,然后对其进行多路复用。我如何修改这个管道来达到这个目的。所以,从文件中读取,将音频和视频移动到特定的比特率,然后再次将它们多路复用在一起,对吗?谢谢特伦特。管道正在运行。当我需要MPEG-TS流时,如何使用MPEGTSUM元素代替mp4mux使其工作。我可以使用mp4,但当我使用(x264enc上的key int max属性)分割mp4文件时,我的片段无法播放。但是,当我在MPEG-TS文件上进行分段时,这些文件是可以播放的。您可能只需交换元素并添加所需的属性就可以了。我不相信会有任何失败的上限谈判