gstreamer:audiosink输出表示音量级别的整数流

时间:2013-10-18 16:43:22

标签: gstreamer

我需要一个输出整数的gstreamer音频接收器 表示音频流的音量级别。采样率 不需要与传入的音频流相同,它可以很多 更低,例如:每秒一个值就足够了。

这样的水槽是否存在?

似乎可以修改这个来执行此操作:

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-volume.html

但如果已经存在某些东西,我宁愿避免写一个!

1 个答案:

答案 0 :(得分:6)

确实有这样一个元素,但它不是一个接收器,但我不认为你需要它来完成那个任务:)

它被称为级别(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)

我可以询问你的用例吗?