회사에서 GStreamer 로 작업을 해야할 일이 생겼다. 단순히 시스템에서 Video 를 띄우는 작업이었는데 GStreamer 라는 툴을 이용해서 진행했다.
단순하게 비디오를 띄우는 작업이라면 `xdg-open` 을 쓰면 되지 않아? 라고 생각했으나 우리의 use-case 는 단순히 비디오를 띄우는 것 뿐 아니라 비디오를 원하는 화면 사이즈에 맞게 조정해서 띄우거나 필요에 따라 재생 동작을 제어하는 등 등 섬세한 컨트롤이 필요했다. 그래서 일반적인 미디어 플레이어를 쓰기 보다 조금 더 섬세한 컨트롤을 할 수 있는 기능이 필요했고 그걸 도와주는 툴이 바로 GStreamer 였다.
GStreamer 란?
GStreamer는 멀티미디어 애플리케이션을 개발하기 위한 오픈소스 프레임워크다. 주로 C 언어로 작성되었으며, 오디오 및 비디오 스트리밍, 변환, 녹화, 재생 등을 포함한 다양한 미디어 작업을 처리할 수 있다.
GStreamer는 파이프라인 기반 아키텍처로 되어 있다. 여기서 파이프란 여러 플러그인을 연결하여 복잡한 미디어 처리 작업을 말한다.. 이러한 유연성 덕분에 미디어 플레이어, 스트리밍 서버, 비디오 편집 소프트웨어 등 다양한 응용 프로그램에서 활용되고 있다.
GStreamer 구성 요소
1. Pipeline
GStreamer의 핵심 요소로, 데이터를 처리하는 플러그인들의 연결된 흐름을 나타낸다. 파이프라인을 통해 미디어 데이터를 가져오고, 처리하고, 출력할 수 있다.
2. Elements
GStreamer에서 미디어 데이터를 처리하는 기본 빌딩 블록이다. 각 Element는 특정 작업을 수행하며, Source, Filter, Sink의 세 가지 유형으로 나뉜다.
- Source: 데이터를 가져오는 역할 (예: 파일, 네트워크 스트림)
- Filter: 데이터를 변환하거나 조작 (예: 디코딩, 인코딩, 변환)
- Sink: 데이터를 출력 (예: 화면, 스피커, 파일 저장)
3. Plugin
확장 가능한 구조를 제공하기 위해 GStreamer는 플러그인 시스템을 활용한다. 플러그인은 GStreamer의 기능을 추가하는 동적 모듈로, 다양한 코덱, 프로토콜, 필터 등이 플러그인 형태로 제공된다.
4. Bus
파이프라인에서 발생하는 이벤트나 메시지를 전달하는 역할을 한다. 이를 통해 애플리케이션이 에러, 상태 변경, End-of-Stream(EOS) 등과 같은 이벤트를 처리할 수 있다.
Hello World 예제 코드
#include <gst/gst.h>
int main (int argc, char *argv[]) {
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;
/* Initialize GStreamer */
gst_init (&argc, &argv);
/* Build the pipeline */
pipeline = gst_parse_launch(
"playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm",
NULL);
/* Start playing */
gst_element_set_state(pipeline, GST_STATE_PLAYING);
/* Wait until error or EOS */
bus = gst_element_get_bus(pipeline);
msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
/* Handle error or EOS */
if (GST_MESSAGE_TYPE(msg) == GST_MESSAGE_ERROR) {
g_printerr("An error occurred!\n");
}
/* Clean up */
gst_message_unref(msg);
gst_object_unref(bus);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
return 0;
}
컴파일 명령어
gcc main.c -o runner `pkg-config --cflags --libs gstreamer-1.0`
- pkg-config: GStreamer와 같은 라이브러리의 컴파일 및 링크 옵션을 자동으로 추가.
- --cflags: 헤더 파일 포함 경로를 제공.
- --libs: 필요한 라이브러리 링크 정보를 제공.
GStreamer CLI
GStreamer는 gst-launch-1.0 이라는 강력한 CLI 도구를 제공한다. 이 도구는 플러그인과 파이프라인의 구성 및 테스트에 유용하다. "!" 를 기준으로 플러그인이 연결된 파이프라인으로 구성되어 있다.
예제
gst-launch-1.0 filesrc location=sample.mp4 ! decodebin ! autovideosink
- filesrc: 파일 소스를 읽어옴.
- decodebin: 적절한 디코더를 자동으로 선택.
- autovideosink: 플랫폼에 적합한 비디오 출력 방식 선택.
활용
GStreamer 를 활용한 방식에 대해서 간단히 소개한다. Full Screen 으로 비디오를 띄우기 위해 다음과 같은 명령어를 활용했다.
gst-launch-1.0 \
multifilesrc location="/home/onion/video.mp4" loop=true ! \
decodebin ! \
videoconvert ! \
waylandsink fullscreen=true
1. multifilesrc: 여러 개의 파일을 순차적으로 읽어들이는 Source 요소.
- location="/home/onion/video.mp4": 읽어들일 파일의 경로를 지정.
- loop=true: 파일 재생이 끝나면 처음부터 반복.
2. decodebin: 입력 스트림을 자동으로 디코딩할 수 있는 적절한 디코더 선택.
3. videoconvert: 비디오 코덱에 맞춰 변환.
4. waylandsink: Wayland protocol 에서 비디오를 출력하는 Sink 요소.
- fullscreen=true: 전체 화면으로 출력.
참고자료
공식 문서: https://gstreamer.freedesktop.org/documentation/index.html
'시스템 프로그래밍' 카테고리의 다른 글
커널 모듈(Kernel Module) (1) | 2024.11.27 |
---|---|
dmesg vs journalctl (0) | 2024.11.23 |
SELinux: 리눅스 보안 툴 2 (0) | 2024.11.22 |
AppArmor, 리눅스 보안 툴 (0) | 2024.11.20 |
왜 자꾸 sudo apt update 를 쳐줘야 할까? (0) | 2024.11.16 |