以人类可读格式打印元素 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
我正在使用简单的 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