gstreamer를 활용한 video streaming
사용하는 환경
드론 프로젝트에서 사용할 것이라 LTE와 WiBro의 무선 환경이다. 단방향으로 latency가 약 60ms정도 발생한다고 보면 된다. (LTE:20ms + WiBro:40ms) LTE 라우터를 곧 구입할 예정인데, 성능은 별 기대 안한다. 왜냐 안되니까… ㅠ.ㅠ
UDP로 통신
UDP가 TCP보다 빠르기에 이것으로 한것인데, 결과적으로 이동통신 무선으로는 패킷 드랍이 너무 심한지 거의 동작 하지 않는다. 절망이다. WiFi에서 테스트 해보면 거의 실시간으로 보이는데 말이다. [updated] 잘 되는 방법을 찾았다. ㅎㅎㅎ
[맥 PC]
고정 IP는 LTE라우터에서 제공하기 때문에 포트만 4653 열어두고 대기 한다.
gst-launch-1.0 -e -v udpsrc port=4653 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false
아래꺼는 잘 됨… 딜레이 약 2초
gst-launch-1.0 -e -v udpsrc port=4653 ! queue2 max-size-buffers=1 ! decodebin ! autovideosink sync=false **[라즈베리파이]**
raspivid -t 0 -h 400 -w 600 -fps 15 -hf -vf -b 2000000 -o -| gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! udpsink host=your MAC IP port=4653
위에 되는 거랑 pair로 하면 된다.. framerate을 떨어뜨리니 속도까지 빨라진다.
raspivid -t 0 -hf -vf -n -h 300 -w 400 -fps 5 -o - |gst-launch-1.0 fdsrc ! udpsink host=your MAC IP port=4653
WebRTC Gateway 이용
이거 발견하고 얼마나 기뻤었던지 ㅎㅎㅎ 집에서 WiFi로 하는데 참 잘되었다. 허나, 무선망에서는 역시 뺑글뺑글 시계만 돌아가고 전혀 되지를 않는다. ㅠ.ㅠ 아~ 짱나~!
Janus 오픈소스
요거를 서버에 설치하고 중계 역할을 맡기면 된다. 설치는 아래와 같다.
$ sudo install libmicrohttpd-dev libjansson-dev libnice-dev libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev libopus-dev libogg-dev libini-config-dev libcollection-dev pkg-config gengetopt libtool automake dh-autoreconf
옵션으로 몇 가지 설치(Data Channels, WebSockets, RabbitMQ)할 수 있는데, 안해도 상관 없다.
$ git clone https://github.com/meetecho/janus-gateway.git
$ cd janus-gateway
$ sh autogen.sh
$ ./configure --disable-websockets --disable-data-channels --disable-rabbitmq --disable-docs --prefix=/opt/janus
$ make
$ sudo make install
default configuration 파일을 만들어 주자.
$ sudo make configs
다음으로 /opt/janus/etc/janus/janus.plugin.streaming.cfg를 다음과 같이 수정한다. 다른 내용은 주석 처리하면 된다. 기능이 많은데 안쓰는 거라서…
$ sudo vim janus.plugin.streaming.cfg
[gst-rpwc]
type = rtp
id = 1
description = RPWC H264 test streaming
audio = no
video = yes
videoport = 8004
videopt = 96
videortpmap = H264/90000
videofmtp = profile-level-id=42e028\;packetization-mode=1
firewall을 사용하면 포트 열어주는 것 잊지 말자.
ufw allow 8004
[서버]
서버 ip는 server_ip로 하고 포트는 8004번으로 한다. 일단 터미널 창을 2개 실행한다. 하나는 janus 데몬을 실행하고 다른 하나는 간단히 웹서버를 돌린다.
## 1번 터미널
cd /opt/janus/bin/
./janus -F /opt/janus/etc/janus/
아래의 웹서는 8000 포트로 열었다. 방화벽이 설치했으면 포트 오픈 잊지 말자.
## 2번 터미널
cd /opt/janus/share/janus/demos
python -m SimpleHTTPServer 8000
브라우저에서 http://server_ip:8000으로 접속해서 아래와 비스무리한 화면이 나오면 성공이다.
[라즈베리파이]
일단, 테스트로 동영상을 만들어서 서버에 보내 보자. test.mp4로 만들고 qtdemux를 붙여주면 잘 된다.
gst-launch-1.0 -v filesrc location=./test.mp4 ! qtdemux ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=server_ip port=8004
카메라가 제대로 설치 되었다고 가정하면, 다음과 같이 보낼 수 있다.
raspivid --verbose --nopreview -hf -vf --width 640 --height 480 --framerate 15 --bitrate 1000000 --profile baseline --timeout 0 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=server_ip port=8004
결론
LTE로는 잘 안된다!!! 안돼~~~!!! 그리고 UDP에 비해 TCP가 latency가 심해도 동작으로 한다. UDP는 WiFi 환경에서만 되는걸로~ ㅠ.ㅠ
참고
[맥북에서 카메라 동작 확인하는 명령]
gst-launch-1.0 autovideosrc ! osxvideosink
[사이트]