Skip to content

Instantly share code, notes, and snippets.

@fayalalebrun
Last active February 23, 2022 12:01
Show Gist options
  • Save fayalalebrun/6bb57cb6f3d730ec7d359cff69d5adcf to your computer and use it in GitHub Desktop.
Save fayalalebrun/6bb57cb6f3d730ec7d359cff69d5adcf to your computer and use it in GitHub Desktop.
use std::time::Duration;
use gstreamer::{
prelude::*, ClockTime, EventType, PadProbeData, PadProbeReturn, PadProbeType, Pipeline,
};
use gstreamer_video::ForceKeyUnitEvent;
fn main() -> anyhow::Result<()> {
let glib_main = glib::MainLoop::new(None, false);
let filename = std::env::args().nth(1).unwrap();
println!("\n{}", filename);
gstreamer::init()?;
let playbin = gstreamer::ElementFactory::make("playbin", None)?;
playbin.set_property_from_str("flags", "video");
let bin = gstreamer::Bin::new(Some("bin"));
let videoconvert = gstreamer::ElementFactory::make("videoconvert", None)?;
let scenechange = gstreamer::ElementFactory::make("scenechange", None)?;
scenechange
.static_pad("src")
.unwrap()
.add_probe(PadProbeType::EVENT_DOWNSTREAM, {
let glib_main = glib_main.clone();
move |_, info| {
match &info.data {
Some(PadProbeData::Event(event)) if event.type_() == EventType::Eos => {
glib_main.quit();
}
Some(PadProbeData::Event(event)) if ForceKeyUnitEvent::is(event) => {
let event = ForceKeyUnitEvent::parse(event).unwrap();
match event {
ForceKeyUnitEvent::Downstream(event) => println!(
"{:02}:{:02}",
event.timestamp.unwrap().minutes(),
event.timestamp.unwrap().seconds() % 60
),
_ => {}
}
}
_ => {}
}
PadProbeReturn::Ok
}
});
let sink = gstreamer::ElementFactory::make("fakesink", None)?;
let elements = &[&videoconvert, &scenechange, &sink];
bin.add_many(elements)?;
gstreamer::Element::link_many(elements)?;
let pad = bin
.find_unlinked_pad(gstreamer::PadDirection::Sink)
.unwrap();
let ghost_pad = gstreamer::GhostPad::with_target(Some("sink"), &pad)?;
bin.add_pad(&ghost_pad)?;
playbin.set_property("video-sink", &bin).unwrap();
let playbin: Pipeline = playbin.downcast().unwrap();
playbin.set_state(gstreamer::State::Null)?;
playbin.set_property("uri", filename)?;
playbin.set_state(gstreamer::State::Playing)?;
glib_main.run();
Ok(())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment