gstreamer rust get human readable output for bitrate set on x264enc [closed].

问题描述 投票:0回答:1

希望在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};
rust gstreamer
1个回答
1
投票

这里有多个问题。

  1. 那么你如何将输出类型改为U32数?

你的应用程序的输出已经告诉你这是一个 glib::Value因此,第一步将是检查 是文件: 你需要从它身上获得价值,在你的情况下,是通过 value.get::<u32>()value.get_some::<u32>().

  1. myEnc.set_caps(Some(&caps)); 但这会产生编译错误

你不能只对一个元素设置盖帽,这在概念上是没有意义的,正如编译器告诉你的,也没有这样的功能。如果你想在两个元素的焊盘之间强制执行特定的盖帽,你需要用一个 capsfilter 元素(将其上的大写字母设置为 caps 房产 set_property())或使用 element1.link_pads_filtered(Some("src"), &element2, Some("sink"), Some(&caps)).

© www.soinside.com 2019 - 2024. All rights reserved.