Rust Gstreamer编辑服务在设置渲染设置时发生绑定错误

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

我对gstreamer和rust非常陌生,我正在尝试渲染一个由其他视频片段制作的视频。基于文档、gstreamer的示例以及在python中做同样的事情,我认为我的代码看起来不错,但会抛出错误

这是我的代码:

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。