Gstreamer管道语法

4

我正在使用gstreamer管道将mp4文件编码为不同的比特率。我使用了来自gst-streaming-server代码的构建管道。但是,这个管道似乎无法工作。我无法理解管道的语法以进行调试。

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和queue之间不应该有!

tee name=vtee queue name=aqueue... ! audiosegmentclip

在上述行中,有一个名为vtee(videotee)的分支,但与audiosegmentclip相关联。这是如何运作的?
tee name=atee vtee. ! queue

在上面的行中,有一个名为"atee"的T字型管道符,紧接着是"vtee"。这意味着什么?在元素后面加上句点(.)有什么意义?
任何解释gstreamer管道语法的链接都将非常有帮助。

你需要将bin连接到队列decodebin name=dec ! queue name=vqueue以及teetee name=vtee ! queue name=aqueue - Benjamin Trent
这给了我一个不同的错误 GST_PIPELINE grammar.y:616:gst_parse_perform_link: 无法将 aqueue 链接到 aclip。 - Yoganand Anandaraju
这是有道理的,因为你正在尝试将视频剪辑发送到它... - Benjamin Trent
1
谢谢Trent。我是一个gstreamer的新手。我的目标是将音频和视频流分离,然后使用特定比特率进行编码,最后再进行复用。我该如何修改这个管道以达到这个目的? - Yoganand Anandaraju
所以,从文件中读取,将音频和视频移动到特定的比特率,然后再次混合在一起,对吧? - Benjamin Trent
是的,那正是我想要的,但输出必须是MPEG-TS格式。 - Yoganand Anandaraju
2个回答

4

您想要的一般思路可以在这个管道中找到。主要区别如下:

  1. 由于decodebin具有多个接收端口以链接不同的媒体类型,因此无需使用Tee。
  2. 我首先逻辑处理视频,将其推送到mux,然后是音频。我发现在管道中混合音频和视频元素会使逻辑混乱,而先处理一个再处理另一个则更容易处理。
  3. 我删除了一些项目,如果您真的想添加回来,则可以添加(某些队列设置和过滤器)

    gst-launch-1.0 filesrc location=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 ! \ videoscale add-borders=false ! \ video/x-raw,pixel-aspect-ratio=1/1,width=1280,height=720 ! \ x264enc name=venc0 bitrate=2372 tune=zerolatency ! queue ! mux. dec. ! \ audiosegmentclip name=aclip ! audioconvert ! audio/x-raw, channels=2 ! \ audioresample ! audio/x-raw, rate=48000 ! voaacenc bitrate=128000 ! \ queue ! mp4mux name=mux ! watchdog timeout=5000 ! \ filesink name=sink0 location=out0.mp4


谢谢 Trent。管道已经在工作了。我该如何使用 mpegtsmux 元素来代替 mp4mux 使它能够输出 MPEG-TS 流?我可以使用 mp4,但是当我使用 x264enc 的 key-int-max 属性对 mp4 文件进行分段时,我的分段文件无法播放。但如果我在 MPEG-TS 文件上进行分段,则这些文件是可播放的。 - Yoganand Anandaraju
你可能只需更换元素并添加所需的属性,就可以轻松完成,我相信不会有任何失败的容量协商。 - Benjamin Trent

3
我也曾经在语法方面遇到了困难。gst-launch-1.0手册中写道:
“管道由元素和链接组成。元素可以放入不同类型的容器中。在管道描述中,元素、链接和容器可以按任意顺序指定。”
我之前认为“!”(一种链接)就像bash管道一样,而元素则像生成和接收数据的bash命令,因此必须要有一系列用“!”连接的命令列表。但在gstreamer中,情况并非如此。管道描述是一个包含元素、链接和容器的列表,它们可以按任意顺序出现。以下是我的语法尝试(省略了容器和caps)。请注意,“*”表示可变数量,“/”表示备选项。
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是一个元素
  • NAME=VALUE是一个属性
  • NAME. 或 NAME.PAD 是一个 PAD(注意两种形式后面都有一个点)
  • ! 是一个链接,可以像这样使用:
    • element1 ! element2
    • element1 name=e1 element2 name=e2 e1. ! e2.
    • element1 name=e1 element2 name=e2 e1.src ! e2.sink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接