微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我对 gstreamer 和 rust 非常陌生,我正在尝试渲染由其他视频部分制作的视频。基于文档、gstreamer-rs 示例和 this question 关于在 python 中做同样的事情,我认为我的代码看起来不错,但会引发错误

这是我的代码

git push

我得到的错误

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!("{:?}",}

    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!("{:?}",}

    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,ges::TrackType::CUSTOM,) {
        Err(e) => eprintln!("{:?}",}

    match pipeline.set_render_settings("file:///home/ryan/repos/auto-Highlighter-processing-service/output/test-video.mp4",&contianer_profile){
        Err(e) => eprintln!("{:?}",}

    match pipeline.set_mode(ges::PipelineFlags::RENDER) {
        Err(e) => eprintln!("{:?}",}

    match pipeline.set_state(gst::State::Playing) {
        Err(e) => eprintln!("{:?}",}

    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;
            }
            _ => (),}
    }
}

我正在努力寻找如何处理这些错误或可能是什么问题。据我所知,我正在正确使用 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",&1i32),&3i32)],))

其他一切在我看来都是正确的。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。