라즈베리파이에서 스트리밍을 할 수 있는 여러가지 툴들이 있지만 여기서는 MJPGE-Streamer를 이용해 보자. 단계별로 설치와 동작 시키는 방법에 대해 알아 보자.
1. MJPG-Streamer에 필요한 몇가지 라이브러리 설치
$ sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
$ sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
2. 변경된 Videodev.h 심볼릭 링크 걸기
$ sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
$ sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
3. MJPG-Streamer 다운로드 하기
$ wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip
$ wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip
* 다운로드가 제대로 되지 않은다면 https://sourceforge.net/p/mjpg-streamer/code/HEAD/tarball 에서 수동으로 다운로드 받아서 설치하자.
4. 압축 풀기
$ unzip mjpg-streamer-code-182.zip
$ unzip mjpg-streamer-code-182.zip
5. 빌드
$ cd mjpg-streamer-code-182/mjpg-streamer $ make mjpg_streamer input_file.so output_http.so
$ cd mjpg-streamer-code-182/mjpg-streamer $ make mjpg_streamer input_file.so output_http.so
6. 인스톨 MJPG-Streamer
$ sudo cp mjpg_streamer /usr/local/bin $ sudo cp output_http.so input_file.so /usr/local/lib/ $ sudo cp -R www /usr/local/www
$ sudo cp mjpg_streamer /usr/local/bin $ sudo cp output_http.so input_file.so /usr/local/lib/ $ sudo cp -R www /usr/local/www
모두가 자동 인스톨이 아니라서 수동으로 몇가지 파일을 적절한 곳에 카피 해줘야 한다. 어쨌든 이것으로 설치는 완료 되었다. 이제 카메라를 시작하면 된다.
7. 카메라 시작
$ mkdir /tmp/stream $ raspistill --nopreview -w 640 -h 480 -q 5 -vf -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th0:0:0 &
$ mkdir /tmp/stream $ raspistill --nopreview -w 640 -h 480 -q 5 -vf -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th0:0:0 &
스트리밍에 필요한 폴더를 하나 만들어 주고 이 예제에서는 /tmp/stream이라는 폴더를 지정했다. raspistil를 각자의 옵션에 따라 백그라운드로 실행한다.raspistill 뒤에 따라 오는 옵션들은 각자의 상황에 맞게 재설정 해주면 된다. -q는 사진 퀄리티 0~100사이, -o는 파일 저장, -tl은 타임랩스 몇조마다 찍을 것인지 1000이 1초이다. -t는 작동시간? 설정하지 않으면 5초라고 한다. 무한정 작동되는게 아니란 말인가? 이부분은 좀 더 알아 보자. -th는 썸네일 크기이다. w:h:quality 필요없으니 모두 0으로 설정되어 있다.개인적으로는 카메라를 거꾸로 달았 놓아서 재생시 영상을 뒤집어 주도록 옵션(-vf)을 추가해 주었다.
파이 카메라는 계속해서 열심히 사진을 찍어서 임시 폴더에 저장을 한다. 스틸사진을 찍고 그사진을 연속적으로 전송해서 동영상 처럼 보이게 하는 방식인듯 하다. 어차피 동영상이라는게 움직이는 스틸사진이잖아. ^^
8. MJPG-Streamer를 시작한다.
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o"output_http.so -w /usr/local/www"
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o"output_http.so -w /usr/local/www"
서버 실행 옵션이 좀 복잡하다. 일단 그대로 실행하자. 자세한 것은 다음에 천천히 알아 보자. 이제 라즈베리파이에서 할 것은 이것이 전부이다. 클라이언트 컴에서 웹브라우저를 통해 영상을 확인하면 된다.
http://자신의라즈베리파이ip주소:8080 으로 접속하면 된다. 그럼 아래 그림 처럼 접속이 된다.
그런데 좀 불편한 점이 있다. 매번 위에서 했던 긴 명령어를 입력해야 하는것은 문제이다. 좀 간단한 방법이 있다. 실행 스크립트를 만들어 놓으면 실행하기가 쉽다.
<스트리밍 시작 스크립트>
#!/bin/bash
if [ ! -d /tmp/stream ]
then
mkdir /tmp/stream/
fi
if pgrep raspistill > /dev/null
then
echo "raspistill already running"
else
raspistill -w 640 -h 480 -q 5 -vf -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 -n > /dev/null 2>&1&
echo "raspistill started"
fi
if pgrep mjpg_streamer > /dev/null
then
echo "mjpg_streamer already running"
else
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o"output_http.so -w /usr/local/www" > /dev/null 2>&1&
echo "mjpg_streamer started"
fi
----------------
<중지하는 스크립트>
#!/bin/bash
if pgrep raspistill
then
kill $(pgrep raspistill) > /dev/null 2>&1
echo "raspistill stopped"
else
echo "raspistill not running"
fi
if pgrep mjpg_streamer
then
kill $(pgrep mjpg_streamer) > /dev/null 2>&1
echo "mjpg_streamer stopped"
else
echo "mjpg_streamer not running"
fi
#!/bin/bash
if [ ! -d /tmp/stream ]
then
mkdir /tmp/stream/
fi
if pgrep raspistill > /dev/null
then
echo "raspistill already running"
else
raspistill -w 640 -h 480 -q 5 -vf -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 -n > /dev/null 2>&1&
echo "raspistill started"
fi
if pgrep mjpg_streamer > /dev/null
then
echo "mjpg_streamer already running"
else
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o"output_http.so -w /usr/local/www" > /dev/null 2>&1&
echo "mjpg_streamer started"
fi
----------------
<중지하는 스크립트>
#!/bin/bash
if pgrep raspistill
then
kill $(pgrep raspistill) > /dev/null 2>&1
echo "raspistill stopped"
else
echo "raspistill not running"
fi
if pgrep mjpg_streamer
then
kill $(pgrep mjpg_streamer) > /dev/null 2>&1
echo "mjpg_streamer stopped"
else
echo "mjpg_streamer not running"
fi
---------------
위 파일들을 적당한 곳에 저장해 놓고 파일에 실행권한을 부여하고
$chmod +x filename.sh
$sh start_stream.sh
$sh stop_stream.sh
$chmod +x filename.sh
$sh start_stream.sh
$sh stop_stream.sh
* 외부에서 접속해서 확인 하고 싶다면 사용중인 공유기에서 DDNS 설정과 포트포워딩을 해주면 된다. 자세한것은 다른 글을 검색해서 설정하자. 여기서는 다루지 않는다.