仅向视频管道提供音频时,Gstreamer 管道卡在预滚动状态

Posted

技术标签:

【中文标题】仅向视频管道提供音频时,Gstreamer 管道卡在预滚动状态【英文标题】:Gstreamer pipeline stuck in prerolling state when giving only audio to video pipeline 【发布时间】:2011-12-15 22:50:29 【问题描述】:

如果我有这样的管道:

gst-launch filesrc location="/home/dk/Music/Vangelis - Alpha.mp3" !
decodebin2 name=dec !
queue ! ffmpegcolorspace ! autovideosink dec. !
queue ! audioconvert ! audioresample ! autoaudiosink

如何在输入源中没有视频时播放它,但如果有视频则播放?我得到的只是:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...

【问题讨论】:

【参考方案1】:

您只需将 autovideosink 的 async-handling 属性设置为 true:

... ! autovideosink async-handling=true

这将允许 audiosink 在videosink 等待时播放声音。

【讨论】:

出于某种奇怪的原因,这将 CPU 使用率提高了 40%。为什么会这样,我应该怎么做才能解决这个问题? @DK,不知道,但我会尝试调查为什么会这样 我遇到了 glimagesink 的问题,它非常滞后并导致 audiosink 饿死,我不想使用 T 恤。这成功了!谢谢!【参考方案2】:

它是一种decodebin2的bug

看到我已经测试了一些管道并了解以下内容

管道1:

gst-launch filesrc location="filename" !
decodebin2 name=dec !
queue ! ffmpegcolorspace ! autovideosink dec. !
queue ! audioconvert ! audioresample ! autoaudiosink

此管道1 适用于所有容器格式,如 .mkv、.mp4、ogg

但是当您提供编解码器扩展文件时,它会产生您所说的问题

我已经用 .h264 文件对其进行了测试

管道2:

 gst-launch filesrc location="smal.h264" ! decodebin2 name=dec ! queue !
 autovideosink dec. ! queue ! autoaudiosink

管道3:

 gst-launch filesrc location="smal.aac" ! decodebin2 name=dec ! queue !
 autovideosink dec. ! queue ! autoaudiosink

都有同样的问题,无法提前预加载,也无法显示无效焊盘连接错误

如果您只尝试单个有效的焊盘连接,那么它们可以正常工作

管道4:

 gst-launch filesrc location="smal.h264" ! decodebin2 ! autovideosink 

管道5:

 gst-launch filesrc location="smal.aac" ! decodebin2 ! autoaudiosink

管道 4 和 5 工作正常

甚至

gst-launch filesrc location="/home/dk/Music/Vangelis - Alpha.mp3" !
decodebin2 ! audioconvert ! audioresample ! autoaudiosink

这也可以正常工作....

现在要更多地了解这个错误并修复它,我们需要研究和更改 decodebin2 源代码......>!!!!

【讨论】:

以上是关于仅向视频管道提供音频时,Gstreamer 管道卡在预滚动状态的主要内容,如果未能解决你的问题,请参考以下文章

gstreamer 仅播放视频

随时随地在 GStreamer 管道中添加和删除音频源

如何在 gstreamer 中混合音频和视频

如何在gstreamer中录制音频和视频

Gstreamer Appsink 未从管道获取数据

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