将 Gstreamer 的 PadProbeId 初始化为 Rust 中的默认值

古鲁戈文丹

我对 Gstreamer 很熟悉,但对 Rust 很陌生,

TLDR;我希望能够在使用之前将 PadProbeId 初始化为默认值。

细节:

我有一个 Bin(包含音频 + 视频编码器和 hlssink)。

我已经能够将这个 bin 添加到管道中并且它工作正常。

我遇到的问题是流的音频是可选的,我只想add_probe()在音频可用时才这样做。以下是我尝试实现的简化版本

        let mut audio_probe_id: PadProbeId;
        let mut tee_audio_pad: Pad;
        if media_info.audio_available {
            // get encoded audio from the tee
            tee_audio_pad = audio_tee.request_pad_simple("src_%u").unwrap();
            audio_probe_id = tee_audio_pad.add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {
                gst::PadProbeReturn::Ok
            }).unwrap();
            // link the audio_tee.src to enc_bin ghost pad
            let audio_sink_pad = enc_bin.static_pad("audio").unwrap();
            tee_audio_pad.link(&audio_sink_pad).unwrap();
        }

        enc_bin.call_async(move |bin| {
            bin.sync_state_with_parent().unwrap();
            if media_info.audio_available {
                tee_audio_pad.remove_probe(audio_probe_id);
            }
        }

然而,由于 Rust 编译器限制使用未初始化的变量,它不允许我audio_probe_id在没有初始化的情况下使用。

我试图像这样初始化它;let mut audio_probe_id: PadProbeId = PadProbeId(NonZeroU64(u64::MAX));. 但是编译器抱怨它是一个私有字段。

error[E0423]: cannot initialize a tuple struct which contains private fields

非常感谢你的帮助!

像这样拥有空变量的生锈方法是使用Option,但在您的情况下,使用单个条件会更简单:

    if media_info.audio_available {
        // get encoded audio from the tee
        let tee_audio_pad = audio_tee.request_pad_simple("src_%u").unwrap();
        let audio_probe_id = tee_audio_pad.add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {
            gst::PadProbeReturn::Ok
        }).unwrap();
        // link the audio_tee.src to enc_bin ghost pad
        let audio_sink_pad = enc_bin.static_pad("audio").unwrap();
        tee_audio_pad.link(&audio_sink_pad).unwrap();

        enc_bin.call_async(move |bin| {
            bin.sync_state_with_parent().unwrap();
            tee_audio_pad.remove_probe(audio_probe_id);
        }
    } else {
        enc_bin.call_async(move |bin| {
            bin.sync_state_with_parent().unwrap();
        });
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将String的值初始化为函数

如何将数组部分初始化为某个默认值?

如何将结构变量初始化为默认值?

将一类的默认值初始化为另一C ++

即使我们有构造函数,如何将变量初始化为默认值

有没有办法在不知道 C 中的类型的情况下将变量初始化为默认值?

如何将列表/映射初始化为默认参数?

初始化数组中的几个特定值,将rest设置为默认值

将强类型的var值初始化为null

将变量初始化为返回值的函数

将WeakReference初始化为空值可以吗?

如何将空值初始化为datetime变量?

VHDL将变量初始化为多个值

将指针数组初始化为结构体中的NULL

将C中的结构初始化为空还是零?

将地图初始化为Go结构中的字段

将方法调用中的int []初始化为参数

在循环内将列表初始化为字典中的变量

将字符数组初始化为C ++中的NULL

使用对象初始化程序将值初始化为类的类型列表的公共变量

首次将值初始化为整数数组后无法重新初始化

将字节数组初始化为某个值,而不是默认的null吗?

将部分填充的模型传递给“创建”页面,而无需将其他属性初始化为默认值

Python将多个变量初始化为相同的初始值

Java中的直接缓冲区是否已初始化为数组之类的默认值?

将大型二维数组初始化为 C++ 中的所有值

如何使用Typescript将类中的变量初始化为其通用值

如何将Javascript中的变量初始化为INFINITE值?

将char数组初始化为字符串值,未初始化的索引是否设置为null?