Gstreamer 실시간 streaming
Gstreamer는 비디오스트림을 다루는 툴이며 CLI를 이용해서 사용할 수 있는 소프트웨어 라이브러리임.
Gstreamer는 주로 두개의 명령어 gst-launch-1.0과 gst-inspect-1.0를 사용하며 gst-launch-1.0으로 여러 설정들을 pipeline형태로 연결해서 사용한다.
gst-inspect-1.0은 설치된 Gstreamer 모듈의 정보를 알려주는 명령어.
Gstreamer는 pipe와 filer(pad라고도 부름)구조로 구성되는데, 이들을 서로 ! 를 통해 연결해서 사용한다.
※ 기본적인 stream
비디오를 출력하는 요소를 sink라고 부르는데 autovideosink를 이용하면 시스템의 기본적인 sink를 자동 선택해준다. 간단하게 화면 조정과 같은 화면을 display 해보자.
gst-launch-1.0 videotestsrc ! autovideosink
여기에 몇가지 capabilities(caps)를 추가 해보자.
gst-launch-1.0 videotestsrc ! video/x-raw, width=640, height=480 ! autovideosink
※ Webcam을 연결해서 출력해보자
gst-launch-1.0 v4l2src device=/dev/video6 ! video/x-raw, width=640, height=480 ! autovideosink
※ Stream encoding 하기
네트워크로 stream을 전송하기 위해서는 압축을 해서 보내야 한다. 압축은 상대적을 간단하게 pipe 연결로 해결 할 수 있다. mjpep엔코딩은 ! jpegenc , VP8은 ! vp8enc, Mpeg2는 ! avenc_mpeg4 로 연결 가능함. mjpeg가 가장 간단함.
※ Stream payload
payloading은 raw 또는 압축된 데이터를 네트워크 프로토콜로 패킹하는 작업이다. 보통 GDP(Gstreamer Data Protocol)나 RTP(Real Time Protocol)을 사용한다. payload pad는 encoder pad 뒤에 다음과 같은 형태로 piping 한다.
! jpegenc ! rtpjpegpay, 또는 ! vp8enc ! rtpv8pay, 또는 ! avenc_mpeg4 ! rtpmp4vpay
※ Stream 보내기
gst-launch-1.0 -v v4l2src device=/dev/video6 ! video/x-raw, width=640, height=480 ! videoconvert ! jpegenc ! rtpjpegpay ! udpsink host=10.90.1.50 port=5000
여기서 updsink host 주소는 보낼 receiver의 IP주소이다.
※ Stream 수신하기
gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink