본문 바로가기

Dev/linux

[Linux] Raspberry Pi 4B 와 카메라 모듈을 이용한 실시간 스트리밍 구축

 

 

 

이번 포스팅에서는 라즈베리파이 4B 모델과 카메라 모듈을 이용해 스트리밍 환경을 구축해보겠습니다.

본 포스팅에서 스트리밍 환경 구축에 사용할 소스와 카메라는 mjpg-streamer와 NOIR CAMERA MODULE V2라는 카메라 모듈이지만, 카메라는 라즈베리파이의 카메라 포트에 연결 가능한 카메라라면 어떤 것이든 상관없습니다.

 

RASPBERRY Pi NOIR CAMERA MODULE V2

 

1. 라즈베리파이 카메라 포트 활성화

카메라를 사용하기 위해서는 라즈베리파이에서 카메라 포트를 활성화시켜야 합니다. 본 포스팅에서는 GUI에서 설정하는 방법과 와 터미널 환경에서 설정하는 방법 모두 설명하겠습니다.

 

먼저 GUI 환경에서의 방법입니다.

 

 

작업 표시줄에서 기본 설정 > Raspberry Pi Configuration을 엽니다. root 권한이 필요합니다.

 

 

인터페이스 탭에서 카메라 항목이 아마도 Disable로 설정되어있을 텐데, 이를 Enable로 바꿔 줍니다.

 

터미널 환경에서 설정하는 방법은 다음과 같습니다.

아래의 명령어로 설정에 진입합니다.

 

$ sudo raspi-config

 

 

위 화면에서는 원하는 항목에 커서를 두고 Enter를 누르면 선택이 됩니다.

Interface Options를 선택해줍니다.

각 옵션들 항목의 순서는 라즈베리파이 OS 커널 버전에 따라 달라질 수 있습니다.

 

 

카메라를 선택합니다.

 

 

카메라 포트를 활성화할 것인지 묻습니다.

'예'를 선택해 카메라 포트를 활성화해 줍니다.

설정을 완료하면 첫 화면으로 돌아오는데 Finish를 누르면 재부팅할 것인지를 묻는데, 아직은 재부팅하지 않겠습니다.

 

2. 카메라 연결

우선 라즈베리파이를 완전히 꺼줍니다.

사실 그냥 기동하고 있는 상태에서 연결해도 연결은 되지만 연결하는 도중에 다른 연결선이 빠지거나 접촉 불량이 돼서 문제가 발생하는 불상사를 방지하기 위해 안전하게 전원을 끄고 전원 선을 뺀 다음 연결해주는 것이 좋습니다.

 

# 전원 종료
$ sudo shutdown -h now

 

 

카메라 모듈은 위와 같은 15핀 리본 케이블로 되어있습니다.

리본 케이블은 앞면 뒷면이 구분되어 있습니다. 핀이 노출되어있는 부분이 Front입니다.

 

 

위 사진에서 빨간 영역으로 표시한 부분이 카메라 포트입니다.

리본 케이블의 앞 뒷면을 잘 구분 해 체결해줍니다.

 

이제  전원을 연결하고 라즈베리파이를 기동하고 잘 연결되었는지 아래의 명령어로 확인합니다.

 

 

detected가 1 이면 잘 연결된 것입니다. 만약 0이라면 케이블 연결 방향등 제대로 체결되었는지 확인합니다.

 

3. mjpg-streamer 다운로드 및 컴파일

카메라 스트림을 이용하기 위해 사용되는 소스는 여러 가지가 있지만 본 포스팅에서는 mjpg-streamer를 사용하도록 하겠습니다.

mjpg-streamer를 사용하기 위해서는 컴파일 도구와 필요 패키지를 선행 설치해주어야 합니다.

 

$ sudo apt-get install gcc g++ cmake libjpeg8-dev

 

깃 허브에서 mjpg-streamer를 clone 하고 컴파일합니다.

$ git clone https://github.com/jacksonliam/mjpg-streamer.git

