행복한 하루

gstreamer 1.19.2 버전 소스 컴파일 방법과 gstreamer Plugin 엘리먼트 컴파일 방법 본문

Programming/gstreamer

gstreamer 1.19.2 버전 소스 컴파일 방법과 gstreamer Plugin 엘리먼트 컴파일 방법

변화의 물결 2022. 4. 28. 00:05

 

 

안녕하세요. 

 

  - gstreamer를 사용함에 있어서 문제는 없지만, 제공해주는 라이브러리 말고 필요한 기능을 추가해서 플러그인 라이브러리를 만들어 보고 싶었습니다. 그리고 현재 gstreamer 개념에 대해서 완벽하게 이해하지는 못해서 상세한 설명은 가능하지 않지만, Plugin개발은 가능하지 않을까를 우선 확인해보았습니다.

 

  - 인터넷에서도 자료가 있지만 이전 컴파일 방법이거나 gstreamer doc 파일에도 최종 실행까지 상세하게 설명이 되어 있지 않아서 결과를 볼 수가 없었습니다. 그래서 현재 시점에서 하는 찾아보았습니다.


1. 테스트 환경

  - OS : ubuntu 20.04 LTS 64bit

  - gstreamer설치 전 필요한 프로그램  

  $ sudo apt-get install -y --force-yes build-essential autotools-dev automake autoconf libtool autopoint libxml2-dev zlib1g-dev libglib2.0-dev pkg-config bison flex python3 git gtk-doc-tools libasound2-dev libgudev-1.0-dev libxt-dev libvorbis-dev libcdparanoia-dev libpango1.0-dev libtheora-dev libvisual-0.4-dev iso-codes libgtk-3-dev libraw1394-dev libiec61883-dev libavc1394-dev libv4l-dev libcairo2-dev libcaca-dev libspeex-dev libpng-dev libshout3-dev libjpeg-dev libaa1-dev libflac-dev libdv4-dev libtag1-dev libwavpack-dev libpulse-dev libsoup2.4-dev libbz2-dev libcdaudio-dev libdc1394-22-dev ladspa-sdk libass-dev libcurl4-gnutls-dev libdca-dev libdirac-dev libdvdnav-dev libexempi-dev libexif-dev libfaad-dev libgme-dev libgsm1-dev libiptcdata0-dev libkate-dev libmimic-dev libmms-dev libmodplug-dev libmpcdec-dev libofa0-dev libopus-dev librsvg2-dev librtmp-dev libschroedinger-dev libslv2-dev libsndfile1-dev libsoundtouch-dev libspandsp-dev libx11-dev libxvidcore-dev libzbar-dev libzvbi-dev liba52-0.7.4-dev libcdio-dev libdvdread-dev libmad0-dev libmp3lame-dev libmpeg2-4-dev libopencore-amrnb-dev libopencore-amrwb-dev libsidplay1-dev libtwolame-dev libx264-dev libusb-1.0 python-gi-dev yasm python3-dev libgirepository1.0-dev

2. gstreamer 소스로 설치

  - 현재 gstreamer plugin을 컴파일하기 위해서는 최신 gstreamer 1.19 이상이 필요했습니다.

 

  - ubuntu에서 apt-get으로 gstreamer를 설치해도 현재는 1.19 버전이 설치가 되지 않았습니다. 그래서 직접 소스를 다운로드하여서 컴파일해서 설치하였습니다.

 

2.1) 소스 다운로드

  https://gitlab.freedesktop.org/gstreamer/gstreamer 사이트에서 git 주소를 받아서 다운로드합니다. 그리고 추가로 필요한 플러그인도 소스를 다운로드합니다.

  git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git

 

혹은 아래 링크에서 다운로드합니다. 

git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer
git clone git://anongit.freedesktop.org/git/gstreamer/gst-plugins-base
git clone git://anongit.freedesktop.org/git/gstreamer/gst-plugins-good
git clone git://anongit.freedesktop.org/git/gstreamer/gst-libav
git clone git://anongit.freedesktop.org/git/gstreamer/orc

 

2.2) meson 설치하기

  - 정확하게 언제인지는 모르겠는데 이전 버전에서는 autoconf, make, make install로 설치를 한 것 같은데 현재 소스는 make가 아니라 meson(차세대 멀티플랫폼 빌드 시스템)이라는 것을 사용하고 있습니다.

 

  - 생각 없이 sudo apt-get install meson 설치하면 0.53.2 버전만 다운로드가 되어서 소스를 빌드를 시킬 수 없었습니다. 그래서 gitlab.freedesktop.org 알려주는 것처럼 python3 -m pip install meson 이렇게 받으면 쉽게 최신 버전을 받을 수 있었습니다. 그러나 ~/.local/bin 여기에 설치되다 보니 경로 설정해주는 작업이 필요했습니다.

 

  - pip3로 설치하면 최신 버전이 설치가 되었지만, 다른 에러가 발생해서 다시 삭제했습니다. 

$ sudo python3 -m pip uninstall meson

 

  - meson0.53 이상 버전의 meson_0.57.0+really0.56.2-0.1_all.deb 파일을 다운로드합니다.

