Rust Gstreamer编辑服务在设置渲染设置时发生绑定错误
我对gstreamer和rust非常陌生,我正在尝试渲染一个由其他视频片段制作的视频。基于文档、gstreamer的示例以及在python中做同样的事情,我认为我的代码看起来不错,但会抛出错误 这是我的代码:Rust Gstreamer编辑服务在设置渲染设置时发生绑定错误,rust,gstreamer,video-processing,Rust,Gstreamer,Video Processing,我对gstreamer和rust非常陌生,我正在尝试渲染一个由其他视频片段制作的视频。基于文档、gstreamer的示例以及在python中做同样的事情,我认为我的代码看起来不错,但会抛出错误 这是我的代码: use gstreamer as gst; use gstreamer::{ElementExt, ElementExtManual, GstObjectExt}; use gstreamer_editing_services as ges; use gstreamer_editing_s
use gstreamer as gst;
use gstreamer::{ElementExt, ElementExtManual, GstObjectExt};
use gstreamer_editing_services as ges;
use gstreamer_editing_services::{GESPipelineExt, LayerExt, TimelineExt};
use gstreamer_pbutils as gst_pbutils;
use gstreamer_pbutils::{EncodingProfileBuilder};
pub fn clip_video() {
match gst::init() {
Err(e) => eprintln!("{:?}", e),
_ => (),
}
match ges::init() {
Err(e) => eprintln!("{:?}", e),
_ => (),
}
let timeline = ges::Timeline::new_audio_video();
let layer = timeline.append_layer();
let pipeline = ges::Pipeline::new();
match pipeline.set_timeline(&timeline) {
Err(e) => eprintln!("{:?}", e),
_ => (),
}
let video_profile = gst_pbutils::EncodingVideoProfileBuilder::new()
.name("h.264")
.description("h.264-profile")
.format(&gst::caps::Caps::new_simple("video/x-h264", &[]))
.build()
.unwrap();
let audio_profile = gst_pbutils::EncodingAudioProfileBuilder::new()
.name("mp3")
.description("mp3-profile")
.format(&gst::caps::Caps::new_simple(
"audio/mpeg",
&[("mpegversion", &"1"), ("layer", &"3")],
))
.build()
.unwrap();
let contianer_profile = gst_pbutils::EncodingContainerProfileBuilder::new()
.name("default-mp4-profile")
.description("mp4-with-h.264-mp3")
.format(&gst::caps::Caps::new_simple(
"video/quicktime",
&[("variant", &"iso")],
))
.enabled(true)
.add_profile(&video_profile)
.add_profile(&audio_profile)
.build()
.unwrap();
let asset = ges::UriClipAsset::request_sync("file:///home/ryan/repos/auto-highlighter-processing-service/input/test-video.mp4").expect("Failed to create asset");
match layer.add_asset(
&asset,
0 * gst::SECOND,
10 * gst::SECOND,
10 * gst::SECOND,
ges::TrackType::CUSTOM,
) {
Err(e) => eprintln!("{:?}", e),
_ => (),
}
match pipeline.set_render_settings("file:///home/ryan/repos/auto-highlighter-processing-service/output/test-video.mp4", &contianer_profile){
Err(e) => eprintln!("{:?}", e),
_ => (),
}
match pipeline.set_mode(ges::PipelineFlags::RENDER) {
Err(e) => eprintln!("{:?}", e),
_ => (),
}
match pipeline.set_state(gst::State::Playing) {
Err(e) => eprintln!("{:?}", e),
_ => (),
}
let bus = pipeline.get_bus().unwrap();
for msg in bus.iter_timed(gst::CLOCK_TIME_NONE) {
use gst::MessageView;
match msg.view() {
MessageView::Eos(..) => break,
MessageView::Error(err) => {
println!(
"Error from {:?}: {} ({:?})",
err.get_src().map(|s| s.get_path_string()),
err.get_error(),
err.get_debug()
);
break;
}
_ => (),
}
}
}
我得到的错误是:
BoolError { message: "Failed to set render settings", filename: "/home/ryan/.cargo/registry/src/github.com-1ecc6299db9ec823/gstreamer-editing-services-0.16.5/src/auto/pipeline.rs", function: "gstreamer_editing_services::auto::pipeline", line: 228 }
StateChangeError
我正在努力寻找如何处理这些错误,或者问题可能是什么。据我所知,我正在正确使用set_render_settings()和set_mode()函数。我没有尝试运行您的代码,但在阅读时发现的一个问题是
.format(&gst::caps::caps::new\u simple(
“音频/mpeg”,
&[(“mpegversion”和“1”),(“layer”和“3”),
))
caps的“mpegversion”和“layer”字段不是字符串,而是整数。如果你这样使用它们,它应该会工作(或者至少工作得更好)
.format(&gst::caps::caps::new\u simple(
“音频/mpeg”,
&[(“mpegversion”、&1i32)、(“layer”、&3i32)],
))
在我看来,其他一切都是正确的
通过使用GStreamer调试系统,您可以找到有关此类错误的更多详细信息。您可以通过
GST\u DEBUG
环境变量启用该功能,例如,通过将其设置为6
非常感谢您的帮助,这就是阻止我获取任何输出视频的问题。现在我想弄明白为什么输出的视频只有10秒的黑屏。顺便说一句,谢谢你所有的工作对铁锈绑定!我会在GStreamer邮件列表上问这个问题。GES开发人员就在那里,可能会立即告诉您:)我自己并不真正了解GESAPI。