将 Gstreamer 的 PadProbeId 初始化为 Rust 中的默认值
Initialize Gstreamer's PadProbeId to a default value in 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
非常感谢您的帮助!
像这样拥有空变量的 Rust 方法是使用 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();
});
}
我熟悉 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
非常感谢您的帮助!
像这样拥有空变量的 Rust 方法是使用 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();
});
}