首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印元素GString属性为人类可读的格式

打印元素GString属性为人类可读的格式
EN

Stack Overflow用户
提问于 2021-03-23 22:00:36
回答 2查看 268关注 0票数 0

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

使用此代码:

代码语言:javascript
复制
let stats = appsink.get_property("stats").unwrap();
println!("stats: {:?}", stats);

我得到:

代码语言:javascript
复制
stats: Value(GString(Foreign(0x7f9c008f00, 101)))

因为这不是人类所能读到的,所以我试过:

代码语言:javascript
复制
let stats = appsink.get_property("stats").unwrap().get::<GString>();
println!("stats: {:?}", stats);

但得到了:

代码语言:javascript
复制
stats: Err(GetError { actual: GstStructure, requested: gchararray })

我不知道如何解释输出。

我看过这篇文章:gstreamer rust get human readable output for bitrate set on x264enc,但它没有展示如何接近GString

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-24 19:20:30

我可以使用下面的示例来再现这个示例:

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
Err(GetError { actual: GstVideoTestSrcPattern, requested: gchararray })

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

代码语言:javascript
复制
let val = source.get_property("pattern").unwrap().transform::<String>().unwrap().get::<String>().unwrap().unwrap();

这很难处理,建议对这里返回的值进行更多的错误检查(例如,使用?操作符而不是.unwrap())。

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

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

票数 1
EN

Stack Overflow用户

发布于 2021-04-15 07:34:54

接近晶体管所写的内容,正确的方法是

代码语言:javascript
复制
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并对其进行处理。除其他外,它还提供了一个允许直接打印Debughttps://gstreamer.pages.freedesktop.org/gstreamer-rs/gstreamer/structure/struct.StructureRef.htm,以及访问字段的各种API等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66771923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档