使用 Gstreamer 管道几秒钟后,麦克风停止向扬声器发送语音

Microphone stops sending voice at speakers after couple of seconds of using a Gstreamer pipeline

我一直在尝试创建一条从我的 Raspberry Pi 麦克风(USB 耳机)到我的声卡的“通信线路”,以便脚本通过管道将我在麦克风上说的任何话发送到我的扬声器.

Problem:

When i run the script below, the mic works and sends voice at my speakers for a couple of seconds. After that it stops repeating what i am saying.

我的代码如下所示:

#!/usr/bin/env python
import gi
import os

gi.require_version('Gst', '1.0')
gi.require_version('Gtk', '3.0')
from gi.repository import GObject, Gst, Gtk, GLib
#GObject.threads_init()
Gst.init(None)
loop =  GLib.MainLoop ()


pipeline = Gst.parse_launch("autoaudiosrc ! audioconvert ! tee name=source ! queue ! vorbisenc ! oggmux ! filesink location=file.ogg source. ! queue ! audioconvert ! alsasink")

#autoaudiosrc = Gst.ElementFactory.make("autoaudiosrc", "autoaudiosrc")
#audioconvert = Gst.ElementFactory.make("audioconvert", "audioconvert")
#vorbisenc = Gst.ElementFactory.make("vorbisenc", "vorbisenc")
#oggmux = Gst.ElementFactory.make("oggmux", "oggmux")
#filesink = Gst.ElementFactory.make("filesink", "filesink")
#url = "1.ogg"
#filesink.set_property("location",url)
#pipeline.add( autoaudiosrc)
#pipeline.add( audioconvert)
#pipeline.add( vorbisenc)
#pipeline.add( oggmux)
#pipeline.add( filesink)



#autoaudiosrc.link( audioconvert)
#audioconvert.link( vorbisenc)
#vorbisenc.link( oggmux)
#oggmux.link( filesink)


pipeline.set_state(Gst.State.PLAYING)
loop.run()  
pipeline.set_state(Gst.State.NULL)

Gtk.main()

在项目开始时,我尝试用不同的方式创建管道(这就是为什么我在代码中留下注释以便您检查我的思维过程),直到我找到了我的代码在这里工作 Simple microphone to speakers implementation 所以我尝试将它应用到我的项目中。

在调试时,我的第一个想法是管道可能会在一段时间后关闭,但我所做的一些测试暗示情况并非如此。

请记住,我对 GStreamer 比较陌生(使用它还不到 3 天) 所以我可能会犯一些愚蠢的错误。

如果你有时间,请向我解释问题的解决方案(如果你能发现的话)。

提前致谢。

**编辑 1:就在今天,我在另一个 raspberry Pi 上执行了代码,我看到每次执行代码时都会正常创建一个文件来记录我的输入,无论我是否将其打开 10 或30 秒(所以记录器端的代码是好的)。可能需要修复的是播放所创建文件的“播放”代码。

我在之前安装的 Raspberry 上尝试了相同的代码 Ubuntu 20. 正如预期的那样,脚本运行良好。因此,总而言之,这是一个 Raspberry Pi OS 问题,而不是代码错误。此管道的最简单形式也可以通过以下方式实现:

pipeline = Gst.parse_launch("autoadiosrc ! pulsesink")