A complete program that can play back a file
This commit is contained in:
parent
ee56513299
commit
04a6e607a3
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue