Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在移动中向GStreamer管道添加和删除音频源_Python_Audio_Gstreamer_Mixing - Fatal编程技术网

Python 在移动中向GStreamer管道添加和删除音频源

Python 在移动中向GStreamer管道添加和删除音频源,python,audio,gstreamer,mixing,Python,Audio,Gstreamer,Mixing,我编写了一个小Python脚本,它使用一个Adder插件将两个源流混合在一起 启动程序后,您会听到由audiotestsrc插件生成的1kHz音调。按Enter键时,另一个500Hz测试音连接到加法器,因此您可以同时听到它们。(顺便说一句,我真的不明白为什么我要在这里再次将管道设置为播放状态来收听混音。有没有任何方法可以在不必重新启动管道的情况下插入新的源?) 当您再次按Enter键时,1kHz的音调应该从混音中移除,500Hz的音调应该继续播放,但我再也听不到任何声音。我在调试输出中得到一个p

我编写了一个小Python脚本,它使用一个
Adder
插件将两个源流混合在一起

启动程序后,您会听到由
audiotestsrc
插件生成的1kHz音调。按Enter键时,另一个500Hz测试音连接到加法器,因此您可以同时听到它们。(顺便说一句,我真的不明白为什么我要在这里再次将管道设置为播放状态来收听混音。有没有任何方法可以在不必重新启动管道的情况下插入新的源?)

当您再次按Enter键时,1kHz的音调应该从混音中移除,500Hz的音调应该继续播放,但我再也听不到任何声音。我在调试输出中得到一个
pulse pulsesink.c:528:gst\u pulsering\u stream\u underflow\u cb:get underflow
,作为最后一行。我真的不知道下一步该做什么

以下是完整的源代码:

#!/usr/bin/python
# On-the-go source removal doesn't work this way with GStreamer. Why?

import gobject;
gobject.threads_init()
import gst;

if __name__ == "__main__":
    pipe = gst.Pipeline("mypipe")

    adder = gst.element_factory_make("adder","audiomixer")
    pipe.add(adder)

    buzzer = gst.element_factory_make("audiotestsrc","buzzer")
    buzzer.set_property("freq",1000)
    pipe.add(buzzer)

    pulse = gst.element_factory_make("pulsesink", "pulseaudio_output")
    pipe.add(pulse)

    buzzer.link(adder)
    adder.link(pulse)
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("1kHz test sound. Press <ENTER> to continue.")

    buzzer2=gst.element_factory_make("audiotestsrc","buzzer2")
    buzzer2.set_property("freq",500)

    pipe.add(buzzer2)
    buzzer2.link(adder)
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("1kHz + 500Hz test sound playing simoultenously. Press <ENTER> to continue.")

    buzzer.unlink(adder)
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("Only 500Hz test sound. Press <ENTER> to stop.")
#/usr/bin/python
#对于GStreamer,移动中的源代码删除不能以这种方式工作。为什么?
进口项目;
gobject.threads_init()
进口商品及服务税;
如果名称=“\uuuuu main\uuuuuuuu”:
管道=消费税管道(“mypipe”)
加法器=gst元件工厂制造(“加法器”、“音频混音器”)
管道添加(加法器)
蜂鸣器=gst元件、工厂制造(“音频测试SRC”、“蜂鸣器”)
蜂鸣器。设置_属性(“频率”,1000)
管道。添加(蜂鸣器)
脉冲=gst元件、工厂制造(“脉冲信号”、“脉冲音频输出”)
管道。添加(脉冲)
蜂鸣器连接(加法器)
加法器链路(脉冲)
管道设置状态(gst状态)
原始输入(“1kHz测试声音。按下继续”)
蜂鸣器2=gst元件、工厂制造(“音频测试SRC”、“蜂鸣器2”)
蜂鸣器2.设置_属性(“频率”,500)
管道。添加(蜂鸣器2)
蜂鸣器2.链路(加法器)
管道设置状态(gst状态)
原始输入(“1kHz+500Hz测试声音同时播放。按继续”)
蜂鸣器解除链接(加法器)
管道设置状态(gst状态)
原始输入(“仅500Hz测试声音。按下可停止”)

我自己找到了解决方案。我必须将请求焊盘与加法器一起使用,并使用GStreamer的功能

以下是工作源代码和一些说明:

#!/usr/bin/python

import gobject;
gobject.threads_init()
import gst;