# 소스파일에 이동
$ cd mjpg-streamer/mjpg-streamer-experimental

# 컴파일
$ make distclean
$ make CMAKE_BUILD_TYPE=Debug
$ sudo make install

 

4. 스트리밍

 

이제 mjpg-streamer/mjpg-streamer-experimental/에 있는 mjpg_streamer 명령을 이용해 스트림 서버를 기동 합니다.

 

$ export LD_LIBRARY_PATH=./mjpg-streamer/mjpg-streamer-experimental/
$ mjpg_streamer -o "output_http.so -w ./www -p 9090" -i "input_raspicam.so -fps 30 -preview"

 

-o -i 옵션은 각각 output input을 의미합니다.

위 옵션은 포스팅을 위한 예제입니다. 화면 사이즈, 회전율, 프레임 등 다양하게 옵션을 줄 수 있습니다.

여기서 -o 옵션의 -p 9090은 서버 포트를 의미합니다. 만약 9090 포트가 사용 중이라면 다른 번호를 할당합니다.

-p 옵션을 설정하지 않으면 8080으로 할당받습니다.

각 옵션에 대한 자세한 설명은 아래 링크를 참조해주세요.

 

https://github.com/jacksonliam/mjpg-streamer

 

jacksonliam/mjpg-streamer

Fork of http://sourceforge.net/projects/mjpg-streamer/ - jacksonliam/mjpg-streamer

github.com

 

 

명령어를 입력하면 위와 같이 연결 정보와  옵션이 표시됩니다.

HTTP TCP port가 제대로 적용되었는지 확인합니다.

 

이제 아래와 같이 브라우저에서 접속해보면 카메라를 통한 영상을 확인할 수 있습니다.

http://라즈베리파이의 IP:9090/?action=stream

 

 

카메라가 제대로 작동하고 있음을 확인했습니다.

 

여기서 ffmpeg나 파이썬 등을 이용해 CCTV나 블랙박스같이 영상을 저장하는 등의 프로그래밍도 가능하니 여러 가지를 시도해보는 것도 좋을 듯합니다.

 

5. 부록

아래는 설치와 서버 실행을 좀 더 편리하게 이용하도록 간단히 작성한 쉘 스크립트입니다.

아래 스크립트를 sudo chmod +x mjpg-streamer_manager.sh로 실행 권한을 부여하면

sh mjpg-streamer_manager.sh 명령으로 손쉽게 설치 및 서버를 구동할 수 있습니다.

 

mjpg-streamer_manager.sh
0.00MB

 

#!/bin/bash

install(){ 
    echo 'Download & Install mjpg-streamer' 
    echo 'update apt' 
    sudo apt-get update
    
    echo 'upgrade apt'
    sudo apt-get upgrade
    
    echo 'package install'
    sudo apt-get install gcc g++ cmake libjpeg8-dev
    
    echo 'Download mjpg-streamer...'
    git clone https://github.com/jacksonliam/mjpg-streamer.git
    
    echo 'Building...'
    cd mjpg-streamer/mjpg-streamer-experimental
    
    make distclean
    make CMAKE_BUILD_TYPE=Debug
    sudo make install
    
    echo ''
    echo 'Download & Install Complete!'
}

run(){
    export LD_LIBRARY_PATH=./mjpg-streamer/mjpg-streamer-experimental/
    mjpg_streamer -o "output_http.so -w ./www -p 9090" -i "input_raspicam.so -fps 30 -preview" 
}

start(){
    echo 'mjpg-streamer Load Manager By overload'
    echo 'Select Your Action''s'
    echo '======================'
    echo '1) mjpg-streamer Install'
    echo '2) mjpg-streamer Run'
    echo 'any) cancel'
    echo '======================'
    
    echo -n 'number: '
    read num
    
    case $num in
        1)
            install
            ;;
        2)
            run
            ;;
        *)
            echo 'cancel'
    esac
}

start

 

이것으로 라즈베리파이와 카메라 모듈을 이용한 실시간 스트리밍 포스팅을 마칩니다.