Gstreamer画中画 - 两个文件并行播放

Posted

技术标签:

【中文标题】Gstreamer画中画 - 两个文件并行播放【英文标题】:Gstreamer picture-in-picture - two files playing in parallel 【发布时间】:2016-09-28 09:42:45 【问题描述】:

我需要为“画中画”效果编写一个管道来组合来自两个文件的媒体:

1) 第一个文件中的视频内容显示在整个窗口中 2)第二个文件的视频被调整大小并显示在窗口的左上角, 3)来自两个文件的音频混合 4) 两个文件的内容应该同时播放

到目前为止,我得到了以下管道:

gst-launch-1.0 -e \
  filesrc name="src0" location=$FILE0 \
    ! decodebin name="decodebin0" ! queue ! videoscale ! capsfilter caps="video/x-raw,width=120" ! videoconvert ! videomixer.sink_0  decodebin0. ! queue ! audioconvert ! audiomixer.sink_0 \
  filesrc name="src1" location=$FILE1 \
    ! decodebin name="decodebin1" ! queue ! videoscale ! capsfilter caps="video/x-raw" ! videoconvert ! videomixer.sink_1  decodebin1. ! queue ! audioconvert ! audiomixer.sink_1 \
   videomixer name="videomixer" ! autovideosink \
   audiomixer name="audiomixer" ! autoaudiosink

但是,它会逐个播放流,而不是并行播放。有谁知道这里应该改变什么才能同时播放流?

Ps:附上可视化的管道图:

【问题讨论】:

【参考方案1】:

令人惊讶的是 - 管道中源的顺序确实很重要 - 在稍微修改管道并将具有“更大”框架的源放在第一位之后,我能够得到预期的结果:

gst-launch-1.0 -ev \
  filesrc name="src1" location=$FILE1 \
   ! decodebin name="decodebin1" ! queue ! videoscale ! capsfilter caps="video/x-raw,framerate=15/1" ! videoconvert ! videomixer.sink_1  decodebin1. ! queue ! audioconvert name="ac1" \
  filesrc name="src0" location=$FILE0 \
   ! decodebin name="decodebin0" ! queue ! videoscale ! capsfilter caps="video/x-raw,width=120,framerate=15/1" ! videoconvert ! videomixer.sink_0  decodebin0. ! queue ! audioconvert name="ac0"\
   ac0. ! audiomixer.sink_0 \
   ac1. ! audiomixer.sink_1 \
  videomixer name="videomixer" ! autovideosink \
  audiomixer name="audiomixer" ! autoaudiosink \

【讨论】:

以上是关于Gstreamer画中画 - 两个文件并行播放的主要内容,如果未能解决你的问题,请参考以下文章

potplayer如何实现两个视频同时在一个窗口播放

如何在 Windows 上使用 gstreamer 播放 .wav 音频文件?

gstreamer 仅播放视频

即使录制意外中断(例如电源断开),如何在 gstreamer 中录制可播放的视频文件?

使用 GStreamer 播放保存在数组中的原始 PCM

画中画和全屏 - API 只能由用户手势启动