【问题标题】:Gstreamer pipeline to concat two media containers (video and audio streams)Gstreamer 管道连接两个媒体容器(视频和音频流)
【发布时间】:2016-09-20 11:11:16
【问题描述】:

我是 gstreamer 的初学者,正在努力使用 Gstreamer 1.0 的管道来无缝连接两个 MP4 媒体容器,它们都带有视频和音频流。 在我看来,使用“concat”元素是最方便的方法,我可以连接任一视频流:

gst-launch-1.0 concat name=c ! autovideosink  filesrc location=1.mp4 ! decodebin ! videoconvert ! c.  filesrc location=2.mp4 ! decodebin ! videoconvert ! c.

或音频流:

gst-launch-1.0 concat name=c ! autoaudiosink  filesrc location=1.mp4 ! decodebin ! audioconvert ! c.  filesrc location=2.mp4 ! decodebin ! audioconvert ! c.

但到目前为止,创建一个将两个容器与视频和音频连接起来的管道还没有运气。

this article 我意识到streamsynchronizer 是必需的,所以有人可以帮忙提供示例管道以显示它的外观吗?

【问题讨论】:

  • “到目前为止没有运气”是什么意思?这个管道对我有用,我可以连续播放两个 mp4 视频:gst-launch-1.0 concat name=c ! videoconvert ! videoscale ! autovideosink filesrc location=video1.mp4 ! decodebin ! c. filesrc location=video2.mp4 ! decodebin ! c.
  • @EzequielGarcia 是的,它可以工作.. 但他也需要在同一管道中有音频:)

标签: video concatenation gstreamer


【解决方案1】:

好的,我想出了这个,但有时 alsa 说流不处于正确的状态..

GST_DEBUG=3 gst-launch-1.0 concat name=c2 ! videoconvert ! videorate ! autovideosink concat name=c ! audioconvert ! audiorate ! alsasink filesrc location=big.mp4 ! decodebin name=d1 ! audio/x-raw ! queue ! c. filesrc location=big2.mp4 ! decodebin name=d2 ! audio/x-raw ! queue ! c. d1. ! video/x-raw ! queue ! c2. d2. ! video/x-raw ! queue ! c2.

管道的小信息:

1,您不必使用 audioconvert/videoconvert 来识别来自 decodebin 的流类型 - 您可以安全地分别使用 audio/x-rawvideo/x-raw.. 解码后音频/视频始终为原始格式。

2,使用 2 个 concat 元素,因为一个元素一次只能处理一个流.. 但是如果您使用两个 concat,您可能会担心音频/视频不同步.. 我希望它是同步的,因为它们都生活在同一个管道中它有一个时钟提供者,所以理论上应该没问题。当你需要适当的同步时,将所有东西放在一个管道中总是很重要的。

3,我使用了 alsasink,但您可以使用适合您的任何接收器.. 有时 autoaudiosink 为我选择了我不太喜欢的脉冲接收器.. 我喜欢使用这种音频管道末端:audioconvert ! audiorate ! alsasink

4,我已经看到了这些错误,但是在添加队列后它就消失了.. 但它们可能会出现在你面前,我不知道..

0:00:00.053972316 11839 0x7f0274003b70 WARN           audiobasesink gstaudiobasesink.c:1139:gst_audio_base_sink_wait_event:<alsasink0> error: Sink not negotiated before eos event.
ERROR: from element /GstPipeline:pipeline0/GstAlsaSink:alsasink0: The stream is in the wrong format.
Additional debug info:
gstaudiobasesink.c(1139): gst_audio_base_sink_wait_event (): /GstPipeline:pipeline0/GstAlsaSink:alsasink0:
Sink not negotiated before eos event.
ERROR: pipeline doesn't want to preroll.

【讨论】:

  • 非常感谢!有用!您能否还举一个管道示例,它将输出复用到 mp4 并写入文件接收器?
  • hmm.. 也许你真的需要流同步器,我还没有阅读整个问题.. 到 mp4 muxing - 你需要重新编码音频/视频并使用 mp4mux 并使用 avenc_eac3 和 x264enc 重新编码..要么更新问题,要么创建一个新问题(并发表你所做的评论......)
  • 管道语法对我来说是一个黑魔法 - 又玩了几个小时,显然我的知识不足以自己解决它,因此发布the next question
  • @KanstantinKachanouski 是的,我确切地知道你的感受.. 但是一旦你喘不过气来,你会产生几兆字节的 gst-launch 代码;DI 将检查新问题.. 如果你问新问题很好它与原来的完全不同
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多