希望在rust bindings中得到x264enc的比特率和帧率的人类可读输出,以确认值的变化。
按照例子,看起来比特率是从
bitrate : 比特率(kbitsec) 标志:可读,可写,可在NULL,READY,PAUSED或PLAYING状态下改变。
所以我们首先创建元素并将其添加到管道中,然后将其链接到
let myEnc = gst::ElementFactory::make("x264enc", None)
.map_err(|_| MissingElement("x264enc"))?;
//... do the .link() stuff
现在将速率设置为gint
//... set the rate
let setBitrate = 1500;
let haveSetBr = myEnc.set_property("bitrate",&setBitrate).unwrap();
这就会产生一个错误,告诉我们要改用 guint
,这似乎是 type guint = c_uint; => type c_uint = u32;
于是改成
//... set the rate
let setBitrate:u32 = 1500;
let haveSetBr = myEnc.set_property("bitrate",&setBitrate).unwrap();
无错误报告
//... get the rate
let brNow = myEnc.get_property("bitrate");
println!("the bit rate is set at {:#?}",brNow );
给出一个输出为 enum
the bit rate is set at Ok(
Value(
GString(
Foreign(
0x0000555555aebb00,
4,
),
),
),
)
那么你如何将输出类型改为U32数字?
现在根据gst-inspect-1.0 x264enc设置帧率,能力报告为
> Capabilities:
> video/x-raw
> framerate: [ 0/1, 2147483647/1 ]
> width: [ 16, 2147483647 ]
> height: [ 16, 2147483647 ]
> format: { (string)Y444, (string)Y42B, (string)I420, (string)YV12, (string)NV12, (string)Y444_10LE, (string)I422_10LE,
> (string)I420_10LE }
>
> SRC template: 'src'
> Availability: Always
> Capabilities:
> video/x-h264
> framerate: [ 0/1, 2147483647/1 ]
> width: [ 1, 2147483647 ]
> height: [ 1, 2147483647 ]
> stream-format: { (string)avc, (string)byte-stream }
> alignment: au
> profile: { (string)high-4:4:4, (string)high-4:2:2, (string)high-10, (string)high, (string)main, (string)baseline,
> (string)constrained-baseline, (string)high-4:4:4-intra,
> (string)high-4:2:2-intra, (string)high-10-intra }
如法炮制 glupload.rs
我们加上
let caps = gst::Caps::builder("video/x-raw")
.field("format", &gst_video::VideoFormat::I420.to_str())
.field("framerate", &"25/1")
.build();
myEnc.set_caps(Some(&caps));
但这会产生编译错误
error[E0599]: no method named `set_caps` found for struct `gst::Element` in the current scope
--> examples....
|
| myEnc.set_caps(Some(&caps));
| ^^^^^^^^ method not found in `gst::Element`
例如,我们是否需要在 examples 文件夹或 gstreamersrc 文件夹中链接到另一个脚本?
extern crate gstreamer as gst;
use gst::gst_element_error;
use gst::prelude::*;
use glib::GString;
extern crate gstreamer_video as gst_video;
extern crate gstreamer_app as gst_app;
use std::env;
use anyhow::Error;
use derive_more::{Display, Error};
这里有多个问题。
那么你如何将输出类型改为U32数?
你的应用程序的输出已经告诉你这是一个 glib::Value
因此,第一步将是检查 是文件: 你需要从它身上获得价值,在你的情况下,是通过 value.get::<u32>()
或 value.get_some::<u32>()
.
myEnc.set_caps(Some(&caps));
但这会产生编译错误
你不能只对一个元素设置盖帽,这在概念上是没有意义的,正如编译器告诉你的,也没有这样的功能。如果你想在两个元素的焊盘之间强制执行特定的盖帽,你需要用一个 capsfilter
元素(将其上的大写字母设置为 caps
房产 set_property()
)或使用 element1.link_pads_filtered(Some("src"), &element2, Some("sink"), Some(&caps))
.