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 : 처리 가능한 미디어 포맷
'CV(Computer-Vision)' 카테고리의 다른 글
| [GStreamer] Gstreamer 기초. 튜토리얼 정리 Ch1 - 16 (0) | 2026.04.30 |
|---|