CV(Computer-Vision)

[GStreamer] GStreamer 기본 개념 및 명령어

창모의 개발사전 2026. 4. 23. 17:22

GStreamer

: 멀티미디어 데이터를 처리하기 위한 오픈소스 프레임워크.

단순히 동영상을 재생하는 플레이어가 아닌 영상을 자르고, 붙이고, 변환하고 분석하는 모든 과정을 '파이프라인'의 구조로 설계할 수 있도록 해주는 프레임워크이다.

 

GStreamer는 다양한 분야에서 많이 사용되고 있다.

  • 영상 재생기
  • 스트리밍 서버/클라이언트 (RTSP, HLS)
  • 영상 트랜스코딩 (포맷 변환)
  • 카메라 영상 처리 (라즈베리파이, Jetson 등 엣지 디바이스)
  • AI 비전 파이프라인 (NVIDIA DeepStream이 GStreamer 기반)

 

파이프라인 구조의 GStreamer

GStreamer의 핵심 구조는 '파이프라인'이다. 데이터가 왼쪽에서 오른쪽으로 흘러가는 구조다.

 

[source] → [filter/convert] → [sink]
데이터 생성    데이터 가공       데이터 출력

 

- 실제 파일 재생 파이프라인 예시

[filesrc] → [decoder] → [videoconvert] → [autovideosink]
파일 읽기    디코딩         색공간변환          화면 출력

 

GStreamer가 가지는 큰 장점은, 이러한 파이프라인들을 'element'라는 작은 단위들로 원하는 동작을 처리하는 형태의 파이프라인을 조립하며 만들 수 있다.

 

 

Element

: 파이프라인을 구성하는 최소 처리 단위. 각 element는 하나의 역할만 담당한다.

 

1. Source element : 데이터를 만들어내는 시작점

filesrc 로컬 파일에서 읽기
uridecodebin URI(http/rtsp/file)에서 읽고 디코딩까지
videotestsrc 테스트용 영상 생성
audiotestsrc 테스트용 오디오 생성


2. Filter element : 중간에서 데이터를 가공

videoconvert 비디오 색공간 변환 (YUV → RGB 등)
audioconvert 오디오 포맷 변환
audioresample 오디오 샘플레이트 변환 (48000Hz → 44100Hz)
volume 볼륨 조절
x264enc H.264로 인코딩
vp8dec VP8 디코딩

 

3. Sink element : 최종 출력. 파이프라인의 끝부분

autovideosink 플랫폼에 맞는 화면 출력 자동 선택
autoaudiosink 플랫폼에 맞는 오디오 출력 자동 선택
filesink 파일로 저장
fakesink 출력 없이 버림 (테스트/디버깅용)

 

 

Pad

: element 간 데이터가 오고 가는 연결 포트이다. element 안에 있는 입출력 단자라고 보면 된다.

 

[element A]  src pad ══════ sink pad  [element B]
                     ↑ 출력 포트             ↑ 입력 포트

 

src pad : 데이터가 나가는 포트

sink pad : 데이터가 들어오는 포트

 

이 pad는 생성 시점에 따라 두 종류로 나뉜다.

  • Static pad : element 생성 시부터 항상 존재
    audioconvert, videoconvert, sink 계열 element들
    → gst_element_get_static_pad(element, "sink")

  • Dynamic pad : 실행 중 필요할 때 동적으로 생성
    demuxer, uridecodebin 등
    → 파일 읽어봐야 오디오/비디오 트랙 수를 알 수 있으므로
    → 생성 시점을 "pad-added" 시그널로 앱에 알려줌

 

