안녕하세요! mAy-I의 엔지니어 고강련입니다 :)
이전 포스팅에서 Gstreamer를 설치할 수 있었다면, 이번 포스팅에서는 Gstreamer에서 사용하는 용어와 구성 요소 등 Gstreamer를 본격적으로 사용하기 전에 알아두면 좋을 것들과 Gstreamer의 간단한 예시에 대한 내용을 다루겠습니다.
List
1. Gstreamer 란?
2. Gstreamer 구성 요소, 용어
3. elements 종류 3가지 (source, filter, sink)
4. bins
5. gstreamer 사용법 (pipeline 구성 예제, 결과)
6. 가속화된 플러그인
2. Gstreamer 구성 요소, 용어
3. elements 종류 3가지 (source, filter, sink)
4. bins
5. gstreamer 사용법 (pipeline 구성 예제, 결과)
6. 가속화된 플러그인
- 이번 포스팅은 아래의 [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를 처음 다루시는 분들도 쉽게 따라할 수 있다고 생각합니다.
▼ 오프라인 공간 분석 트랜드를 알고 싶다면 구독하세요!
메이아이 뉴스레터 구독신청
″영상처리 인공지능을 통해 오프라인 공간의 디지털 트랜스포메이션을 만들자” 오프라인 방문객 분석 트랜드, 메이아이의 인공지능 엔진 ‘daram’의 성장 이야기 그리고 메이아이의 다양한 소식을 만날 수 있습니다. 나날이 더욱 강력한 인공지능으로 거듭나고 있는 메이아이의 든든한 구독자가 되어 보세요!