设置渲染设置时 Gstreamer 编辑服务生锈绑定错误

Gstreamer Editing Service rust bindings error while setting render settings

我对 gstreamer 和 rust 还很陌生,我正在尝试渲染由其他视频片段制作的视频。基于文档、gstreamer-rs 示例和 this question 关于在 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_simple(
            "audio/mpeg",
            &[("mpegversion", &"1"), ("layer", &"3")],
        ))

大写字母的“mpegversion”和“layer”字段不是字符串而是整数。如果你这样使用它们,它应该可以工作(或者至少工作得更好)

        .format(&gst::caps::Caps::new_simple(
            "audio/mpeg",
            &[("mpegversion", &1i32), ("layer", &3i32)],
        ))

我认为其他一切都是正确的。

您可以使用 GStreamer 调试系统找到有关此类错误的更多详细信息。您可以通过 GST_DEBUG 环境变量启用它,例如通过将其设置为 6.