if __name__ == "__main__":
    # First create our pipeline
    pipe = gst.Pipeline("mypipe")

    # Create a software mixer with "Adder"
    adder = gst.element_factory_make("adder","audiomixer")
    pipe.add(adder)

    # Gather a request sink pad on the mixer
    sinkpad1=adder.get_request_pad("sink%d")

    # Create the first buzzer..
    buzzer1 = gst.element_factory_make("audiotestsrc","buzzer1")
    buzzer1.set_property("freq",1000)
    pipe.add(buzzer1)
    # .. and connect it's source pad to the previously gathered request pad
    buzzersrc1=buzzer1.get_pad("src")
    buzzersrc1.link(sinkpad1)

    # Add some output
    output = gst.element_factory_make("autoaudiosink", "audio_out")
    pipe.add(output)
    adder.link(output)

    # Start the playback
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("1kHz test sound. Press <ENTER> to continue.")

    # Get an another request sink pad on the mixer
    sinkpad2=adder.get_request_pad("sink%d")

    # Create an another buzzer and connect it the same way
    buzzer2 = gst.element_factory_make("audiotestsrc","buzzer2")
    buzzer2.set_property("freq",500)
    pipe.add(buzzer2)

    buzzersrc2=buzzer2.get_pad("src")
    buzzersrc2.link(sinkpad2)

    # Start the second buzzer (other ways streaming stops because of starvation)
    buzzer2.set_state(gst.STATE_PLAYING)

    raw_input("1kHz + 500Hz test sound playing simoultenously. Press <ENTER> to continue.")

    # Before removing a source, we must use pad blocking to prevent state changes
    buzzersrc1.set_blocked(True)
    # Stop the first buzzer
    buzzer1.set_state(gst.STATE_NULL)
    # Unlink from the mixer
    buzzersrc1.unlink(sinkpad1)
    # Release the mixers first sink pad
    adder.release_request_pad(sinkpad1)
    # Because here none of the Adder's sink pads block, streaming continues

    raw_input("Only 500Hz test sound. Press <ENTER> to stop.")
#/usr/bin/python
进口项目;
gobject.threads_init()
进口商品及服务税;
如果名称=“\uuuuu main\uuuuuuuu”:
#首先创建我们的管道
管道=消费税管道(“mypipe”)
#使用“加法器”创建软件混合器
加法器=gst元件工厂制造(“加法器”、“音频混音器”)
管道添加(加法器)
#在混音器上收集请求接收器垫
sinkpad1=加法器。获取请求垫(“接收器%d”)
#创建第一个蜂鸣器。。
蜂鸣器1=gst元件、工厂制造(“音频测试SRC”、“蜂鸣器1”)
蜂鸣器1.设置_属性(“频率”,1000)
管道。添加(蜂鸣器1)
# .. 并将其源焊盘连接到先前收集的请求焊盘
蜂鸣器RSRC1=蜂鸣器1.获取键盘(“src”)
蜂鸣器RC1.连杆(沉头板1)
#添加一些输出
输出=gst.元件工厂制造(“自动音频接收器”、“音频输出”)
管道添加(输出)
加法器链接(输出)
#开始播放
管道设置状态(gst状态)
原始输入(“1kHz测试声音。按下继续”)
#在混音器上获取另一个请求接收器垫
sinkpad2=加法器。获取请求垫(“接收器%d”)
#创建另一个蜂鸣器并以相同方式连接
蜂鸣器2=gst元件、工厂制造(“音频测试SRC”、“蜂鸣器2”)
蜂鸣器2.设置_属性(“频率”,500)
管道。添加(蜂鸣器2)
蜂鸣器RSRC2=蜂鸣器2.获取键盘(“src”)
蜂鸣器RC2.连杆(沉头板2)
#启动第二个蜂鸣器(其他方式因饥饿停止)
蜂鸣器2.设置状态(gst.状态播放)
原始输入(“1kHz+500Hz测试声音同时播放。按继续”)
#在删除源之前,我们必须使用pad阻塞来防止状态更改
蜂鸣器RSRC1.设置被阻止(真)
#停止第一个蜂鸣器
蜂鸣器1.设置状态(gst.状态为空)
#从混合器上断开链接
蜂鸣器RSRC1.取消链接(sinkpad1)
#释放混合器的第一个水槽垫
加法器释放请求焊盘(sinkpad1)
#因为这里没有加法器的接收器垫阻塞,所以流继续
原始输入(“仅500Hz测试声音。按下可停止”)

为什么这一行与此处相关?蜂鸣器1的源pad1连接到加法器的sinkpad1。但是这里正在取消与
sinkpad2
的链接。这是错别字吗?是的,我相信是错别字。更正了,但应该有人检查一下。目前我的机器上没有必要的工具。