안녕하세요! mAy-I의 엔지니어 고강련입니다 :)
이전 포스팅에서 Gstreamer를 설치할 수 있었다면, 이번 포스팅에서는 Gstreamer에서 사용하는 용어와 구성 요소 등 Gstreamer를 본격적으로 사용하기 전에 알아두면 좋을 것들과 Gstreamer의 간단한 예시에 대한 내용을 다루겠습니다.
| List |
- Gstreamer 란?
- Gstreamer 구성 요소, 용어
- elements 종류 3가지 (source, filter, sink)
- bins
- gstreamer 사용법 (pipeline 구성 예제, 결과)
- 가속화된 플러그인
- 이번 포스팅은 아래의 [Gstreamer References]를 기반으로 작성하였습니다. 더 구체적이고 자세한 내용은 아래의 링크를 통해 확인하실 수 있습니다.
- https://gstreamer.freedesktop.org/documentation/application-development/introduction/gstreamer.html?gi-language=c
1. Gstreamer 란?
- 스트리밍 미디어 응용 프로그램 만들기 위한 프레임 워크, 모든 유형의 스트리밍 멀티미디어 응용 프로그램 작성할 수 있습니다.
- 구성요소를 임의의 파이프라인에 혼합해 응용 프로그램 작성할 수 있는 장점이 있습니다.
2. Gstreamer 구성 요소, 용어

2–1. 구성 요소
- elements : 가장 중요한 객체의 클래스임. 서로 연결된 chain of elements를 만들고, 이를 통해 데이터가 흐르게 합니다.
- pads : element의 입력, 출력이고 다른 elements와 연결할 수 있습니다. 흐르는 데이터 유형을 제한할 수 있고, 두 패드의 허용된 데이터 유형이 호환되는 경우만 링크가 허용됩니다. 패드=물리적 장치의 잭과 유사(c type=c type잭만 연결됨)하고, 대부분의 데이터는 한방향으로만 흐릅니다. 데이터는 source pads 통해 나가고, sink pads 통해 받을 수 있습니다.
- bins and pipelines

- bin : elements의 컨테이너, bin 상태를 변경해 그 안의 모든 요소에서 상태를 변경할 수 있음.
- pipeline : 최상위 빈, 응용프로그램을 위한 버스 제공, 자식에 대한 동기화 관리
2–2. communication
- communication : 애플리케이션, 파이프라인 간 통신, 데이터 교환 위한 메커니즘 제공

- buffer : 파이프라인 요소간 데이터 전달위한 객체, source→sink로 이동함
- event : 요소간 또는 응용 프로그램에서 요소로 전송되는 객체
- message : 파이프라인의 메시지 버스에 요소별로 게시된 개체, 응용 프로그램에서 수집위해 유지됨.
- query : 응용 프로그램은 query통해 파이프라인에서 지속시간, 현재 재생 위치같은 정보 요청 가능.
3. elements 종류 3가지 (source, filter, sink)
- element는 서로 연결되는데 source element로 시작, filter, demuxer 등이 중간 사이사이에 넣어지고, sink element로 끝나게 됩니다.


3–1. source elements
- 디스크, 사운드 카드에서 읽어 파이프라인에서 사용할 데이터 생성
- 입력(받는곳)은 없고 출력만 있습니다.
3–2. filters, convertors, demuxers, muxers and codecs
- 입력, 출력 pad가 있습니다. (데이터를 받고, 데이터를 처리 후 내보냄)
- 1:1(filter, convertor) 일수도, 1:N(demuxer, muxer) 일수도 있습니다.
- filter(볼륨), convertor(비디오 크기변환), ogg(비디오+음성 포함 파일) demuxer 등이 있습니다.
3–3. sink elements
- 미디어 파이프라인의 끝 점
- 입력(받는곳)만 있고, 출력은 없습니다.
4. bins
- bin : container element, 여러 element를 감싼 컨테이너라 할 수 있습니다.
- element들의 상태를 한번에 관리할 수 있습니다.
(NULL(기본상태), READY(준비상태), PAUSED(멈춘 상태), PLAYING(재생상태))


5. gstreamer 사용법 (pipeline 구성 예제, 결과)
5–1. 가장 기본적인 elements 유형
- 애니메이션 비디오 팬턴 창이 나타납니다.


5–2. properties 사용
- videotestsrc에 pattern 부여하는 property 사용 : 원이 나타납니다.


5–3. named elements 사용
- 요소 이름 지정 가능, 분기와 관련한 복잡한 파이프라인 생성 가능
- videotestsrc 이름을 t라 명명, 비디오를 두개로 출력해 두개의 queue에 넣고, 두개의 autovideosink로 보냄. 아래와 비슷한 구조.



5–4. pads 사용
- elements 연결시 사용할 패드를 직접 지정 가능.
- 아래 url의 영상은 영상, 음성이 합쳐진 영상이라서 video만 가져오려면 matroskademux 사용해 영상에서 video를 가져오고, matroskamux를 사용해 합치고, sintel_video.mkv로 저장해야 합니다.


- 오디오만 가져오고 싶을 경우

5–5. caps filters 사용
- 요소에 둘 이상의 출력 패드가 있는 경우 모든 패드와 호환 가능한데, 아래는 가능한 첫번째 필드를 사용해 링크하는 방법입니다.
- 패드가 video_0 에 연결될 지 audio_0에 연결될 지 모름 ⇒ 제대로 저장이 안될 가능성 있습니다.

- 이때 pads 사용 처럼 영상이 저장되게 하고 싶으면 명명된 패드를 사용하거나, cpas filter 사용하면 됩니다.
video/x_vp8 이라는 것을 넣어 audio_0이 아닌 video_0를 가져오게 함. ⇒ pads 사용 처럼 영상이 저장됩니다.

5–6. 웹에서 가져오는 영상에 videoscale 넣기
- uri의 영상을 큐에 넣을 건데, 320x200으로 scale 변경해 넣고, convert 할 것.

5–7. 파일 입출력
- 파일에서 영상 가져오기 : filesrc 사용

- 파일로 쓰기 : filesink 사용

5–8. 테스트 미디어 생성
- 테스트 위한 video 생성

- 테스트 위한 audio 생성

5–9. 비디오 어댑터
- videoconvert : 색상 공간 변환 (ex) RGB → YUV)
- videorate : 비디오 프레임 가져와 새 스트림 생성 → 다른 속도 원할시 유용함!

- videoscale : 비디오 프레임 크기 조정

5–10. 멀티 스레딩
- queue
- queue2
- multiqueue
- tee

6. 가속화된 플러그인
- gst-nvvideocodecs : 가속화된 비디오 디코더
v4l2h264dec
같은 가속화 전용 플러그인들이 있습니다.- NVIDIA로 가속화된 플러그인의 예 : gst-nvvideocodecs, gst-nvstreammux, gst-nvinfer, gst-nvtracker, gst-nvosd, gst-tiler, gst-nvvidconv
지금까지 Gstreamer를 구성하는 요소가 무엇인지, 사용하는 용어와 각 요소가 어떤 기능을 하는지에 대한 내용을 다루었습니다. 각 파이프라인을 구성하는 예시 또한 단순한 형태이고, 직접 테스트해 본 예시이기에 Gstreamer를 처음 다루시는 분들도 쉽게 따라할 수 있다고 생각합니다.
👇 오프라인 공간 분석 트랜드를 알고 싶다면 구독하세요!
