µStreamer는 모든 V4L2 장치에서 네트워크로 MJPEG 비디오를 스트리밍할 수 있는 가볍고 매우 빠른 서버입니다. 모든 새로운 브라우저는 mplayer, VLC 등과 같은 대부분의 비디오 플레이어뿐만 아니라 이 비디오 형식을 기본적으로 지원합니다. µStreamer는 가능한 최고 해상도와 FPS로 VGA 및 HDMI 스크린캐스트 하드웨어 데이터를 스트리밍하도록 설계된 PiKVM 프로젝트의 일부입니다.
µStreamer는 input_uvc.so
및 output_http.so
플러그인이 있는 mjpg-streamer와 매우 유사하지만 몇 가지 중요한 차이점이 있습니다. 핵심은 다음과 같습니다.
특징 | µ스트리머 | mjpg-스트리머 |
---|---|---|
멀티스레드 JPEG 인코딩 | ✔ | ✘ |
하드웨어 이미지 인코딩 라즈베리 파이에 | ✔ | ✘ |
장치가 작동할 때의 동작 스트리밍하는 동안 연결이 끊어졌습니다 | ✔ 검은색 화면이 나타납니다NO SIGNAL .다시 연결될 때까지 | ✘ 스트리밍을 중지합니다 1 |
DV 타이밍 지원 - 해상도를 변경하는 기능 소스 신호로 즉석에서 | ✔ | ☹ 부분적으로 그렇습니다 1 |
스트리밍 시 프레임을 건너뛰는 옵션 트래픽을 절약하기 위해 HTTP를 통한 정적 이미지 | ✔ 2 | ✘ |
UNIX 도메인 소켓을 통한 스트리밍 | ✔ | ✘ |
시스템 소켓 활성화 | ✔ | ✘ |
재컴파일하지 않고 로그 디버그 성능 통계 로그, HTTP 스트리밍 매개변수에 대한 액세스 | ✔ | ✘ |
파일 제공 옵션 내장된 HTTP 서버 포함 | ✔ | ☹ 일반 파일만 |
스트림 상태에 대한 신호 libgpiod를 사용하여 GPIO에서 | ✔ | ✘ |
웹캠 제어(포커스, 서보)에 대한 액세스 HTTP를 통한 밝기 등의 설정 | ✘ | ✔ |
mjpg-streamer API와의 호환성 | ✔ | :) |
각주:
1
µStreamer 이전에 mjpg-streamer에 DV 타이밍 지원을 추가하고 장치 연결 끊김으로 인해 중단되는 것을 방지하는 패치를 만들었습니다. 아쉽게도 패치는 완벽하지 않으며 매번 작동한다고 보장할 수 없습니다. mjpg-streamer의 소스 코드는 매우 복잡하고 구조를 이해하기 어렵습니다. 이를 염두에 두고 향후 멀티스레딩 및 JPEG 하드웨어 가속이 필요하다는 점과 함께 레거시 코드를 지원하는 대신 처음부터 나만의 스트림 서버를 만들기로 결정했습니다.
2
이 기능을 사용하면 HDMI 스트리밍 시 나가는 트래픽을 몇 배로 줄일 수 있지만 CPU 사용량이 약간 늘어납니다. 아이디어는 HDMI가 완전한 디지털 인터페이스이며 캡처된 각 프레임이 이전의 바이트 단위와 동일할 수 있다는 것입니다. 동일한 이미지를 1초에 여러 번씩 인터넷을 통해 스트리밍할 필요가 없습니다. --drop-same-frames=20
옵션을 활성화하면 µStreamer는 일치하는 모든 프레임을 삭제합니다(연속 20개 제한). 각각의 새 프레임은 먼저 길이를 기준으로 이전 프레임과 일치한 다음 memcmp()
사용하여 일치됩니다.
뒷마당 웹캠에서 라이브 스트리밍할 예정이고 이를 제어해야 하는 경우 mjpg-streamer를 사용하세요. 높은 FPS의 고품질 이미지가 필요하다면 승리를 위한 µStreamer가 필요합니다.
µStreamer를 시스템에 다운로드하고 소스에서 빌드해야 합니다.
make
, gcc
, pthreads
지원이 포함된 libevent
, libjpeg9
/ libjpeg-turbo
및 libbsd
(Linux에만 해당)가 필요합니다.
sudo pacman -S libevent libjpeg-turbo libutil-linux libbsd
.sudo apt install libevent-dev libjpeg62-turbo libbsd-dev
. WITH_GPIO=1
의 경우 libgpiod-dev
, WITH_SYSTEMD=1
의 경우 libsystemd-dev
, WITH_JANUS WITH_JANUS=1
의 경우 libasound2-dev libspeex-dev libspeexdsp-dev libopus-dev
를 추가합니다.libjpeg62-turbo
libjpeg62-turbo-dev
로 바꿉니다.sudo apt install build-essential libevent-dev libjpeg-dev libbsd-dev
.sudo apk add libevent-dev libbsd-dev libjpeg-turbo-dev musl-dev
. WITH_PTHREAD_NP=0
으로 빌드하세요. GPIO 지원을 활성화하려면 libgpiod를 설치하고 옵션 WITH_GPIO=1
전달하세요. 컴파일러가 누락된 함수 pthread_get_name_np()
(또는 유사한 함수)에 대해 보고하는 경우 WITH_PTHREAD_NP=0
옵션을 추가합니다(기본적으로 활성화되어 있음). setproctitle()
과 유사한 오류가 발생하면 WITH_SETPROCTITLE=0
옵션을 추가하세요.
가장 편리한 프로세스는 µStreamer Git 저장소를 시스템에 복제하는 것입니다. Git이 설치되어 있지 않고 설치하고 싶지 않은 경우 wget https://github.com/pikvm/ustreamer/archive/refs/heads/master.zip
사용하여 GitHub에서 소스를 다운로드하고 압축을 풀 수 있습니다. .
$ git clone --depth=1 https://github.com/pikvm/ustreamer
$ cd ustreamer
$ make
$ ./ustreamer --help
위에서 설명한 대로 µStreamer 클론이 있다고 가정하면 다음과 같이 µStreamer를 업데이트할 수 있습니다.
$ cd ustreamer
$ git pull
$ make clean
$ make
Raspberry Pi의 M2M 하드웨어 인코딩을 위해서는 최소 5.15.32 커널이 필요합니다. 이전 커널의 OpenMAX 및 MMAL 지원은 더 이상 사용되지 않으며 제거되었습니다.
인수가 없으면 ustreamer
640x480 해상도로 /dev/video0
열고 http://127.0.0.1:8080
에서 스트리밍을 시작하려고 시도합니다. --device
, --host
및 --port
매개 변수를 사용하여 이 동작을 재정의할 수 있습니다. 예를 들어 전 세계로 스트리밍하려면 다음을 실행합니다.
# ./ustreamer --device=/dev/video1 --host=0.0.0.0 --port=80
❗ 보안상의 이유로 µStreamer v2.0 도메인 간 요청이 기본적으로 비활성화되어 있으므로 참고하세요. 이전 동작을 활성화하려면 --allow-origin=*
옵션을 사용하십시오.
Raspberry Pi에서 TC358743 기반 캡처 장치로 µStreamer를 실행하는 권장 방법:
$ ./ustreamer
--format=uyvy # Device input format
--encoder=m2m-image # Hardware encoding on V4L2 M2M driver
--workers=3 # Workers number
--persistent # Suppress repetitive signal source errors (for example when HDMI cable was disconnected)
--dv-timings # Use DV-timings
--drop-same-frames=30 # Save the traffic
❗ 다른 브라우저에 대해 --drop-same-frames
사용하려면 특정 URL /stream
매개변수를 사용해야 합니다(자세한 내용은 URL /
참조).
ustreamer --help
사용하면 언제든지 전체 옵션 목록을 볼 수 있습니다.
/boot/firmware/usercfg.txt에 다음 줄을 추가합니다.
gpu_mem=128
dtoverlay=tc358743
CMA 크기 확인:
$ dmesg | grep cma-reserved
[ 0.000000] Memory: 7700524K/8244224K available (11772K kernel code, 1278K rwdata, 4320K rodata, 4096K init, 1077K bss, 281556K reserved, 262144K cma-reserved)
128M보다 작은 경우 /boot/firmware/cmdline.txt에 다음을 추가하십시오.
cma=128M
변경 사항을 저장하고 재부팅합니다.
컨테이너 시작:
$ docker run --device /dev/video0:/dev/video0 -e EDID=1 -p 8080:8080 pikvm/ustreamer:latest
그런 다음 포트 8080(예: http://raspberrypi.local:8080)에서 웹 인터페이스에 액세스합니다.
$ docker run --rm pikvm/ustreamer:latest
--format=uyvy
--workers=3
--persistent
--dv-timings
--drop-same-frames=30
ustreamer를 시작하기 전에 HDMI EDID를 설정하려면 -e EDID=1
추가하세요. -e EDID_HEX=xx
와 함께 사용하여 사용자 정의 EDID 데이터를 지정합니다.
Raspberry Pi v3 카메라의 사용 예(Raspbian의 libcamera-tools
및 libcamera-v4l2
(둘 다 설치)에 있는 libcamerify
필요):
$ sudo modprobe bcm2835-v4l2
$ libcamerify ./ustreamer --host :: --encoder=m2m-image
v2 카메라의 경우 libcamerify
와 동일한 트릭을 사용할 수 있지만 raspi-config
에서 레거시 카메라 모드를 활성화할 수 있습니다.
Raspberry Pi v1 카메라의 사용 예:
$ sudo modprobe bcm2835-v4l2
$ ./ustreamer --host :: -m jpeg --device-timeout=5 --buffers=3 -r 2592x1944
❗ 최신 카메라 모델은 최대 해상도가 다릅니다. PiCamera 설명서에서 지원되는 해상도를 확인할 수 있습니다.
❗ 프레임 속도가 좋지 않으면 카메라가 사진 모드로 전환되어 프레임 속도는 낮아지지만 사진 품질은 더 높아질 수 있습니다. 이는 bcm2835-v4l2
1280x720
보다 높은 해상도에서 사진 모드로 전환되기 때문입니다. 이 문제를 해결하려면 다음과 같이 max_video_width
및 max_video_height
모듈 매개변수를 전달하세요.
$ modprobe bcm2835-v4l2 max_video_width=2592 max_video_height=1944
µStreamer는 H.264 압축 및 Janus WebRTC 서버를 사용하여 대역폭 효율적인 스트리밍을 지원합니다. 자세한 내용은 Janus 통합 가이드를 참조하세요.
uStreamer가 Nginx 프록시 뒤에 있는 경우 버퍼링 동작으로 인해 비디오 스트림에 대기 시간이 발생합니다. 추가 대기 시간을 제거하기 위해 Nginx의 버퍼링을 비활성화할 수 있습니다.
location /stream {
postpone_output 0;
proxy_buffering off ;
proxy_ignore_headers X-Accel-Buffering;
proxy_pass http://ustreamer;
}
v4l2 유틸리티는 USB 웹캠 설정 및 정보를 관리하는 도구를 제공합니다. 스크립트를 사용하여 조정하고 수동으로 또는 cron을 통해 실행할 수 있습니다. 예를 들어 하루 중 특정 시간에 노출 설정을 변경하려면 cron을 실행하세요. 이 패키지는 모든 Linux 배포판에서 사용할 수 있으며 일반적으로 v4l-utils
라고 합니다.
v4l2-ctl --list-devices
.v4l2-ctl -d /dev/video0 --list-ctrls
.v4l2-ctl -d /dev/video0 --list-formats-ext
.v4l2-ctl -d /dev/video0 --get-ctrl=exposure_auto
.v4l2-ctl -d /dev/video0 --set-ctrl=exposure_auto=1
. 여기에서 더 많은 예를 찾을 수 있습니다. 문서는 man v4l2-ctl
에서 볼 수 있습니다.
저작권 (C) 2018-2024 작성자: Maxim Devaev [email protected]
이 프로그램은 무료 소프트웨어입니다. 자유 소프트웨어 재단(Free Software Foundation)에서 발표한 GNU General Public License(라이센스 버전 3) 또는 (귀하의 선택에 따라) 이후 버전의 조건에 따라 재배포 및/또는 수정할 수 있습니다.
이 프로그램은 유용할 것이라는 희망으로 배포되지만 어떠한 보증도 제공하지 않습니다. 상품성이나 특정 목적에의 적합성에 대한 묵시적인 보증도 없이 말입니다. 자세한 내용은 GNU 일반 공중 사용 허가서를 참조하세요.
이 프로그램과 함께 GNU General Public License 사본을 받으셨을 것입니다. 그렇지 않은 경우 https://www.gnu.org/licenses/를 참조하세요.