http://archive.ubuntu.com/ubuntu/pool/universe/m/meson/

 

- meson_0.57.0 설치한 후  재부팅을 합니다. 

$ sudo dpkg -i meson_0.57.0+really0.56.2-0.1_all.deb

  

2.3) gstreamer 빌드하기

  - gstreamer 소스 디렉터리로 이동해서 meson 실행합니다. 

$ meson builddir

 

 - 설치되지 않은 프로그램 라이브러리가 있다고 에러를 발생시킬 수 있습니다. 보고 구글링 해서 필요한 프로그램 설치하면서 Error를 하여야 합니다. 그리고 meson builddir를 다시 실행합니다.

 

  에러 예시 1) gst/parse/meson.build:7:0: ERROR: Program 'flex win_flex' not found    에러 발생

  해결방법)  https://tsaiyuyan.github.io/2020/05/11/gstreamer-bian-yi-bi-ji/ 

$ sudo apt-get install libjson-glib-dev
$ pkg-config --cflags json-glib-1.0
$ sudo apt install libmount-dev flex bison cmake

 

에러 예시 2) Run-time dependency libavfilter found: NO (tried pkgconfig and cmake) 에러 발생

$ sudo apt-get install -y libavfilter-dev

 

2.4) gstreamer 컴파일 하기

  - 빌드가 끝나면 ninja라는 컴파일 시스템 파일이 있으면 찾았다고 나옵니다.

  - 설치되지 않았다면 $ sudo apt-get install -y ninja-build 설치합니다.

  

  - 컴파일을 진행합니다.

$ ninja -C builddir

 

- 문제가 없다면 인스톨까지 진행합니다. 

$ ninja -C builddir install

  

2.5) 기타 플러그인 설치

  - 기본적으로 gstreamer 1.19.2  버전이 설치 완료되었다면 나머지 다운로드한 소스들도 컴파일이 가능합니다.  플러그인 소스 디렉터리로 이동후 동일하게 에러를 잡으면서 설치합니다. 

$ meson builddir
$ ninja -C builddir
$ ninja -C builddir install

3. gstreamer 플러그인 만들기

3.1) gst-template 소스 다운로드

  - 플러그인을 테스트할 수 있도록 template 소스를 다운로드합니다. 

$ git clone https://gitlab.freedesktop.org/gstreamer/gst-template.git

 

3.2) myfilter 엘리먼트 생성

  - 기본 소스가 있는 디렉토리로 이동한 후 엘리먼트를 template tool을 이용해서 생성합니다. 생성할 때 기본적으로 어떤 템플릿을 베이스로 할지  정해 줄 수 있습니다. 여기서는 gsttransform를 이용합니다.

$ cd gst-template/gst-plugin/src
$ ../tools/make_element myfilter gsttransform

  - src 디렉터리에 gstmyfilter.c gstmyfilter.h 파일이 생성된 것을 확인할 수 있습니다.

  

3.3) 컴파일과 설치

  - gst-template 디렉터리로 이동후 meson과 ninja롤 빌드와 컴파일, 설치를 해줍니다.

  - src과 gst-plugin 디렉터리에서 meson을 실행하면 "ERROR: First statement must be a call to project" 에러가 납니다.

 

- gst-template에서 빌드와 컴파일 명령어를 실행해줍니다.

gst-template $ meson builddir
gst-template $ ninja -C builddir
gst-template $ sudo ninja -C builddir install

 

- 인스톨까지 하면 라이브러리 디렉터리에 복사됩니다

 

3.4) myfilter 엘리먼트 테스트해보기

  - 2번 내용에서 gstreamer와 plugin을 정상적으로 설치했다면 아래와 같이 실행하면 I'm plugged라는 문구가 표시되며 테스트 영상이 나타나는 창을 볼 수 있습니다. gstmyfilter.c의 gst_myfilter_transform_ip() 함수 내에 g_print ("I'm plugged, therefore I'm in.\n"); 구문에 의해 출력되는 것을 알 수 있습니다. 

$ gst-launch-1.0 videotestsrc ! myfilter ! autovideosink

 

   - 위의 작업한 내용은 사용자의 설치된 리눅스 환경에 따라서 달라질 수 있으며 중간에 빠진 부분도 있을 수 있으므로 큰 맥락에서 이렇게 할 수도 있구나 참고하시면 좋을 듯합니다.

 

감사합니다.

 

 

<참고 사이트>

1. gstreamer project

https://gitlab.freedesktop.org/gstreamer/gstreamer

2. Windows 환경에서의 gst-template 빌드

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=myrandy1&logNo=220374362061

3. CMake는 가라! Meson과 함께하는 차세대 C++ 빌드 시스템 구축

https://int-i.github.io/cpp/2021-06-26/cpp-meson/

4. GStreamer 최신 버전 빌드 하기 - RK3128 리눅스

https://blog.naver.com/chandong83/221265532853

5. [Gstreamer] Gstreamer 기초

https://medium.com/may-i-lab/gstreamer-gstreamer-%EA%B8%B0%EC%B4%88-da5015f531fc

 

 

Comments