Gstreamer 은 Pipeline기반의 Multimedia framework로 쉽게 Mulimedia를 PlugIn을 사용하여 쉽게 Control 하고 연결할수 있는 Framework이다.
각 SoC의 Chip Vender마다 요즘 거의 지원을 해주고 있으며, OpenMax도 지원을 해주고 있다.
더불어 PC에서도 지원을 해주고 있어 많이 사용되는 Multimedia Framework이다.
- 기본구조
- Pipeline : Element 구조체를 가지고 있으며, Gstreamer 전체를 Control을 할때 사용
- Bin : Element 구조체를 가지고 있으며, 작은단위로 Pipeline을 구성하고 동적으로 연결할때 사용하는 것 같음
- Element : Pad를 가지고 있으며, 각 Element의 동작을 수행을 한다.
- Pad: Source or Sink 가 될 수 있으며, Element는 두개의 Sink도 가질수 있다.
- Bus: 상위 그림에는 없지만, BUS라는 개념이 있어 이를 통신에 관련된다.
https://en.wikipedia.org/wiki/Filter_graph
https://gstreamer.freedesktop.org/documentation/application-development/introduction/basics.html?gi-language=c
- Plug-Ins : 대부분의 Plug-in들은 shared library로 구현이 된다고 하며,
- Modules: Package 혹은 Plug-in Set이라고 하며 Plug-in의 상태에 따라 Good, bad, Ugly 구분이되며 설치 되어지는 Module에따라 지원되는 기능이 다르다.
- Elements: 개별 Plug-In의 속성기능이며, 실제 동작되는 구조기능이다.
https://en.wikipedia.org/wiki/GStreamer
https://gstreamer.freedesktop.org/documentation/installing/index.html?gi-language=c
기본개념
https://gstreamer.freedesktop.org/documentation/application-development/basics/index.html?gi-language=c
- Gstreamer Modules (Package or Plug-in Set )
- gstreamer: the core package
- gst-plugins-base: an essential exemplary set of elements
- gst-plugins-good: a set of good-quality plug-ins under LGPL
- gst-plugins-ugly: a set of good-quality plug-ins that might pose distribution problems
- gst-plugins-bad: a set of plug-ins that need more quality
- gst-libav: a set of plug-ins that wrap libav for decoding and encoding
https://gstreamer.freedesktop.org/modules/
좀더 자세한 plug-in은 Modules 살펴보au plugins-good, ugly,bad version으로 나누어지며,good을 제외한 version 개발 version
https://gstreamer.freedesktop.org/documentation
Gstreamer Example
- gst_pipeline_new : piple line 생성 (Element)
- gst_element_factory_make: Gstreamer Element
- g_object_set : Element 의 Properties
- gst_bin_add or gst_bin_add_many : Pipeline에 Element 등록
- gst_element_link or gst_element_link_many : Element 사이의 연결
- gst_pipeline_get_bus or gst_element_get_bus : Pipe line의 bus 정보
- gst_bus_add_watch : Pipeline의 Bus Callback 함수등록하여 이를 감시
- gst_element_get_request_pad or gst_element_get_static_pad : Pad information
- gst_pad_link : 얻은 Pad로 링크도 가능
동적 파이프라인 구성
gst_element_link 대신 pad_link를 사용하여 직접연결
https://yujuwon.tistory.com/entry/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8
https://gstreamer.freedesktop.org/documentation/application-development/basics/pads.html?gi-language=c#dynamic-or-sometimes-pads
고스트 패트
https://yujuwon.tistory.com/entry/Ghost-pads-1
https://gstreamer.freedesktop.org/documentation/application-development/basics/pads.html?gi-language=c#ghost-pads
API Reference
https://gstreamer.freedesktop.org/documentation/libs.html?gi-language=c
Core Library
GstPlugin
https://gstreamer.freedesktop.org/documentation/gstreamer/gi-index.html?gi-language=c
GstElement
https://gstreamer.freedesktop.org/documentation/gstreamer/gstelement.html?gi-language=c
GstPipeline
https://gstreamer.freedesktop.org/documentation/gstreamer/gstpipeline.html?gi-language=c
GstBin
https://gstreamer.freedesktop.org/documentation/gstreamer/gstbin.html?gi-language=c#GstBin
GstBus
https://gstreamer.freedesktop.org/documentation/gstreamer/gstbus.html?gi-language=c
GstPad
https://gstreamer.freedesktop.org/documentation/gstreamer/gstpad.html?gi-language=c
GstMeta
https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html?gi-language=c
1.1 GSTREAMER 전체구성
Gstreamer는 기존에 독립적으로 존재하던 존재였던 Device Driver및 Interface를 연결해주는 매개체 일뿐이다.
이는 Plug-In인 Video와 Audio, Display , Protocol, Parser 등을 제공하여 연결을 손쉽게 해주어 사용이 손쉽게 동작이 되게하고,
유저들에게 간편한 Interace를 제공하여, Programming 손쉽게 하도록 도와준다.
Plug-In들은 본인이 설치한 Package에 따라 지원이 되는것이 달라질 것이다.
- 기본구성 Plug-Ins
중요 아래에서 Plug-In을 쉽게 검색가능
https://gstreamer.freedesktop.org/documentation/plugins.html
- 3rd Party Plugins
보통 Chip Vender에서 제공하는 Chip 의존적인 API를 사용하게 되어지는데, 거의 Video/Audio/Codec 부분은 OpenMax 통일이 되어가는 추세이며,
Display 역시 개별 Soc에 맞게 추가되어 있으므로 관련부분은 Chip Vendor의 Gstreamer의 Manual을 반드시 읽어야 한다.
아래 사이트에서 확인하자
https://www.freedesktop.org/wiki/GstOpenMAX/
참고로 OpenMax를 사용한다고하여, 꼭 Hardware Codec를 사용하라는 법은 없으며, FFMPEG을 이용하여 SoftCodec도 사용가능하다.
1.2 GSTREAM 기본 동작 구조
- Bin/Pipeline : 둘다 GstElement 이며, Element(Plug-in) 관리를 쉽게하기위해서 시작 포인트
- Element : Plug-in에 구성인자이며, Pad (source or sink)를 이용하여 Data를 통신한다.
- Pad (Source): Element에서 Ouput 이며, 이를 다른 Element와 연결 Data out
- Pad (Sink): Element의 Input으로 시작 or 다른 Element와 연결되어 Data 입력
https://gstreamer.freedesktop.org/documentation/application-development/introduction/basics.html?gi-language=c
https://gstreamer.freedesktop.org/documentation/application-development/basics/elements.html?gi-language=c
https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html?gi-language=c#GstMeta
- Callback Function
- Pad에 gst_pad_add_probe 를 이용하여 Callback Function 추가 가능
- GSTREAM Pipeline Audio 구성예제
위를 간단히 분석하면,
- File을 Read해서 읽어 Ogg-demuxer 전달
- Ogg-demuxer는 Audio Codec인 Vorbis Codec을 Vorbis-decoder에 전달.
- Vorbis-decoder는 이를 Converter에 전달 ( 이부분은 Why?)
- 최종적으로 Audio 출력
출처:
이문서를 한번는 읽어봐야 할것 같다.
https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf
1.3 GSTREAMER 기본 정보
- GSTREAMER SITE
https://wiki.freedesktop.org/gstreamer/
https://gstreamer.freedesktop.org/documentation/tutorials/basic/index.html?gi-language=c
https://gstreamer.freedesktop.org/documentation/plugin-development/index.html?gi-language=c
2. Element 구현
GObjectClass GstBaseSinkClasshttps://gstreamer.freedesktop.org/documentation/plugin-development/index.html?gi-language=c
https://gstreamer.freedesktop.org/documentation/plugin-development/element-types/index.html?gi-language=c
3. PC GSTREAMER
PC에서 설치는 자신의 환경에따라 설치하자.
3.1 Ubuntu 최신버전 설치
http://gstreamer.freedesktop.org/wiki/BuildDependenciesDebianUbuntu/
https://wiki.freedesktop.org/gstreamer/BuildDependenciesDebianUbuntu/
sudo apt-get build-dep gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad sudo apt-get install cvs sudo apt-get build-dep gstreamer0.10-plugins-ugly-multiverse gstreamer0.10-plugins-bad-multiverse sudo apt-get install pkg-config libglib2.0-dev liborc-0.4-dev bison flex sudo apt-get install libglew1.5-dev libpng12-dev
아직 미확인
http://egloos.zum.com/seoz/v/4002136
http://peterhouse.tistory.com/29
http://askubuntu.com/questions/517910/installing-can-i-install-gstreamer-1-4-on-ubuntu-14-04
3.2 Ubuntu 기본 Version 설치
기본설치방법 본인 버전에 따라 설치하자.
- Ubuntu에 GSTREAMER 설치 (12.04)
$ sudo apt-get install gstreamer-tools //처음 gstreamer 없을 경우 설치하자. //**** option $ sudo gst-install // source를 down 받아 설치하는데 제대로 // 동작되는 경우가 있고 안될 경우가 있다. ubunt 12.04 실패 $ sudo apt-get install gstreamer0.10-plugins-good // 이미 설치됨 $ sudo apt-get install gstreamer0.10-plugins-bad // 본인이 필요한 plug-in $ sudo apt-get install gstreamer0.10-plugins-ugly // 본인이 필요한 plug-in
sudo apt-get install gstreamer0.10-ffmpeg
- DM8127 IPNC TEST (Failed)
gst-launch rtspsrc location=rtsp://192.168.1.168:8556/PSIA/Streaming/channels/2?videoCodecType=H.264 ! queue ! \
rtph264depay ! queue ! ffdec_h264 ! xvimagesink sync=false -v
CAPS=application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264,\
sprop-parameter-sets=(string)\"J0KAKouVAoPy\\,KN4BriA\\=\",payload=(int)96,ssrc=951364645,\
clock-base=2084568768,seqnum-base=10992
CAPS=application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264,payload=(int)96
gst-launch rtspsrc location=rtsp://192.168.1.168:8556/PSIA/Streaming/channels/2?videoCodecType=H.264 ! $CAPS ! queue ! \
rtph264depay ! queue ! ffdec_h264 ! ximagesink sync=false -v
- Ubuntu TEST
gst-launch-0.10 videotestsrc ! xvimagesink sync=false -v
only working.....
gst-launch-0.10 videotestsrc ! ximagesink sync=false -v
https://developer.ridgerun.com/wiki/index.php?title=DM81xx_GStreamer_Pipelines_-_SDK_2011Q2
4. GSTREAMER의 기본사용법
4.1 Gstreamer Plug-In 및 Element 확인
- plug-in 설치 확인 및 사용법 확인 (gst-inspect)
- gst-inspect : print info about a GStreamer plugin or element
$ gst-inspect // 설치된 plug-in or element 확인 vp8: vp8enc: On2 VP8 Encoder //plugin : element mimic: mimenc: Mimic Encoder mimic: mimdec: Mimic Decoder speed: speed: Speed **** videotestsrc: videotestsrc: Video test source //plugin : element $ gst-inspect audiotestsrc // audiotestsrc plug-in 세부 속성 및 기타 확인 $ gst-inspect videotestsrc // videotestsrc plug-in 세부 속성 및 기타 확인 $ gst-inspect |grep 264 (Host에서 H264관련 검색, 설치확인) x264: x264enc: x264enc // gstreamer0.10-plugins-ugly 설치시 확인가능 rtp: rtph264depay: RTP H264 depayloader rtp: rtph264pay: RTP H264 payloader typefindfunctions: video/x-h264: h264, x264, 264
http://docs.gstreamer.com/display/GstSDK/gst-inspect
4.2 GSTREAMER PLUG-INS 사용방법확인
https://gstreamer.freedesktop.org/documentation/plugins.html
gst-inspect로 설치된것을 확인하고 아래의 사이트에서 자세한 사용법을 찾아 설정하자.
기본사용법은 gst-launch를 사용한 후 각각의 plug-in을 연결하여 사용하면된다.
여기에 해당옵션들을 설정을 하면되지만, bad, good, ugly 마다 지원되는 거이 틀리며,
vendor와 version 을 반드시 확인을 해야한다.
gstreamer는 기본적으로 pipleline 방식으로 연결되어 동작을 하고, 필요한 plugin을 찾아
이를 사용자가 설정을 해주면되는 것이다.
예를 들면, rtspsrc를 보자.
videomixer 와 videocrop에 대해서 위해서 찾아보자
- videocrop 사용방법과 관련설정
확인해보면 examlple로 확인가능하며, Element Pads 구성을 보면 자세한 설정을 확인가능하다.
direction : Sink or Source (Manual 8.1 참조)
presence : always, sometimes, request
https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-videocrop.html
https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-aspectratiocrop.html
4.3 GSTREAMER 명령어 설명
- gst-feedback : 디버깅용으로 gstream의 상태를 진단하고 보고하는용으로 사용한다.
- gst-install : 내가 해본결과 소스를 받아 설치하는데, 원래는 다른것 같다.
- gst-launch : gstreamer를 pipeline을 실행한다.
- gst-typefind : 파일의 정보를 보여준다
- gst-play : 가장 쉽게 동영상 play가 가능한 명령어.
- gst-inspect : plug-in 과 element를 검색하며, grep를 이용하여 확인하자.
- gstreamer-codec-install
- gstreamer-properties
http://linux.die.net/man/1/gst-typefind-0.10
https://gstreamer.freedesktop.org/documentation/tools/index.html
4.4 GSTREAMER 관련 분석
아래는 기본으로 사용하는 방법
http://wiki.oz9aec.net/index.php/Gstreamer_cheat_sheet
- 기본동작
$ gst-launch videotestsrc ! ximagesink $ gst-launch videotestsrc pattern=snow ! ximagesink $ gst-launch videotestsrc ! video/x-raw-rgb, framerate=25/1, width=640, height=360 ! ximagesink
- videotestsrc : video test source (pattern=snow)
- ximagesink : ximage sink
- ! : 연결? link?
- typefindfunctions : video/x-raw-rgb, framerate=25/1, width=640, height=360
https://www.gitorious.org/cameractls/cameractls.git/?p=cameractls:cameractls.git;a=tree
https://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/section-types-definitions.html
5. GSTREAMER DEBUG
빌드시 GST_DEBUG 옵션을 주면 --enable-gst-debug=yes 이 옵션이 사용이 가능하다.
gst-launch 사용할 경우, 하지만 사용을 하지 못할 경우도 있으니, 너무 기대는 하지 말자.
만약 빌드된채로만 사용해야한다면 이부분은 사용을 못할 가능성이 크다.
1~9까지 선택이 가능하다
( 1 - ERROR ,2 - WARNING ,3 - FIXME ,4 - INFO )
( 5 - DEBUG, 6 - LOG, 7 - TRACE, 9 - MEMDUMP )
- --enable-gst-debug=yes : debug enable
- --gst-debug=3 : debug mode 위의 참조
- -v : 사용하여 print out details
성능측정으로 Debug도 가능하다.
gstperf : TI에서만 제공되는 Element 인것 같다. 이를 이용하여 debug도 가능
RTSP로 할 경우 latency도 조절이 가능하므로 buffer 조절이 가능하다.
gstperf print-fps=true print-arm-load=true
queue ! : 중간에 buffer를 둔다.
- Gstreamer Element perf로 검색
https://gstreamer.freedesktop.org/documentation/plugins.html
https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gst-running.html
댓글 없음 :
댓글 쓰기