Bin & Pipeline

  • Bin : 여러 element를 담는 컨테이너.
    Bin 자체도 하나의 Element로 취급된다. → 이 개념이 중요한데 그 이유는,
    Bin 안에 element가 5개 있어도 외부에서 보면 그냥 element 하나로 취급할 수 있다.

    즉, 복잡한 처리를 하는 여러 element들을 하나의 Bin으로 묶어 사용할 수 있게 된다. 그리고 Bin의 상태를 바꾸면 Bin 안의 모든 element들의 상태도 한꺼번에 바뀐다.

  • Pipeline : Bin에 클럭 동기화와 Bus(메시지 시스템)가 추가된 최상위 컨테이너. Bin의 기능을 모두 상속받음.
    실제 앱에서 항상 pipeline을 최상위로 사용한다.

    클럭 동기화 : 파이프라인 안 모든 element가 같은 시간 기준으로 동작하게 해준다.(오디오/비디오 싱크 맞추기 등)
    Bus 제공 : 파이프라인 내부 이벤트를 앱으로 전달하는 메시지 채널

GObject
  └─ GInitiallyUnowned
       └─ GstObject                  ← 이 부분까지는 GStreamer 내부구조.
            └─ GstElement          ← 모든 element의 기본형
                 └─ GstBin         ← element를 담는 컨테이너
                      └─ GstPipeline  ← 최상위 실행 컨테이너

 

이런 식으로 GstPipeline은 GstBin를 상속 받음으로써, GstElement, GstBin 형으로 변환하여 함수에 넘길 수 있다. 

 

 

Bus & Message

Bus : 파이프라인 내부에서 발생한 이벤트를 앱의 메인 스레드로 안전하게 전달하는 메시지 큐이다.

 

GStreamer 파이프라인은 내부적으로 여러 스레드가 동시에 돌아가며 디코딩, 네트워크 수신, 오디오 출력 등 각각이 별도의 스레드로 처리되는데, 이 스레드들이 앱 코드에 직접 접근하게 되면 스레드 충돌이 생길 수 있다.

그래서 Bus가 안전하게 중간에서 전달해주는 역할을 한다.

 

Message : Bus에 담기는 실제 메시지 내용이다. 

 

주요 메시지 타입

타입발생  시점
GST_MESSAGE_ERROR 치명적 에러 발생
GST_MESSAGE_EOS 미디어 끝(End of Stream) 도달
GST_MESSAGE_WARNING 경고 (재생은 계속됨)
GST_MESSAGE_STATE_CHANGED State 전환 완료
GST_MESSAGE_BUFFERING 네트워크 버퍼링 진행률
GST_MESSAGE_CLOCK_LOST 파이프라인 클럭 유실

GStreamer의 명령어

- 테스트 및 환경 점검

  • 영상 테스트
    gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
  • 음성 테스트
    gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink

- 파일 및 네트워크 재생

  • 로컬 파일 재생
    gst-launch-1.0 filesrc location=파일경로.mp4 ! decodebin ! videoconvert ! autovideosink
  • 인터넷 스트리밍 재생
    gst-launch-1.0 uridecodebin uri=http://주소/영상.mp4 ! videoconvert ! autovideosink


- 영상 처리 및 전처리

  • 흑백 전환 (GRAY8)
    ... ! video/x-raw, format=GRAY8 ! videoconvert ! ...
  • 해상도 조절 (Scale)
    ... ! videoscale ! video/x-raw, width=640, height=480 ! ...
  • 프레임 속도 조절 (Rate)
    ... ! videorate ! video/x-raw, framerate=10/1 ! ...
  • 영상 위에 텍스트 오버레이
    ... ! textoverlay text="검사 중..." valignment=bottom ! ...

 

- 데이터 분기 및 저장

  • 영상/소리 동시 출력
    ... ! tee name=t t. ! queue ! 영상출력부 t. ! queue ! 소리출력부
  • 파일로 저장
    ... ! x264enc ! mp4mux ! filesink location=result.mp4
  • 성능 테스트
    ... ! fakesink sync=false

 

- 플러그인/element 정보 조회

  • 전체 설치된 플러그인 목록 출력
    gst-inspect-1.0
  • 특정 element 상세 정보 조회
    gst-inspect-1.0 [element]

    특정 element를 조회하면 아래 정보가 출력된다:
    - Pad 정보 : src/sink pad 갯수, 타입
    - Properties : 설정 가능한 프로퍼티 목록과 기본값
    - Signals : 발생 가능한 시그널 목록
    - Caps : 처리 가능한 미디어 포맷