[Gstreamer] 02_Gstreamer concept
[Gstreamer] 02_Gstreamer concept

[Gstreamer] 02_Gstreamer concept

작성자
Shalom KimShalom Kim
카테고리
gstreamer
태그
Rust
Media
gstreamer

목표

저번엔 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로 스트림을 흐르게 하여 데이터를 처리합니다
 
notion image

생성 방법

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 ... 처럼 이름이 생성이 되기도 합니다 편의에 맞추어 사용해주세요
 

예제 파이프라인

notion image
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 프로퍼티는 테스트 비디오의 종류를 선택하는 프로퍼티입니다

에러검출

해당 부분은 이전의 튜토리얼과 유사합니다
상태에 대한 대응은 다음 예제에서 다루도록 하겠습니다
 

댓글

guest