Gstreamer 기초

2 months ago   •   8 min read

By mAsh

안녕하세요! mAy-I의 엔지니어 고강련입니다 :)

이전 포스팅에서 Gstreamer를 설치할 수 있었다면, 이번 포스팅에서는 Gstreamer에서 사용하는 용어와 구성 요소 등 Gstreamer를 본격적으로 사용하기 전에 알아두면 좋을 것들과 Gstreamer의 간단한 예시에 대한 내용을 다루겠습니다.


| List |

  1. Gstreamer 란?
  2. Gstreamer 구성 요소, 용어
  3. elements 종류 3가지 (source, filter, sink)
  4. bins
  5. gstreamer 사용법 (pipeline 구성 예제, 결과)
  6. 가속화된 플러그인

1. Gstreamer 란?

  • 스트리밍 미디어 응용 프로그램 만들기 위한 프레임 워크, 모든 유형의 스트리밍 멀티미디어 응용 프로그램 작성할 수 있습니다.
  • 구성요소를 임의의 파이프라인에 혼합해 응용 프로그램 작성할 수 있는 장점이 있습니다.

2. Gstreamer 구성 요소, 용어

Gstreamer 구성 요소, 용어

2–1. 구성 요소

  • elements : 가장 중요한 객체의 클래스임. 서로 연결된 chain of elements를 만들고, 이를 통해 데이터가 흐르게 합니다.
  • pads : element의 입력, 출력이고 다른 elements와 연결할 수 있습니다. 흐르는 데이터 유형을 제한할 수 있고, 두 패드의 허용된 데이터 유형이 호환되는 경우만 링크가 허용됩니다. 패드=물리적 장치의 잭과 유사(c type=c type잭만 연결됨)하고, 대부분의 데이터는 한방향으로만 흐릅니다. 데이터는 source pads 통해 나가고, sink pads 통해 받을 수 있습니다.
  • bins and pipelines
bin, pipeline
  • bin : elements의 컨테이너, bin 상태를 변경해 그 안의 모든 요소에서 상태를 변경할 수 있음.
  • pipeline : 최상위 빈, 응용프로그램을 위한 버스 제공, 자식에 대한 동기화 관리

2–2. communication

  • communication : 애플리케이션, 파이프라인 간 통신, 데이터 교환 위한 메커니즘 제공
communication 예시
  • buffer : 파이프라인 요소간 데이터 전달위한 객체, source→sink로 이동함
  • event : 요소간 또는 응용 프로그램에서 요소로 전송되는 객체
  • message : 파이프라인의 메시지 버스에 요소별로 게시된 개체, 응용 프로그램에서 수집위해 유지됨.
  • query : 응용 프로그램은 query통해 파이프라인에서 지속시간, 현재 재생 위치같은 정보 요청 가능.

3. elements 종류 3가지 (source, filter, sink)

  • element는 서로 연결되는데 source element로 시작, filter, demuxer 등이 중간 사이사이에 넣어지고, sink element로 끝나게 됩니다.
element
filter, demuxer

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(재생상태))
Bin
기본적 오디오 플레이어 구성 예제

5. gstreamer 사용법 (pipeline 구성 예제, 결과)

5–1. 가장 기본적인 elements 유형

  • 애니메이션 비디오 팬턴 창이 나타납니다.
가장 기본적인 elements 유형

5–2. properties 사용

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

5–3. named elements 사용

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

5–4. pads 사용

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

pads 사용
  • 오디오만 가져오고 싶을 경우

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를 처음 다루시는 분들도 쉽게 따라할 수 있다고 생각합니다.

Spread the word

Keep reading