NLE composition inconsistent duration

Thibault Saunier thibault at saunier.eu
Tue Oct 11 16:58:48 UTC 2022


Hi Rodrigo,


That sounds weird I just tested your program and it just works here,
ooc, what version of Gst are you using?

By the way, you should also commit the composition, emitting the
'commit' signal (but for this simple case it will be done
automatically).

Also, have you checked the GStreamer Editing Services? It is simpler to
use and mighthelp with your use case.

Regards,

- Thibault

On Tue, 2022-10-11 at 11:53 -0300, Rodrigo Santos via gstreamer-devel
wrote:
> Hi,
> 
> I have the following code in Rust that creates a nlecomposition and
> adds to it two nleurisource elements. The duration of both sources is
> set to 10s, and the start of the second source is set to 10s. The
> output is being stored in a file.
> 
> My expectation is that the video file would have a total of 20s of
> duration, but its actual duration is 33s: the first video has a
> duration of 22s while the second video has 11s of duration. Is this a
> bug or am I missing something?
> 
> The weird thing is if I don't change the uri when I create the second
> source (both sources having the same value for the uri property) the
> resulting video file will have 20s of duration as expected (each
> video plays for 10s).
> 
> fn add_to_bin(bin: &Element, element: &Element) {
>     let bin = bin.dynamic_cast_ref::<Bin>().unwrap();
>     bin.add_many(&[element]).unwrap();
> }
> 
> fn create_nle_src (uri: &str, start: u64, inpoint: u64, duration:
> i64, priority: u32) -> Element {
>     let nlesource = ElementFactory::make("nleurisource",
> None).unwrap();
> 
>     nlesource.set_property("uri", uri);
>     nlesource.set_property("start", start);
>     nlesource.set_property("inpoint", inpoint);
>     nlesource.set_property("duration", duration);
>     nlesource.set_property("priority", priority);
> 
>     nlesource
> }
> 
> fn main() {
>     <....>
>     let comp = ElementFactory::make("nlecomposition", Some("test-
> composition")).unwrap();
>     let caps = "video/x-raw(ANY)";
>     let caps = Caps::from_str(caps).expect("Could not create caps
> from str");
>     comp.set_property("caps", caps);
> 
>     let uri = "file:///C:/Users/rodsantos/Downloads/video.mp4"; //big
> buck bunny video
>     let inpoint = ClockTime::from_seconds(0).nseconds();
>     let duration: i64 =
> ClockTime::from_seconds(10).nseconds().try_into().expect("Cast
> failed");
>     let mut start: u64 = 0;
>     let nlesource= create_nle_src(uri, start, inpoint, duration, 1);
> 
>     add_to_bin(&comp, &nlesource);
> 
>     start += duration as u64;
> 
>     let uri = "file:///C:/Users/rodsantos/Downloads/sintel_trailer-
> 480p.webm"; //sintel trailer video
>     let duration: i64 =
> ClockTime::from_seconds(10).nseconds().try_into().expect("Cast
> failed");
>     let nlesource = create_nle_src(uri, start, inpoint, duration, 1);
>     add_to_bin(&comp, &nlesource);
> 
>     comp.emit_by_name::<bool>("commit", &[&true]);
> 
>     let videoconvert = ElementFactory::make("videoconvert",
> None).unwrap();
>     let compositor = ElementFactory::make("compositor",
> None).unwrap();
>     let encoder = ElementFactory::make("x264enc", None).unwrap();
>     let mux = ElementFactory::make("avimux", None).unwrap();
>     let filesink = ElementFactory::make("filesink", None).unwrap();
> 
>     let pipeline = Pipeline::new(None);
>     pipeline.add_many(&[
>         &comp,
>         &videoconvert,
>         &compositor,
>         &encoder,
>         &mux,
>         &filesink,
>     ]).unwrap();
> 
>     Element::link_many(&[
>         &comp,
>         &videoconvert,
>         &compositor,
>         &encoder,
>         &mux,
>         &filesink
>     ]).unwrap();
> 
>     filesink.set_property("location", "test.avi");
> 
>     pipeline.set_state(State::Playing).expect("Could not set pipeline
> to Playing state");
>    
>    <....>
> }
> 
> 
> Rodrigo Santos
> 
> 



More information about the gstreamer-devel mailing list