MJPG-Streamer 는 스트리밍에 특화되어 있는 서비스입니다
필요한 패키지 설치하기
카메라 영상 스트리밍을 위한 MJPG-Streamer를 소스 코드에서 빌드하고 설치하기 위해서 필요한 패키지를 다운받아야 합니다.
sudo apt update
sudo apt install git build-essential libjpeg-dev imagemagick libv4l-dev cmake
설치하는 라이브러리들
build-essential
- 이 패키지는 소프트웨어를 빌드하는 데 필요한 컴파일러, 링커, make 등의 도구를 포함합니다.
- 즉 소스 코드를 컴파일하여 실행 가능한 프로그램으로 만들기 위해 필요합니다.
libjpeg-dev
- JPEG 이미지 압축과 디컴프레션을 위한 라이브러리의 개발 헤더 파일과 파이브러리를 제공합니다.
- MJPG-Streamer 는 MJPEG 포맷으로 스트리밍하기 위해 JPEG 라이브러리를 사용합니다.
imagemagick
- 이미지 변환 및 편집을 위한 도구 모음입니다.
- 이미지 처리를 위한 추가 기능을 제공하며, MJPG-Streamer나 플러그인에서 이미지를 조작할 때 사용할 수 있습니다.
libv4l-dev
- Video4Linux(V4L) API를 사용하여 비디오 장치와 상호 작용하기 위한 개발 파일을 제공합니다.
- MJPG-Streamer는 V4L2 인터페이스를 통해 카메라와 통신하므로, 이 라이브러리가 필요합니다.
cmake
- 플랫폼 간 빌드 시스템으로, 소스 코드의 빌드 프로세스를 관리합니다.
- MJPG-Streamer 프로젝트는 CMake 를 사용하여 빌드 구성을 관리하므로, 빌드 과정에 필요합니다.
v4l-utils 로 비디오 장치 정보 확인하기
v4l-utils는 Video4Linux(V4L) 장치를 제어하고 관리하기 위한 도구 모음입니다. Video4Linux는 리눅스에서 비디오 장치를 위한 커널 API이며, 웹캠, TV 수신 카드, 비디오 캡처 장치 등과 상호 작용하는 데 사용됩니다.
v4l-utils 설치하기
sudo apt update
sudo apt install v4l-utils
장치 목록 및 정보 확인
위에서 확인되는 video 들을 확인한 후 아래 카메라들을 비교하여 현재 연결한 카메라의 video 의 번호를 알 수 있게 됩니다.
v4l2-ctl --list-devices
카메라 지원 포맷 및 해상도 확인
v4l2-ctl --list-formats-ext
MJPG-Streamer 사용하여 스트리밍
MJPG-Streamer는 Linux 및 Unix 계열 시스템에서 USB 웹캠 또는 기타 비디오 장치로부터 MJPEG(Motion JPEG) 형식의 영상을 받아 HTTP를 통해 실시간으로 스트리밍하는 오픈 소스 소프트웨어입니다. 주로 라즈베리 파이와 같은 임베디드 시스템에서 저전력의 실시간 비디오 스트리밍을 구현하기 위해 사용됩니다.
- 실시간 비디오 스트리밍: MJPG-Streamer는 웹 브라우저나 다른 클라이언트에서 실시간으로 영상을 볼 수 있도록 HTTP 프로토콜을 통해 MJPEG 스트림을 제공합니다.
- 경량화된 설계: 시스템 자원을 적게 사용하도록 설계되어, 라즈베리 파이와 같은 저사양 장치에서도 원활하게 작동합니다.
- 다양한 입력 소스 지원: USB 웹캠, 라즈베리 파이 카메라 모듈, 비디오 캡처 카드 등 다양한 비디오 장치로부터 입력을 받을 수 있습니다.
- 플러그인 구조: 입력과 출력을 처리하는 다양한 플러그인을 제공하여 유연한 구성이 가능합니다.
MJPG-Streamer 소스 코드 다운로드
mjpg-streamer 를 사용하여 스트리밍을 할 예정입니다.
그렇게 때문에 mjpg-streamer 를 다운받습니다.
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
빌드 및 설치
cmake .
make
sudo make install
USB 카메라 스트리밍 시작
다음 명령어를 통해 스트리밍을 시작합니다. 원하는 옵션으로 바꿔줄 수 있습니다.
mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 640x480 -f 30" -o "output_http.so -p 8080 -w ./www"
- MJPG-Streamer는 입출력을 처리하는 플러그인 구조입니다.
- -i : 입력 플러그인을 지정합니다, 비디오 장치로부터 영상을 받아옵니다.
- -o : 출력 플러그인을 지정합니다, 수집된 영상을 원하는 방식으로 출력합니다.
- -d /dev/video0 : 사용 중인 카메라 장치 지정
- -r 640x480 : 해상도 설정
- -f 30: 프레임 레이트 설정
- -p 8080: HTTP 스트림 포트 설정
카메라가 지원하는 포맷 목록 확인하기
카메라가 지원하는 해상도, 프레임을 확인할 수 있습니다.
- 비디오는 최상단 명령어를 통해 장치의 video 를 찾아서 적어줍니다.
v4l2-ctl --device=/dev/video0 --list-formats-ext
카메라 모듈 실행 여부 확인하기
카메라가 실행되고 있는지 확인하기 위해서 다음 명령어를 사용합니다.
lsmod | grep uvcvideo
백그라운드 실행 및 자동 시작 설정
- 백그라운드에서 실행하려면 명령어 끝에 &를 추가합니다.
- 부팅 시 자동 실행하려면 rc.local 또는 systemd를 사용하여 스크립트를 설정합니다.
라즈베리파이로 촬영되는 스트리밍 영상 Web 주소
촬영되는 영상을 실시간으로 다음 링크를 통해 확인할 수 있습니다.
http://[라즈베리 파이 IP 주소]:[포트 번호]/?action=stream
촬영되는 영상 녹화
ffmpeg -i http://라즈베리파이_IP주소:8080/?action=stream -c copy output_file.mp4
MJPG-Streamer를 사용하여 스트리밍되는 영상을 받아 ffmpeg로 녹화하는 것입니다. 이 명령어를 통해 MJPG-Streamer가 제공하는 실시간 스트림을 ffmpeg가 입력으로 받아 실시간 그대로 파일로 저장하게 됩니다.
- ffmpeg: 멀티미디어 프레임워크로, 카메라로부터 받는 영상 스트림을 파일로 저장하는 역할을 합니다.
- -i : MJPG-Streamer 가 제공하는 HTTP 스트림을 지정합니다. (영상 URL을 작성합니다)
- -c copy: 코덱을 재인코딩하지 않고 원본 데이터를 그대로 복사하여 저장 속도를 증가시키는 옵션입니다.
- 이는 CPU 부하를 줄이고 저장 속도를 높입니다.
- 원본인 MJPEG 포맷이 그대로 저장되므로 파일의 크기가 클 수 있습니다.
- output_file.mp4 는 녹화된 영상을 저장할 출력 파일의 이름입니다.
- 확장자는 mp4 이지만 실제로는 MJPEG 포맷의 비디오 스트림이 저장됩니다.
영상 코덱 종류
비디오를 저장하는데 있어 여러 종류의 코덱들로 인코딩할 수 있습니다.
코덱이란?
코덱(Codec)은 코더(Coder)와 디코더(Decoder)의 합성어로, 디지털 데이터의 인코딩(압축)과 디코딩(압축 해제)을 담당하는 기술 또는 소프트웨어를 의미합니다. 주로 오디오와 비디오 같은 멀티미디어 데이터를 효율적으로 저장하거나 전송하기 위해 사용됩니다.
영상 코덱은 다음과 같은 종류들이 존재합니다.
- H.264 (AVC)
- 현재 가장 널리 사용되는 비디오 코덱으로, 높은 압축률과 우수한 화질을 제공합니다.
- 대부분의 기기와 플레이어에서 호환성이 뛰어납니다.
ffmpeg -i http://라즈베리파이_IP주소:8080/?action=stream -vcodec libx264 -acodec aac output_file.mp4
- H.265 (HEVC)
- H.264의 후속 버전으로, 동일한 화질에서 더 높은 압축률을 제공합니다.
- 최신 기기에서 지원되지만, 일부 오래된 기기에서는 호환되지 않을 수 있습니다.
ffmpeg -i http://라즈베리파이_IP주소:8080/?action=stream -c:v libx265 -c:a copy output_file.mp4
- mpeg4
- 비교적 오래된 코덱으로, 일부 구형 기기에서 호환성이 좋습니다.
- 압축 효율은 최신 코덱보다 떨어집니다.
ffmpeg -i http://라즈베리파이_IP주소:8080/?action=stream -vcodec mpeg4 -acodec mp3 output_file.avi
- VP8
- 코덱의 이름은 libvpx 입니다.
- 구글에서 개발한 오픈 소스 코덱으로, 웹 스트리밍에 많이 사용됩니다.
- 호환성은 H.264보다 낮습니다.
ffmpeg -i http://라즈베리파이_IP주소:8080/?action=stream -vcodec libvpx -acodec libvorbis output_file.webm
- VP9
- VP8의 후속 코덱으로, 더 높은 압축률을 제공합니다.
- 인코딩 시간이 길 수 있습니다.
ffmpeg -i http://라즈베리파이_IP주소:8080/?action=stream -vcodec libvpx-vp9 -acodec libopus output_file.webm
코덱 정리
• 호환성과 품질을 모두 고려한다면: H.264 (libx264)를 사용하는 것을 추천.
• 파일 크기를 최대한 줄이고 싶다면: H.265 (libx265)나 VP9를 추천.
• 인코딩 속도가 중요하다면: 인코딩 속도가 빠른 코덱이나 하드웨어 가속을 추천.