以人类可读格式打印元素 GString 属性

Print Element GString Property in Human Readable format

我正在使用简单的 gstreamer 管道编写 rust 应用程序。我想以人类可读的格式打印 appsink 元素的统计数据 属性。

使用此代码:

let stats = appsink.get_property("stats").unwrap();
println!("stats: {:?}", stats);

我得到:

stats: Value(GString(Foreign(0x7f9c008f00, 101)))

由于这不是人类可读的,我试过:

let stats = appsink.get_property("stats").unwrap().get::<GString>();
println!("stats: {:?}", stats);

但得到了:

stats: Err(GetError { actual: GstStructure, requested: gchararray })

我不确定如何解释输出。


我看过这个 post: 但它没有说明如何处理 GString

我能够使用以下示例重现此内容:

use gstreamer::prelude::*;

fn main() {
    gstreamer::init().unwrap();
    let source = gstreamer::ElementFactory::make("videotestsrc", Some("source")).expect("Could not create source element.");
    let val = source.get_property("pattern").unwrap();
    println!("{:?}", val);
}

这将尝试获取通用 VideoTestSrc 元素上的 pattern 属性,并将打印出字符串地址而不是实际字符串。将 .get::<GString>() 添加到 let val 语句将产生运行时错误:

Err(GetError { actual: GstVideoTestSrcPattern, requested: gchararray })

这告诉我们它试图转换为 gchararray 但 属性 的实际数据类型是自定义类型 GstVideoTestSrcPattern,它不是字符串。在您的示例中,属性 值的类型为 GstStructure。可能可以使用 .get::<GstVideoTestSrcPattern>() 来获取 pattern 属性 的值并这样操作它,但是由于我们在这里需要一个字符串,所以还有另一种方法使用 .transform()在 glib::Value:

上定义的方法
let val = source.get_property("pattern").unwrap().transform::<String>().unwrap().get::<String>().unwrap().unwrap();

这相当笨拙,建议对此处返回的值进行更多的错误检查(例如使用 ? 运算符而不是 .unwrap()s)。

.transform::<String>() 调用将尝试为我们提供 属性 值的字符串表示形式,但它为我们提供了一个 Option<Value>,我们必须将其解包并转换为实际值String using .get::<String>(),这给了我们一个 Result<Option<String>, GetError>(内部选项是因为字符串可能为 NULL)。展开这些值给我们一个可打印的字符串。

可能有更简单的方法,但这至少给了你结果。这里有更多关于如何处理 glib 值类型的文档:https://gstreamer.pages.freedesktop.org/gstreamer-rs/glib/value/struct.Value.html 但不幸的是,它不是很容易阅读并且没有示例。可以从 gstreamer 教程的 rust 端口收集更多信息:https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/tree/master/tutorials

接近晶体管写的,正确的做法是

let stats = appsink.get_property("stats").unwrap();
println!("stats: {:?}", stats.get::<gst::Structure>().expect("not a structure").expect("structure was None"));

您不必将 glib::Value 转换为 String,但您可以直接从 glib::Value 获得 gst::Structure 并对其进行处理。它提供了一个 Debug 实现,允许直接打印它,以及各种 API 用于访问字段等。参见 https://gstreamer.pages.freedesktop.org/gstreamer-rs/gstreamer/structure/struct.StructureRef.htm