A complete program that can play back a file

This commit is contained in:
Savanni D'Gerinel 2024-08-27 17:12:56 -04:00
parent ee56513299
commit 04a6e607a3
1 changed files with 78 additions and 24 deletions

View File

@ -1,49 +1,103 @@
use gstreamer::prelude::*; use gstreamer::{prelude::*, Element, Pad};
use pipewire::{context::Context, main_loop::MainLoop}; use pipewire::{context::Context, main_loop::MainLoop};
fn main() { fn main() {
gstreamer::init(); gstreamer::init();
// let srcfactory = gstreamer::ElementFactory::find("filesrc").unwrap().load().unwrap(); // let srcfactory = gstreamer::ElementFactory::find("filesrc").unwrap().load().unwrap();
let srcfactory = gstreamer::ElementFactory::find("videotestsrc") let source = gstreamer::ElementFactory::find("filesrc")
.unwrap() .unwrap()
.load() .load()
.unwrap()
.create()
.name("source")
.property(
"location",
"/home/savanni/Music/tavern-music.ogg",
)
// .property(
// "location",
// "/home/savanni/Music/Night at Work _ Instrumental Chill Music Mix [n9Y2Eb4BaSg].m4a",
// )
.build()
.unwrap(); .unwrap();
let sinkfactory = gstreamer::ElementFactory::find("autovideosink") let decoder = gstreamer::ElementFactory::find("decodebin")
.unwrap() .unwrap()
.load() .load()
.unwrap()
.create()
.name("decoder")
.build()
.unwrap(); .unwrap();
let video_effect = gstreamer::ElementFactory::find("vertigotv") let sink = gstreamer::ElementFactory::find("autoaudiosink")
.unwrap() .unwrap()
.load() .load()
.unwrap()
.create()
.name("sink")
.build()
.unwrap();
let convert = gstreamer::ElementFactory::find("audioconvert")
.unwrap()
.load()
.unwrap()
.create()
.name("convert")
.build()
.unwrap();
let resample = gstreamer::ElementFactory::find("audioresample")
.unwrap()
.load()
.unwrap()
.create()
.name("resample")
.build()
.unwrap(); .unwrap();
println!("source factory type: {:?}", srcfactory.element_type());
println!("sink factory type: {:?}", sinkfactory.element_type());
println!("video factory type: {:?}", video_effect.element_type());
let source = srcfactory.create().name("source").build().unwrap();
let sink = sinkfactory.create().name("sink").build().unwrap();
let filter = video_effect.create().name("filter").build().unwrap();
// let source = gstreamer::ElementFactory::make("videotestsrc");
// let sink = gstreamer::ElementFactory::make("autovideosink");
let pipeline = gstreamer::Pipeline::new(); let pipeline = gstreamer::Pipeline::new();
pipeline.add(&source).unwrap(); pipeline.add(&source).unwrap();
pipeline.add(&sink).unwrap(); pipeline.add(&sink).unwrap();
pipeline.add(&filter).unwrap(); pipeline.add(&decoder).unwrap();
source.link(&filter).unwrap(); pipeline.add(&convert).unwrap();
filter.link(&sink).unwrap(); pipeline.add(&resample).unwrap();
source.link(&decoder).unwrap();
convert.link(&resample).unwrap();
resample.link(&sink).unwrap();
decoder.connect_pad_added(move |element, pad| handle_pad_added(element, pad, &convert));
/*
println!("source: {:?}", source);
source.foreach_pad(|_, pad| {
println!("\tpad: {:?} {}, {:?}", pad, pad.name(), pad.direction());
true
});
let source_pad = source.get_pad(pad.name());
source_pad
*/
// source.connect_pad_added(handle_pad_added);
// source.link(&convert).unwrap();
pipeline.set_state(gstreamer::State::Playing).unwrap(); pipeline.set_state(gstreamer::State::Playing).unwrap();
let bus = pipeline.bus().unwrap(); let bus = pipeline.bus().unwrap();
let msg = bus.timed_pop_filtered( // let msg = bus.timed_pop_filtered(
gstreamer::ClockTime::NONE, // gstreamer::ClockTime::NONE,
&[gstreamer::MessageType::Error, gstreamer::MessageType::Eos], // &[gstreamer::MessageType::Error, gstreamer::MessageType::Eos],
); // );
while let Some(msg) = bus.timed_pop(gstreamer::ClockTime::NONE) {
println!("message: {:?}", msg); println!("message: {:?}", msg);
}
pipeline.set_state(gstreamer::State::Null);
pipeline.set_state(gstreamer::State::Null).unwrap();
}
fn handle_pad_added(element: &Element, pad: &Pad, converter: &Element) {
println!("handle_pad_added");
println!("\t{:?}", element);
println!("\t{:?}, {:?}", pad, pad.current_caps());
let converter_pad = converter.static_pad("sink").unwrap();
pad.link(&converter_pad).unwrap();
} }