gpt4 book ai didi

python - 在 Python 中捕获输出音频频谱

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:52 25 4
gpt4 key购买 nike

挑战

捕获输出音频的频谱。

第一次尝试

import gtk, gst

def playerbin_message(bus, message):
if message.type == gst.MESSAGE_ELEMENT:
struct = message.structure
if struct.get_name() == 'spectrum':
print struct['magnitude']
pipeline = gst.parse_launch(
'pulsesrc device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" ! spectrum ! fakesink')
bus = pipeline.get_bus()
bus.add_signal_watch()
bus.connect('message', playerbin_message)
pipeline.set_state(gst.STATE_PLAYING)
gtk.main()

哪里失败了?

出于某种原因,该脚本仅有时有效。通常它不会打印任何内容。

@otopolsky 在详细模式下发现记录以下行:

INFO spectrum gstspectrum.c:1051:gst_spectrum_transform_ip:<spectrum0> interval 0:00:00.100000000, fpi 4410, error 0:00:00.000000000

第二次尝试

正如 @otopolsky 所建议的,我尝试运行:

GST_DEBUG=4,spectrum:7 gst-launch-0.10 pulsesrc device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" ! spectrum ! fakesink > out.log

并得到this output .

卡住了:

gst-launch-0.10 -v -m pulsesrc device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" ! spectrum ! fakesink

虽然这有效:

gst-launch-1.0 -v -m pulsesrc device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" ! spectrum ! fakesink

(仅更改了版本)。

第三次尝试

移至Python gi:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst

GObject.threads_init()
Gst.init(None)

def handler(bus, msg):
if msg.type == Gst.MessageType.ELEMENT:
struct = msg.get_structure()
print struct.get_value('magnitude')

p = Gst.parse_launch(
'pulsesrc device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" ! spectrum ! fakesink')

bus = p.get_bus()
bus.add_signal_watch()
bus.connect('message', handler)
p.set_state(Gst.State.PLAYING)

ctx = GObject.main_context_default()
while ctx:
ctx.iteration()

哪里失败了?

TypeError: unknown type GstValueList

问题

  • 如何修复脚本以使其在每次执行时都能正常工作?
  • 还有其他方法可以使用 Python 捕获输出频谱吗?

最佳答案

您正在使用 0.10.36 .. 相当旧了.. 您不能使用较新的 gstreamer,比如 1.2 吗?

你正在运行 Ubuntu,所以这应该不是问题。0.10.x 和 1.2 可以轻松地共存。我不知道你的 python 绑定(bind)是否可以。

这可能是有问题的行(来自您的粘贴箱,请将该部分添加到您的问题中..)

INFO spectrum gstspectrum.c:1051:gst_spectrum_transform_ip:<spectrum0> interval 0:00:00.100000000, fpi 4410, error 0:00:00.000000000

这是来源code ..它说明了有关舍入误差和未初始化 FFT 的信息:

/* If we don't have a FFT context yet (or it was reset due to parameter * changes) get one and allocate memory for everything
*/

/* number of sample frames we process before posting a message * interval is in ns */

/* rounding error for frames_per_interval in ns, * aggregated it in accumulated_error */

您可以再次运行以获取更多详细信息:

export GST_DEBUG=4,spectrum:7

你能在 gst-launch 中运行管道吗?

GST_DEBUG=4,spectrum:7 gst-launch-0.10 pulsesrc device="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" ! spectrum ! fakesink

更新:

如果您听到它,请尝试使用 alsasrc..(autoaudiosink 或 alsasink):

gst-launch-1.0 alsasrc device=hw:0,2 ! spectrum ! autoaudiosink

hw:X,Y格式说明:X = card number, Y = device name

arecord -l 获取用于麦克风等输入设备..

aplay -l对于输出设备..

> arecord -l | grep card
card 0: PCH [HDA Intel PCH], device 0: ALC887-VD Analog [ALC887-VD Analog]
card 0: PCH [HDA Intel PCH], device 2: ALC887-VD Alt Analog [ALC887-VD Alt Analog]

关于python - 在 Python 中捕获输出音频频谱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com