목표
저번엔 Playbin을 통헤 자동으로 파이프라인을 구성해 보았습니다
이번엔 각각 element들을 이용해서 파이프라인을 구성하는 방법을 이용해보겠습니다
이번 예제의 목표는 다음과 같습니다
- gstreamer의 Element 및 생성 방법
- Element를 연결하는 방법
- bus를 통해 오류를 받아 메세지로 출력하는 방법
코드
use gst::prelude::*; fn main() { // Initialize GStreamer gst::init().unwrap(); // Create the elements let source = gst::ElementFactory::make("videotestsrc", Some("source")) .expect("Could not create source element."); source.set_property_from_str("pattern", "smpte"); let sink = gst::ElementFactory::make("autovideosink", Some("sink")) .expect("Could not create sink element"); // Create the empty pipeline let pipeline = gst::Pipeline::new(Some("test-pipeline")); // Build the pipeline pipeline.add_many(&[&source, &sink]).unwrap(); source.link(&sink).expect("Elements could not be linked."); // Start playing pipeline .set_state(gst::State::Playing) .expect("Unable to set the pipeline to the `Playing` state"); // Wait until error or EOS let bus = pipeline.bus().unwrap(); for msg in bus.iter_timed(gst::ClockTime::NONE) { use gst::MessageView; match msg.view() { MessageView::Error(err) => { eprintln!( "Error received from element {:?}: {}", err.src().map(|s| s.path_string()), err.error() ); eprintln!("Debugging information: {:?}", err.debug()); break; } MessageView::Eos(..) => break, _ => (), } } pipeline .set_state(gst::State::Null) .expect("Unable to set the pipeline to the `Null` state"); }
Element
element는 gstreamer의 기본 구성 단위 입니다
element를 통과하여 src pad에서 sink pad로 스트림을 흐르게 하여 데이터를 처리합니다
생성 방법
let source = gst::ElementFactory::make("videotestsrc", Some("source")) .expect("Could not create source element.");
다음과 같이
ElementFactory
구조체를 이용하여 Element를 생성합니다videotestsrc
는 element의 종류를 이야기합니다Some(”source”)
는 element의 이름을 지정해 줍니다이름을 지정해 주는 이유는 해당 element에 대한 변수에 대한 value를 저장하지 않고 있어도
이름을 통해 element를 찾을 때 사용할 수 있기 때문에 지정하여 줍니다
이름을 추가하지 않더라도
videotestsrc0, videotestsrc1 ...
처럼 이름이 생성이 되기도 합니다
편의에 맞추어 사용해주세요예제 파이프라인
vedeotestsrc
는 테스트 비디오를 생성하는 src element입니다autovideosink
는 OS에 맞춰 새로운 창에 비디오를 보여주는 element입니다파이프라인 생성
let pipeline = gst::Pipeline::new(Some("test-pipeline"));
element들을 실행하기 위해
pipeline
을 생성해 줍니다pipeline
은 element들의 저장소라고 생각하시면 됩니다Bin또한
pipeline
에 저장할 수 있습니다pipeline.add_many(&[&source, &sink]).unwrap();
이 예제의 경우 add_many를 통해 element들을
pipeline
에 저장합니다하지만 아직 각각의 element들은 연결이 되지 않은 상태 입니다
따라서 다음과 같이 element의
link()
를 사용해야합니다source.link(&sink).expect("Elements could not be linked.");
링크시 주의해야할 점은 element의 흐름입니다
항상 source에서 sink로 이동해야합니다
그리고 같은
pipline
에 있는 element끼리만 link를 할 수 있기에
pipline.add()
나 add_many
를 먼저 한 후 link를 해주어야합니다Properties
gstreamer의 element는 properties를 갖고 있는 객체입니다
대부분의 요소는 사용자가 지정이 가능한 요소를 가지고 있습니다
gst-inspect-1.0
을 통해 각각 element의 프로퍼티를 조회할 수 있습니다프로퍼티는 다음과 같이 set할 수 있습니다
source.set_property_from_str("pattern", "smpte");
pattern 프로퍼티는 테스트 비디오의 종류를 선택하는 프로퍼티입니다
에러검출
해당 부분은 이전의 튜토리얼과 유사합니다
상태에 대한 대응은 다음 예제에서 다루도록 하겠습니다
댓글