我正在用一个简单的gstreamer管道编写一个rust应用程序。我想以人类可读的格式打印appsink元素的stats属性。
使用此代码:
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 })我不知道如何解释输出。
我看过这篇文章:gstreamer rust get human readable output for bitrate set on x264enc,但它没有展示如何接近GString。
发布于 2021-03-24 19:20:30
我可以使用下面的示例来再现这个示例:
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语句将产生一个运行时错误:
Err(GetError { actual: GstVideoTestSrcPattern, requested: gchararray })它告诉我们,它试图转换为gchararray,但是属性的实际数据类型是自定义类型GstVideoTestSrcPattern,它不是字符串。在您的示例中,属性值的类型为GstStructure。也许可以使用.get::<GstVideoTestSrcPattern>()获取pattern属性的值并对其进行操作,但是由于这里需要一个字符串,还有一种方法是使用在glib上定义的.transform()方法::value::Value:
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。
发布于 2021-04-15 07:34:54
接近晶体管所写的内容,正确的方法是
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的https://gstreamer.pages.freedesktop.org/gstreamer-rs/gstreamer/structure/struct.StructureRef.htm,以及访问字段的各种API等。
https://stackoverflow.com/questions/66771923
复制相似问题