【问题标题】:vala: manipulating (gstreamer) GLib.Valuevala:操作(gstreamer)GLib.Value
【发布时间】:2013-10-28 04:24:10
【问题描述】:

下面的vala小程序我写过,不知道怎么写 要操作 GLib.Value 类型,请参见下面的代码:

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-level.html

使用消费税; 无效应用程序消息(Gst.Bus 总线,Gst.Message 消息){ var s = msg.get_structure(); 如果(s == null) 返回; 字符串 msgtype = s.get_name(); 如果(msgtype!=“级别”) 返回; GLib.Value rms = s.get_value("rms"); GLib.Value st = s.get_value("stream-time"); //根据这里的文档:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-level.html // "rms" 显然是 "gdouble 的 GValueArray" // 和 // "st" 是一个 GstClockTime,它是一个 "typedef guint64 GstClockTime" // 我想创建两者的字符串表示,例如: // 72374237490234, [0.234234,0,424234234,0.423423423,0.5345345, ...] // 而且我对如何进行转换或类型转换一无所知... } 无效的主要(字符串[] args){ Gst.init(参考参数); 尝试 { var pipeline = Gst.parse_launch( “pulsesrc 设备=\”alsa_input.usb-046d_08c9_674634A4-02-U0x46d0x8c9.analog-mono\“!”+ "级别名称=wavelevel 间隔=10000000 !" + “wavenc!文件接收器位置=audioz.wav” ); var bus = pipeline.get_bus(); bus.add_signal_watch(); bus.message.connect(application_message); // 设置管道状态为 PLAYING pipeline.set_state (State.PLAYING); // 创建并启动 GLib 主循环 新的 MainLoop ().run (); } 捕获(错误 e){ print("%s\n", e.message); } }

更新:

GLib.Value 的文档在这里:http://www.valadoc.org/#!api=gobject-2.0/GLib.Value

调用 strdup_contents() 有点令人满意,但我想在 rms 中操作数组,

printl(rms.type().name()) 告诉我这是一个 GstValueList, 所以我想我应该把它转换成这个: http://www.valadoc.org/#!api=gstreamer-1.0/Gst.ValueList 但 vala 似乎对 Gst.ValueList 类型一无所知...

【问题讨论】:

    标签: gstreamer vala


    【解决方案1】:

    Vala 使使用 GLib.Value 变得非常容易,它会在 GLib.Value 和本机类型之间进行隐式转换。将 GLib.StringBuilder 投入混合以构建您的数组,这样的东西(未经测试)应该可以解决问题:

    GLib.StringBuilder s = new GLib.StringBuilder ();
    
    s.append (((uint64) st).to_string ());
    s.append (",[");
    {
      bool first = true;
      foreach ( unowned GLib.Value value in rms.values ) {
        if (!first) {
          s.append_c (',');
        } else {
          first = false;
        }
        s.append (((double) value).to_string ());
      }
    }
    s.append_c (']');
    

    【讨论】:

    • 谢谢,非常有用的答案。如果您不介意这里还有一个:我如何声明一个 int 局部变量数组,并使用索引访问该值(假设我知道该数组的大小始终为 2,而我只想获得两个 uint64)?
    • “数组”是指标准数组还是 GLib.ValueArray?
    • 真正需要的是通过常量索引提取数组中的值,例如:uint64 x1 = rms.values(0).get_uint64。我真的不在乎它是支持索引访问的数组还是集合类型。
    • 似乎.values不存在,我得到:gstpipe.vala:32.32-32.41: error: The name values' does not exist in the context of GLib.Value' uint64 rms1 = (uint64) rms.values[ 0];
    • values 是 GLib.ValueArray 的成员,但无论错误消息是什么,您都是 GLib.Value,而不是 GLib.ArrayValue。如果你想粘贴一个测试用例,我可以看看。此外,与其在这里提出这样的小问题,不如考虑通过 irc.gnome.org 上的#vala 来解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多