我需要一个 gstreamer 音频接收器,它输出表示音频流音量级别的整数。采样率不必与传入的音频流相同,它可以低得多,例如:每秒一个值就足够了。
这样的水槽存在吗?
似乎可以修改这个来做到这一点:
但是,如果某些东西已经存在,我宁愿避免写一个!
我需要一个 gstreamer 音频接收器,它输出表示音频流音量级别的整数。采样率不必与传入的音频流相同,它可以低得多,例如:每秒一个值就足够了。
这样的水槽存在吗?
似乎可以修改这个来做到这一点:
但是,如果某些东西已经存在,我宁愿避免写一个!
确实有这样一个元素,虽然它不是一个接收器,但我认为你不需要它来完成这项任务:)
它被称为级别(http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-level.html),你可以看到有一个可以调整的“间隔”属性。
我们在视频编辑器中使用这个元素来绘制波形,这里采用这个简化的脚本:
from gi.repository import Gst
from gi.repository import GLib
import sys
mainloop = GLib.MainLoop()
def _messageCb(bus, message):
if str(type(message.src)) == "<class '__main__.__main__.GstLevel'>":
s = message.get_structure()
p = None
if s:
p = s.get_value("rms")
if p:
st = s.get_value("stream-time")
print "rms = " + str(p) + "; stream-time = " + str(st)
if message.type == Gst.MessageType.EOS:
mainloop.quit()
elif message.type == Gst.MessageType.ERROR:
bus.disconnect_by_func(_messageCb)
mainloop.quit()
if __name__=="__main__":
global mainloop
Gst.init([])
pipeline = Gst.parse_launch("uridecodebin name=decode uri=" + sys.argv[1] + " ! audioconvert ! level name=wavelevel interval=10000000 post-messages=true ! fakesink qos=false name=faked")
faked = pipeline.get_by_name("faked")
bus = pipeline.get_bus()
bus.add_signal_watch()
bus.connect("message", _messageCb)
pipeline.set_state(Gst.State.PLAYING)
mainloop.run()
pipeline.set_state(Gst.State.NULL)
我可以询问您的用例吗?