【问题标题】:Gstreamer pipeline grammarGstreamer 管道语法
【发布时间】:2014-08-19 11:25:59
【问题描述】:

我正在使用 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和队列之间

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

在上面的行中有一个名为 vtee(videotee)的 tee,但链接到 audiosegmentclip。这是如何工作的?

tee name=atee vtee. ! queue

在上面的行中有一个名为 atee 的 tee 紧跟在 vtee 之后。这是什么意思?元素后面加句号(.)有什么意义?

任何解释 gstreamer 管道语法的链接都会非常有帮助。

【问题讨论】:

  • 您需要将 bin 链接到队列 @9​​87654325@ 和 tee tee name=vtee ! queue name=aqueue...
  • 这给了我一个不同的错误 GST_PIPELINE 语法。y:616:gst_parse_perform_link: could not link aqueue to aclip
  • 这是有道理的,因为您正在尝试向其发送视频剪辑...
  • 感谢特伦特。我是 gstreamer 的新手。我的目标是拆分音频和视频流,然后用特定的比特率对其进行编码,然后再将其混合。为此,我该如何修改此管道。
  • 那么,从文件中读取,将音频和视频移动到特定的比特率,然后再次将它们混合在一起,对吗?

标签: gstreamer


【解决方案1】:

您想要的总体思路可以在此管道中找到。主要区别在于:

  1. 不需要 Tee,因为 decodebin 有许多水槽垫,可以链接到不同的媒体类型
  2. 我先从逻辑上处理视频,然后将其推送到多路复用器,然后是音频。我发现在管道中将音频和视频元素混合在一起在逻辑上会搞砸我,而且先处理一个然后处理另一个更容易。
  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

【讨论】:

  • 感谢特伦特。管道正在工作。由于我需要 MPEG-TS 流,如何使用 mpegtsmux 元素代替 mp4mux 使其工作。我可以使用 mp4,但是当我使用(x264enc 上的 key-int-max 属性)对 mp4 文件进行分段时,我的分段无法播放。但是当我对 MPEG-TS 文件进行分段时,这些文件是可播放的。
  • 您可能可以直接换出元素并添加所需的属性而不会出现问题。我认为上限谈判不会失败
【解决方案2】:

我也在语法上苦苦挣扎。 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 是一个元素
  • NAME=VALUE 是一个属性
  • 姓名。或 NAME.PAD 是一个垫子(注意两种形式后的 .)
  • !是一个链接,可以像这样使用:
    • 元素1!元素2
    • 元素1 名称=e1 元素2 名称=e2 e1。 ! e2.
    • 元素1 名称=e1 元素2 名称=e2 e1.src ! e2.sink

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多