如何解决设置渲染设置时 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 举报,一经查实,本站将立刻删除。