Gstreamer 기초
안녕하세요, 메이아이의 Engineer 고강련입니다.
이전 포스팅에서는 Gstreamer를 설치하는 방법을 안내드렸는데요. 이번 포스팅에서는 Gstreamer에서 사용하는 용어와 구성 요소 등 Gstreamer를 본격적으로 사용하기 전에 알아두면 좋을 것들과 Gstreamer의 간단한 예시에 대한 내용을 다루겠습니다.
이번 포스팅은 'Gstreamer References'를 기반으로 작성하였습니다. 더 구체적이고 자세한 내용은 여기를 눌러 확인하실 수 있습니다.
Gstreamer란?
스트리밍 미디어 응용 프로그램 만들기 위한 프레임 워크, 모든 유형의 스트리밍 멀티미디어 응용 프로그램 작성할 수 있습니다. 구성요소를 임의의 파이프라인에 혼합해 응용 프로그램을 작성할 수 있는 장점이 있습니다.
Gstreamer 구성 요소, 용어
구성 요소
- elements : 가장 중요한 객체의 클래스. 서로 연결된 chain of elements를 만들고, 이를 통해 데이터가 흐르도록 함.
- pads : element의 입력, 출력. 다른 elements와 연결 가능. 흐르는 데이터 유형을 제한할 수 있고, 두 패드의 허용된 데이터 유형이 호환되는 경우만 링크 허용. 패드=물리적 장치의 잭과 유사(c type=c type 잭만 연결됨). 대부분의 데이터는 한 방향으로만 흐르며, 데이터는 source pads 통해 나가고 sink pads 통해 받음.
- bin : elements의 컨테이너, bin 상태를 변경해 그 안의 모든 요소에서 상태 변경 가능
- pipeline : 최상위 빈, 응용프로그램을 위한 버스 제공, 자식에 대한 동기화 관리
- communication : 애플리케이션, 파이프라인 간 통신, 데이터 교환 위한 메커니즘을 제공
- buffer : 파이프라인 요소간 데이터 전달위한 객체, source→sink로 이동함
- event : 요소간 또는 응용 프로그램에서 요소로 전송되는 객체
- message : 파이프라인의 메시지 버스에 요소별로 게시된 개체, 응용 프로그램에서 수집 위해 유지
- query : 응용 프로그램은 query통해 파이프라인에서 지속시간, 현재 재생 위치같은 정보 요청 가능
elements 종류 3가지 (source, filter, sink)
element는 서로 연결됩니다. source element로 시작, filter, demuxer 등이 중간 사이사이에 넣어지고, sink element로 끝나게 됩니다.
source elements
디스크, 사운드 카드에서 읽어 파이프라인에서 사용할 데이터를 생성합니다. 입력(받는 곳)은 없고 출력만 있습니다.
filters, convertors, demuxers, muxers and codecs
입력, 출력 pad가 있습니다. 다시 말해 데이터를 받고, 데이터를 처리 후 내보낼 수 있습니다. 1:1(filter, convertor) 일수도, 1:N(demuxer, muxer) 일 수도 있습니다. filter(볼륨), convertor(비디오 크기 변환), ogg(비디오+음성 포함 파일) demuxer 등이 있습니다.
sink elements
미디어 파이프라인의 끝 점입니다. 입력(받는 곳)만 있고, 출력은 없습니다.
bins
bin는 container element 즉, 여러 element를 감싼 컨테이너라 할 수 있습니다. element들의 상태를 한 번에 관리할 수 있습니다. (NULL(기본 상태), READY(준비 상태), PAUSED(멈춘 상태), PLAYING(재생 상태))
gstreamer 사용법 (pipeline 구성 예제, 결과)
가장 기본적인 elements 유형
애니메이션 비디오 팬턴 창이 나타납니다.
properties 사용
videotestsrc에 pattern 부여하는 property 사용 : 원이 나타납니다.
named elements 사용
요소 이름을 지정할 수 있고, 분기와 관련한 복잡한 파이프라인을 생성할 수 있습니다. videotestsrc 이름을 t라 명명, 비디오를 두 개로 출력해 두 개의 queue에 넣고, 두 개의 autovideosink로 보냅니다. 구조는 아래와 비슷합니다.
pads 사용
elements를 연결할 경우 사용할 패드를 직접 지정할 수 있습니다. 아래 url의 영상은 영상, 음성이 합쳐진 영상이라서 video만 가져오려면 matroskademux 사용해 영상에서 video를 가져오고, matroskamux를 사용해 합치고, sintel_video.mkv로 저장해야 합니다.
오디오만 가져오고 싶은 경우, 아래를 참고합니다.
caps filters 사용
요소에 둘 이상의 출력 패드가 있는 경우 모든 패드와 호환 가능한데, 아래는 가능한 첫 번째 필드를 사용해 링크하는 방법입니다. 패드가 video_0 에 연결될지 audio_0에 연결될지 모르면 제대로 저장되지 않을 가능성이 있습니다.
이때 pads 사용처럼 영상이 저장되게 하고 싶으면 명명된 패드를 사용하거나, cpas filter 사용하면 됩니다. 'video/x_vp8'이라는 것을 넣어 audio_0이 아닌 video_0를 가져오게 하면 pads 사용처럼 영상이 저장됩니다.
웹에서 가져오는 영상에 videoscale 넣기
uri의 영상을 큐에 넣을 습니다. 이 때 사이즈는 320x200으로 변경하고, convert 해야 합니다.
파일 입출력
파일에서 영상을 가져올 때에는 filesrc를 사용합니다.
파일로 쓸 때에는 filesink를 사용합니다.
테스트 미디어 생성
테스트를 위한 video를 생성합니다.
테스트를 위한 audio를 생성합니다.
비디오 어댑터
- videoconvert : 색상 공간 변환 (ex) RGB → YUV)
- videorate : 비디오 프레임 가져와 새 스트림 생성 → 다른 속도를 원할 시 유용함
- videoscale : 비디오 프레임 크기 조정
멀티 스레딩
- queue
- queue2
- multiqueue
- tee
가속화된 플러그인
gst-nvvideocodecs는 가속화된 비디오 디코더입니다. v4l2h264dec 같은 가속화 전용 플러그인들이 있습니다. NVIDIA로 가속화된 플러그인의 예는 아래와 같습니다.
마치며
지금까지 Gstreamer를 구성하는 요소가 무엇인지, 사용하는 용어와 각 요소가 어떤 기능을 하는지에 대한 내용을 다루었습니다. 각 파이프라인을 구성하는 예시 또한 단순한 형태이고, 직접 테스트해 본 예시이기에 Gstreamer를 처음 다루시는 분들도 쉽게 따라 할 수 있다고 생각합니다.