웹 서버를 통해 Raspberry Pi 카메라 모듈에서 H.264 비디오를 스트리밍하려면 어떻게해야합니까?


50

그래서 나는 오늘 Raspberry Camera를 얻었고 여전히 잘 작동했습니다.

JPEG 형식으로 이미지를 캡처하십시오.

raspistill -o image.jpg

H.264 형식 의 5 초 비디오를 캡처하십시오 .

raspivid -o video.h264

쉽게 사용할 수있는 HTML5 를 활용하기 위해 추가 응용 프로그램을 설치하고 싶지 않습니다 . Chrome / Safari 에는 H.264 용 내장 디코더가 있으므로 브라우저를 URL로 가리키고 스트림을보고 싶습니다.

어떻게하면 되나요?


2
나도 이것에 노력하고 있습니다. 내가 생각하는 당신의 nginx 또는 그런 일에 MP4 지원을 추가해야합니다. 내가 돌파구를 가지고 있는지 알려줄 것입니다.
recantha

@recantha 스트리밍 비디오에 새로운 돌파구가 있었습니까?
Piotr Kula

3
내가 찾은 최고의 솔루션은 Silvan Melchoir의 RaspiMJPEG를 기반으로합니다. 모든 것을 설명하는 Raspberry Pi Foundation의 포럼 링크가 포함 된 내 블로그를 살펴보십시오. ( recantha.co.uk/blog/?p=11176 )
recantha

2
예, 다양한 장치로 스트리밍 할 수있는 것이 좋습니다. 어떤 FPS와 지연이 발생합니까? uv4l을 VLC 및 OSD와 잘 작동하도록했습니다. 매우 짧고 나쁜 데모. 곧 더 나아질 것입니다. 시행 착오 후 밤 늦게 만들어졌습니다. youtu.be/LO10Ytlauag
Piotr Kula

@ppumkin RaspiMJPEG가 실행되는 동안 어떻게 파이썬 스크립트를 통해 기록 할 수 있습니까? 그것은 비디오 녹화를 시작하지만 .h264 형식으로 기록합니다. start_recording을 누르면 파이썬 스크립트를 어떻게 실행할 수 있습니까?
Coderaemon

답변:


32

HLS로 스트리밍

라이브 비디오를 스트리밍하는 Apple의 독점적 방법. HLS (HTTP Live Streaming)라고하며 Apple 기술에서만 지원됩니다. Google (Chromium / YouTube)은 dash mpeg 라는 자체 구현을 사용하며 다른 모든 사람들은 혼란 스럽거나 MP4로 캡슐화 된 H.264를 사용 합니다.

찬성

  • LAN에서 HD 1080p.m3u8재생 목록 을 지원하는 모든 장치로 스트리밍 할 수 있습니다
  • HTML5 의미를 사용합니다 (그러나 표준화 된 형식은 아닙니다)
  • jwplayer 6와 같은 타사 프리미엄 소프트웨어의 일부 지원을 사용할 수 있습니다

단점

  • 5 초 이상 지연됩니다 (이 응용 프로그램에서는 iPhone에서 AppleTv로 미러링을 사용하면 50ms-500ms). 따라서 로봇이나 헬리콥터와 같은 즉각적인 반응이 필요한 원격 제어 애플리케이션에는 적합하지 않습니다.
  • 플래시가 지원 될 수있는 광범위한 브라우저 지원을 원할 경우 타사 소프트웨어 비용을 지불해야합니다.

m3u8

  • .m3u8단순히 M3U 형식의 UTF-8 버전입니다. (.m3u 파일은 다양한 인코딩을 가질 수 있습니다.) 어떤 사람들은 .m3u8에서 .m3u로 이름을 바꾸면 모든 HTML5 브라우저에서 예상대로 작동한다고 주장합니다. 나는 이것을 시도했지만 그것은 효과가 없었다.

이 스트리밍의 기본 개념은 최소 5 초 길이의 짧은 파일 세그먼트 (이 예제에서는 속도를 높일 수있는 새로운 방법을 사용할 수 있음)가 기록되고 적절한 파일에 저장된다는 것입니다. 재생 목록 파일은 새 파일 이름으로 업데이트되며 클라이언트는 항상이 재생 목록을 폴링하고 최신 파일을 다운로드합니다. 클라이언트에서 비디오를 매끄럽게 병합하는 몇 가지 메커니즘이 있습니다. 이것이 바로 다른 개발자들이 많은 노력이 필요하고 HTML5 표준을 준수하지 않기 때문에이를 구현하고 싶지 않은 이유입니다 (실시간 스트림에 적합한 HTML5 표준이 없더라도 ?? Ehh, sigh ).

설치

당신은 컴파일 할 필요가 ffmpeg- 사용하지 않는 apt-get install위해 는 FFmpeg

이 5 시간이 소요될 수 있습니다 - 그것은 세그먼트 스트리밍을 지원하는 버전 1.1 이상이 될 수 있습니다. 이를 사용하여 복제하고 컴파일 할 수 있습니다.

cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git

cd ffmpeg
./configure
make && make install
  • nginx를 (엔진-X)를 설치 - 의 nginx는 특별히 임베디드 심지를 위해 설계 및 가장 밝은 부분과 가장 빠른 된 PHP 순간에 사용할 수 -enabled 웹 서버. (예, 부피가 큰 아파치 보다 낫습니다 )
  • 예를 들어 www 폴더에 라이브 디렉토리를 만듭니다. /usr/share/nginx/www/

메이크업 배쉬 같은 호출 된 스크립트 파일을 video.sh적용 chmod +x그것과이를 붙여 넣습니다. 이제까지 당신의 기본 폴더 변경 의 HTTP 서버의 삶을. 나는 nginx,/usr/share/nginx/www/

#!/bin/bash

base="/data/live"

cd $base

raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
    -i - \
    -c:v copy \
    -map 0:0 \
    -f ssegment \
    -segment_time 4 \
    -segment_format mpegts \
    -segment_list "$base/stream.m3u8" \
    -segment_list_size 720 \
    -segment_list_flags live \
    -segment_list_type m3u8 \
    "segments/%08d.ts"


trap "rm stream.m3u8 segments/*.ts" EXIT

# vim:ts=2:sw=2:sts=2:et:ft=sh

재생 목록을로드 할 HTML 파일을 만듭니다.

<html>
  <head>
    <title>PiVid</title>
  </head>
  <body>
    <video controls="controls" width="1280" height="720" autoplay="autoplay" >
      <source src="stream.m3u8" type="application/x-mpegURL" />
    </video>
  </body>
</html>

지원하다

  • iPhone은 페이지를 열지QuickTime으로 떨어집니다 . 품질은 정말 놀랍습니다!
  • Windows Safari는 잘 스트리밍됩니다.
  • Macintosh 또는 Windows, QuickTime. 잘 흐릅니다.
  • Android 2.3.5에서 작동하지 않았지만 2.1.x부터 지원되어야합니다.
  • 윈도우, 크롬-아무것도
  • Windows, Internet Explorer 10 --- 없음 (지원되지 않는 비디오 유형)
  • Windows, VLC 미디어 플레이어 -없음

참조 : http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392

원본 코드 : https://github.com/AndyA/psips/blob/master/examples/hls.sh


ffmpeg의 컴파일 속도를 높이는 것과 관련하여 RPI의 낮은 계산 용량과 긴 ffmpeg의 컴파일 시간을 피하기 위해 Weeze와 함께 Qemu를 사용하려고 시도했지만 로그인에 장애물이 생겨 아치 이미지 로 시도해야했습니다. . 이것은 효과가 있었다. 또한 시도 우분투 이미지에 Sqeeze VirtualBo을 통해,
luboP

2
오래된 세그먼트를 자동으로 삭제하는 방법이 있습니까? 잠시 후 SD 카드가 가득 찼습니다. 또한 tmpfs에서이를 실행하고 SD 카드를 망치지 않고 삭제할 수 있기를 바랍니다.
Dimme

2
@Dimmme -segment_wrap 10ffmpeg에 인수로 추가 하면 최대 10 개의 세그먼트 파일이 사용됩니다.
모임

누구든지 작동하도록 했습니까? 파일이 생성되었지만 SPS / PPS 정보가 누락 된 것 같으므로 iOS Safari 또는 VLC에서 비디오가 재생되지 않습니다. stream.m3u8에는 segments/세그먼트 파일을 가리킬 때 포함되지 않았으므로 segment 폴더를 삭제했습니다. 내가 잘못 이해 했습니까?
모임

PSIPS 필터 바이너리를 통해 스트림을 파이프해야합니다. raspicam의 최신 버전이이 작업을 수행하기로되어있었습니다 .. 그러나 어떤 이유로 PSIPS없이 작동시킬 수 없었습니다
Piotr Kula

23

UV4L MMAL

MMAL을 매우 효율적으로 구현하는 Linux-Projects V4L2 드라이버의 업데이트에 대한 @mpromonet의 의견에 감사하지만 여전히 진행중인 작업입니다.

다음 지시 사항에 따라 Linux 프로젝트 저장소 를 설치하고 추가로 UV4L 드라이버를 설치하십시오. 그런 다음 서버와 mjpeg를 설치하십시오. 원하는 경우 다른 사람도 실험 할 수 있습니다.

모든 것을 설치 한 후에는 포트 8080에서 HTTP 서버에 액세스 할 수 있습니다. 또한 /etc/uv4l/conf파일을 확인하고 차이가 있으므로 mjpeg 또는 H.264를 원하는지 설정해야하지만 내장 웹을 통해 몇 가지 설정을 조정할 수 있습니다 섬기는 사람.

HTML 5

이것이 우리 모두가 기다리고 있었던 것 ( WebRTC )이며 새로운 드라이버 덕분에 (Raspberry Pi 2에서) 훌륭하게 작동합니다.

먼저, 다음 단계를 따르십시오 : http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14 :

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

# Add the following line to the file /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

sudo apt-get install uv4l-raspicam-extras

그런 다음 Raspberry Pi 2에 WebRTC를 설치하십시오 (Raspberry Pi 1의 경우 다른 옵션에 대해서는 링크 된 사이트를 읽으십시오)

sudo apt-get install uv4l-webrtc

모든 드라이버를 다시 시작하고

http://raspberry:8080/

이제 Chrome 또는 Firefox와 같은 최신 브라우저로 바로 대기 시간이 짧은 고품질 비디오 스트리밍이 제공됩니다. (아마도 사파리이지만 Winblows와 Internet Explorer를 더 이상 사용하지 않기 때문에 확인할 수 없습니다 ... eh)

MJPEG

기본적으로 mjpeg1080p에서 사용 되며 매우 느립니다. 800x600 프레임 크기로 조정하고 iSpy와 같은 것을 사용하여 비디오를 처리했습니다. 보안을 위해 선명한 비디오로 약 10fps를 얻습니다. 이 드라이버보다 640x480에서 3fps보다 훨씬 좋습니다. Safari, Android Chrome 및 기타 거의 모든 기능을 갖춘 iPhone에서 작동합니다.

http://raspberrypi:8080/stream/video.mjpeg

이것은 또한 motion(아직 테스트하고 비교해야 함) 훨씬 더 잘 작동해야 함을 의미합니다 . 사용하도록 구성을 설정해야합니다. v4l2_palette 8또는v4l2_palette 2

H.264

이것은 이제 "스트리밍"으로 수정되었으며 VLC 미디어 플레이어를 통해 H.264 비디오를보기 위해 많은 시간을 들일 필요가 없습니다 . 스트림은 RAW H.264가 나쁘기 때문에 다른 곳에서 작업 해야하는 경우 스트림을 디 먹싱하거나 코드 변환 / 캡슐화해야합니다. bitrate=xxxxxxWi-Fi를 통해 스트리밍하는 경우 구성 파일 에서을 조정해야합니다 .

VLC 미디어 플레이어에서는 H.264 디먹 서를 사용하고 싶다고 알려 주어야합니다. 따라서 GUI를 사용하는 경우 인수를 추가해야합니다 :demux=264. 명령 행에서 vlc http.../video.h264 --demux h264. 그렇지 않으면 카메라 LED가 켜져 있어도 빈 화면이 나타납니다.

http://raspberrypi:8080/stream/video.h264

짜잔! 약 500ms 지연으로 HD 스트리밍 (200ms까지 조정) 이전 방법을 사용하는 것보다 훨씬 쉽습니다. 품질과 FPS는 훌륭하지만 MP4 또는 WebM으로 트랜스 코딩하지 않고 HTML5에 포함시킬 수는 없습니다 . 이것이 정말로 훌륭한 독립형 서버가 될 것이기 때문에 이것이 구현되기를 바랍니다.

RTSP / RTMP / RTP

지원 / 구현되지 않음

http://www.linux-projects.org/uv4l/tutorials/rtsp-server/

HLS

지원 / 구현되지 않음


video4linux아직 사용할 수있는 드라이버 가 없습니다 . 이것은 ffserver 를 사용하여 /dev/video0USB 웹캠을 사용 하거나 이와 유사한 데이터를 스트리밍 할 수 없음을 의미합니다 .

그렇기 때문에 HTML5 브라우저에 적합한 라이브 스트리밍을 찾기가 어렵습니다.


이제 video4linux공식 V4L2 드라이버 bcm2835-v4l2 및 사용자 공간 V4L2 드라이버가 있습니다 [ linux-projects.org/modules/sections/…
mpromonet

실제 v4l 드라이버입니까 아니면 혹독한 성능을 제공하는 raspivid 주변의 래퍼입니까?
Piotr Kula

1
공식 드라이버는 MMAL 인터페이스를 사용합니다 (소스 코드 [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… 참조) . 성능이 올바른 것 같습니다.
mpromonet

나는 지금 3 일 동안 이것을 가지고 놀고있다. mjpeg 인코딩은 훨씬 안정적이며 명확하게 iPhone, Android 또는 iSpy에서 800x600 @ 10fps를 볼 수 있습니다. h264는 1080p 30fps에서 훌륭하며 --demux h264플래그를 사용하여 vlc에서 볼 수 있습니다 . 모바일에서 사용하거나 웹 페이지에서 mp4 / webm으로 임베드하려면이 코드를 트랜스 코딩해야합니다. 그러나 효율적이고 품질면에서 진일보합니다. "기타"UV4L 비 리눅스-프로젝트 드라이버와 혼동하지 마십시오.
Piotr Kula

H264 메소드에 : demux = 264를 추가하면 vlc 클라이언트가 아닌 vlc 서버용입니다. 따라서 스마트 폰에서 VLC와 호환되도록 라즈베리에서 스트리밍을 시작하는 명령 줄은 다음과 같습니다./usr/bin/cvlc v4l2:///dev/video0 --v4l2-width 800 --v4l2-height 400 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}' :demux=264
Jaime M.

10

MJPEG로 스트리밍

U4VL

HTTP (S) 서버에서 빌드 된 커널 인터페이스.

http://www.linux-projects.org/uv4l/tutorials/streaming-server/

라즈베리 파이 캠 웹 인터페이스

silvanmelchior 의 멋진 프로젝트로 dvr과 같은 다중 대상 스트리밍 서버와 같은 웹 서버를 배포합니다. 더 많은 정보가 필요합니다

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

레거시 방법

mjpg를 사용한 스트리밍은 Internet Explorer 6을 포함한 거의 모든 브라우저에서 지원됩니다. H.264 이전에 사용 된 많은 카메라는 하드웨어 mjpg를 사용했습니다.이 카메라는 본질적으로 폴더에 가능한 빨리 JPEG 파일을 덤프 한 반면 mjpg는 파일을 버퍼로 읽고 삭제합니다. 그들. 일부 장치는 최대 25fps를 달성 할 수 있으며 연결 상태가 좋지 않더라도 최소한 1fps를 얻을 수 있습니다.

JPEG 파일이 인터넷을 통해 스트리밍하기에 너무 커서 H.264가 훨씬 빠르고 우수한 품질의 프로토콜이기 때문에 HD 카메라에서 mjpg에 대한 지원이 중단되었습니다.

우리는 카메라 모듈을 사용하여 H.264를 순식간에 방송 할 방법이 없기 때문에 이것은 가능한 폴백처럼 보입니다 ...

거의 즉각적이지만 1.5 fps 이상을 기대하지는 않습니다. 이것은 raspistill매우 슬프다! 100fps로 설정된 타임 랩스 기능을 사용하면 10fps를 제공해야하는데 raspistill초크가 발생하고 자체 성능에 심각한 문제가 있기 때문에 작동하지 않습니다 .

  1. /tmp속도 변경 을 위해 RAM을 사용하도록 /etc/default/tmpfs변경 RAMTMP=yes(이는 fps를 높이기위한 노력이지만 raspistill은 자체적으로 유지할 수 없습니다.)
  2. 재부팅
  3. apt-get 설치 git
  4. apt-get 설치 libjpeg8-dev
  5. apt-get 설치 libv4l-dev
  6. apt-get 설치 이미지 매직
  7. cd /usr/src, mkdir mjpg-streamer, cd mjpg-streamer ...
  8. git clone https://github.com/engine12/mjpg-streamer.git
  9. make USE_LIBV4L2=true clean all
  10. 선택 사항 오류가있는 경우
  11. sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
  12. sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
  13. makefile 내에서 input_file 및 output_http를 제외한 모든 플러그인을 주석 처리하고 다시 작성하십시오. 나는 여기에 많은 문제가있었습니다.
  14. 이진, 복사 mjpg_streamer및 플러그인 input_*.sooutput_*.so에를 /usr/local/bin. 그렇지 않으면 src 디렉토리에서 직접 실행하십시오.
  15. 선택적 끝
  16. mkdir /tmp/stream
  17. raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
  18. LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www" (이진 및 플러그인이있는 곳에서 이것을 실행하십시오)
  19. 이동 http://<IP-address>:8080
  20. 다음은 몇 가지 옵션입니다. 구식 방식으로 스트리밍하는 "실시간"스트리밍을 즐기십시오. 대부분의 브라우저에서 지원합니다 (현대, 이전 및 실험용).

나는 약 5 시간 동안 그것을 컴파일하는 데 어려움을 겪었습니다 ... sigh , 그러나 나는 모든 전화와 브라우저에서 스트림에 액세스 할 수 있기 때문에 이것을 사용할 것이라고 생각합니다. 더 좋은 운전자가 나올 때까지 기다려야합니다. 1 년 또는 2 년. :(

어떤 품질을 시도하더라도 스트림을 사용하여 1fps보다 빠르거나 느리지 않습니다. 720p와 1080p를 사용했는데 이미지 품질 만 좋아졌지만 fps는 LAN에서 차이가 없습니다. 더 작은 설정이 WAN / 3G 또는 다른 무선 전송에 도움이된다고 가정합니다.

raspistill은 이미지를 단일 파일에 씁니다. 병목 현상이 발생할 수 있습니다. 파일을 기록하고 mjpg strreamer가 파일을 읽고 삭제하여 I / O 차단을 유발하므로 raspistill이 파일에 쓸 수 없습니다.

내가 생각할 수있는 유일한 것은 FFmpeg에 파이프 된 raspivid를 사용하여 JPEG 파일을 생성하는 것입니다.이를 시도해야하며 아마도 raspistill을 사용하는 것보다 훨씬 빠릅니다. 충격적인 품질로 25fps를 얻었고 약 10 초 지연되었습니다. 설정을 조정하면 약 3fps이지만 CPU는 100 %가되었습니다. 비디오 스트림을 처리하는 데 하드웨어가 사용되지 않습니다 ...

raspivid -w 640 -h 480 -fps 25 -vf -t 86400000 -b 1800000 -o -  \
ffmpeg -i - \
    -f image2(?) \
    -c:v mjpeg \
    stream%d.jpg

또한 읽고 있었고 %draspistill 출력 파일 이름에서 사용할 수 있음을 발견했습니다 . 이것이 FPS를 향상 시킬지 궁금합니다. 또한 JPG 인코딩은 하드웨어 가속에서 가속되므로, 왜 그렇게 느린 지 알아 내기 위해 고심하고 있습니다 ...

%d파일 이름을 사용하여 놀라운 2 FPS를 얻었습니다 . 어떤 이유로, JPEG 파일을 작성하는 것은 raspistill에서 엄청나게 느립니다. 한숨.


지식을 공유해 주셔서 감사합니다.
user566245

10

2017 년 (또는 이전) raspivid은 더 이상 선호되는 방법이 아니며 Pi 개발자는 사람들에게 V4L2를 대신 사용할 것을 권장합니다.

따라서이 방법을 사용하면 대신 V4L2를 사용하여 RTP를 통해 H264를 스트리밍 할 수 있습니다 raspivid. 이 방법을 사용하면 드롭 아웃이 줄어들고 비트 전송률이 높아집니다.

#!/bin/sh

# Use V4L2 (preferred) instead of raspivid
# exposure_dynamic_framerate=1 (raspivid --fps 0) - reduce framerate/increase exposure in low light
# scene_mode=8 (raspivid --exposure night) - allow framerate reduction to increase exposure
v4l2-ctl -v width=1296,height=972,pixelformat=H264 \
        --set-ctrl=exposure_dynamic_framerate=1 \
        --set-ctrl=video_bitrate=5000000 \
        --set-ctrl=scene_mode=8

exec ffmpeg -f h264 -probesize 32 -r 30 -i /dev/video0 -vcodec copy -an -f rtp_mpegts udp://224.0.1.2:5004

이 스크립트는 비디오를 멀티 캐스트하며 다음 명령을 사용하여 LAN의 다른 컴퓨터에서 볼 수 있습니다.

ffplay -sync ext -an -fast -framedrop -probesize 32 -window_title "Raspberry Pi" -an udp://224.0.1.2:5004

-sync ext고정 프레임 속도로 비디오를 실행하고 Pi가 이보다 빠르게 프레임을 캡처하는 경우 지연되는 것과 달리 비디오가 가능한 한 빨리 재생되므로 실시간으로 실행됩니다. 이 방법에는 여전히 약간의 차이가 있지만 다른 raspivid방법 보다 나쁘지 않습니다 .

(팁 : 라우터 또는 IGMP를 지원하는 스위치에 연결되어있는 224.0.0.0/4경우 컴퓨터에서 방화벽이 설정되어 있지 않은지 확인하십시오 . 그렇지 않으면 라우터가 PC에 멀티 캐스트 트래픽을 원하는지 여부를 묻는 경우 PC가 절대 응답하지 않으며 PC가 표시되지 않습니다. 모든 비디오.)

디스크에 기록

아래 주석에서 녹음을 언급했듯이 여기에서 확장 할 것입니다. 다음과 같은 명령을 사용하여 네트워크 스트림을 디스크에 기록 할 수 있습니다.

ffmpeg -y -i udp://224.0.1.2:5004 -c copy \
  -f segment -segment_atclocktime 1 -segment_time 900 \
  -reset_timestamps 1
  -strftime 1 /path/to/storage/pi-%wT%H%M.mkv

파일 이름 man strftime에서 %기호 의 의미를 찾으십시오 . 이 예의 항목은 요일 번호 (0 = 일요일, 1 = 월요일 등)와 a T를 차례로 사용한 다음 시간을 사용합니다. 15 분마다 새 파일을 시작합니다.

분명히하기 위해이 기록 명령은 Pi에서도 작동하지 않지만 원격 PC (Pi 자체가 아닌)에서 실행되도록 의도되었습니다.

파일 이름에 날짜와 시간이 포함 된 15 분마다 새 파일을 가져 오므로 1 주일 후에 이미 사용 된 파일 이름이 생성되어 가장 오래된 파일을 덮어 쓰게됩니다. 다시 말해, 지난 주에 해당하는 푸티 지의 롤링 루프가 생깁니다. 일주일 이상 돌아 가지 않아도되는 보안 카메라에 이상적입니다.

부수적으로 이것은 약 500GB의 파일을 생성하므로 너무 많은 공간을 차지하지 않으려면 비트 레이트, 해상도를 조정하거나 파일을 더 빨리 (24 시간마다) 덮어 쓸 수 있습니다.


Cool-공유해 주셔서 감사합니다. 여기서 멀티 캐스트를 사용해야하는 이유를 설명 할 수 있습니까? 내가 배운 것은 멀티 캐스트가 거의 사용되지 않는다는 것입니다. 여전히-스크립트가 멋지게 보이며 사람들에게 도움이 될 것이라고 확신합니다. 감사합니다 +1
Piotr Kula

1
멀티 캐스트는 선택 사항입니다. 원하는 경우 일반 IP 주소로 대체 ​​할 수 있지만 ffserver둘 이상의 시스템에 피드를 표시하려면 사용하도록 명령을 변경 하거나 다른 서버 시스템 을 변경해야합니다 . 그런 다음 비디오 비트 전송률에 따라 2-3 개의 클라이언트가 Pi의 USB 이더넷 어댑터에 대역폭이 부족할 수 있습니다. 멀티 캐스트를 사용하면 서버를 실행할 필요가 없으며 (클라이언트 컴퓨터는 트래픽을 수신할지 무시할지 선택) 파이에 영향을주지 않고 비디오를 표시하는 수천 대의 컴퓨터를 가질 수 있습니다. .
Malvineous

설명해 주셔서 감사합니다. 그러나 멀티 캐스트는 내부 네트워크에서만 작동합니까? ISP가 멀티 캐스트 패킷을 받으면 일반적으로이를 제거합니다. 따라서 인터넷의 모든 사람에게 브로드 캐스트 할 수있는 것은 아닙니다. 대규모 내부 네트워크가 있고 대규모 스트림을 멀티 캐스트하면 네트워크에 영향을 줄 수 있다고 생각하십니까? 그러나 예 .. 스트림을보기 위해 선택한 IP로 UDP를 보내려고합니다. 그러나 어쨌든 멀티 캐스트 옵션을 좋아합니다. :) 감사합니다
Piotr Kula

1
예. 멀티 캐스트는 주로 내부 네트워크를위한 것입니다. IPv6에서는 더 잘 작동하지만 ISP의 협조가 필요하다고 생각합니다. Pi에서 서버를 실행할 필요가 없기 때문에 사용합니다 .Pi 구성을 변경하거나 Pi의 네트워크 대역폭을 오버로드하지 않고도 두 대의 컴퓨터에서 스트림을 볼 수 있고 디스크에 기록 할 수 있습니다. 내부 네트워크가 크면 멀티 캐스트 트래픽 만 보내도록 설계된 IGMP 가능 스위치를 사용하고있을 것입니다.
Malvineous

1
설명해 주셔서 감사합니다. 이제는 가정 사용자에게 영향을 미치지 않는 약간의 경고와 함께 멀티 캐스트를 사용하면 많은 이점을 볼 수 있습니다. 나는 이것을 시도 할 것입니다. 이해하기 위해 지적해야 할 것은 간단하고 명백한 일입니다. 그리고 당신의 업데이트를보고 .. 기록 비트는 실제로 정말 정말 멋지다!
Piotr Kula

4

컴파일 된 모듈 nginx-rtmp 를 사용하여 Raspberry Pi에서 웹 서버로 스트리밍했습니다 .

번거 로움을 줄이기 위해 Arch Linux Armffmpeg 과 같은 롤링 배포판을 권장합니다 .

raspivid -vf -t 0 -fps 25 -b 2000000 -o - |
ffmpeg -i - -vcodec copy -an -r 25 -f flv rtmp://x220/myapp/mystream

몇 가지 참고 사항 :

따라서 라즈베리 파이의 라이브 스트리밍은 일시적인 브로드 캐스트에는 문제가 없지만 대역폭이 너무 많이 걸리기 때문에 항상 켜져있는 웹 캠에는 적합하지 않다고 생각합니다. 당신은 오디오를 얻지 못할 것이고, 그렇게한다면, 그것은 동기화하는 임무가 될 것입니다.

비디오 녹화와 동시에보다 효율적으로 오디오를 녹화 할 수 있습니다. 나중에 오디오 피드를 나중에 mux로 변환하여 WebM으로 변환 하여 HTML 비디오 태그가있는 정적 파일로 httpd에 넣습니다. 워크 플로는 매우 어색하지만 브라우저 전체에서 어려움없이 작동하는 효율적인 브로드 캐스트에 대해 생각할 수있는 최선입니다.


1
그래도 대역폭과 해상도를 제어 할 수 있습니다. CCTV 용 로컬 LAN 스트리밍을 사용한다면 문제가되지 않습니다. 인터넷을 통한 방송은 주문형 및 / 또는 훨씬 낮은 해상도가 필요할 수 있습니다. 그러나 그것을하는 또 다른 방법. 감사합니다 +1
Piotr Kula

그리고 어떻게 작동한다고 가정합니까? FFMPEG에 "RTMP_Connect0, 소켓을 연결하지 못했습니다. 111 (연결이 거부되었습니다.")
Flash Thunder


2

Piotr Kula의 답변 은 올바른 궤도에있는 것 같지만 Raspberry stretch에는 구식입니다.

Raspberry Stretch에서 uv4l에 대한 지침이 업데이트되었습니다.

https://www.linux-projects.org/uv4l/installation/

# switch to superuser mode
sudo -s
# add the repository key for uv4l
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add 
# add the url for the u4vl repository to apt
echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install uv4l uv4l-raspicam
apt-get install uv4l-raspicam-extras
# do not forget to install the server - see what happens if you do
# below
apt-get install uv4l-server
reboot

/etc/uv4l/uv4l-raspicam.conf를 통해 uv4l 옵션을 tweek하고 다음을 사용하여 서비스를 다시 시작할 수 있습니다.

sudo service uv4l_raspicam restart

필자의 경우 즉시 작동하지 않습니다 (uv4l 서버 설치를 잊어 버린 경우 ...). 다음 주석은 유사한 문제를 디버깅하는 데 도움이 될 수 있습니다.

서버가 다음을 실행 중인지 확인했습니다.

pgrep -fla uv4l
995 /usr/bin/uv4l -f -k --sched-fifo --mem-lock --config-file=/etc/uv4l/uv4l-raspicam.conf --driver raspicam --driver-config-file=/etc/uv4l/uv4l-raspicam.conf --server-option=--editable-config-file=/etc/uv4l/uv4l-raspicam.conf

그리고 그것이 들었는지 여부

sudo netstat -tulpn 

그러나 목록에 uv4l에 대한 항목이 없습니다. 포트 8080에 대한 것으로 예상

UV4L 구성 방법 에서 명령을 시도 했습니까?

uv4l --sched-rr --mem-lock --driver raspicam \
> --width 960 --height 540 --framerate 30 \
> --encoding mjpeg --vflip --hflip
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 960x544, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

그러나 여전히 서버가 자동으로 시작되지 않았습니다 ...

man uv4l

그런 다음 옵션을 보여 주었다

--enable-server [=arg(=required)] (=auto)
          enable the streaming server. Possible values are: 'auto' (tenta‐
          tively start the server), 'required' (exit if failing  to  start
          the  server,  only  works if --foreground is enabled), 'off' (no
          server at all).

그래서 나는 시도했다 :

pkill uv4l
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

그러나 포트 8080 또는 그 밖의 곳에서 여전히 실행중인 서버는 없습니다. 따라서 맨 페이지에 필요한 "--foreground"옵션을 잊어 버린 것 같습니다.

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<warning> [core] libserver.so: cannot open shared object file: No such file or directory
<alert> [core] No Streaming Server detected

이제는 확실한 힌트입니다! 아직 서버가없는 것 같습니다. 설치하십시오 :

sudo apt-get install uv4l-server

다시 시도하십시오.

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<notice> [server] HTTP/HTTPS Streaming & WebRTC Signalling Server v1.1.125 built on Mar  9 2019
<warning> [server] SSL is not enabled for the Streaming Server. Using unsecure HTTP.
<notice> [core] Streaming Server loaded!
<notice> [core] Registering device node /dev/uv4l
<notice> [server] Web Streaming Server listening on port 8080

서버는 이제 http : // pi : 8080 에서 사용 가능합니다 (pi를 서버의 IP 또는 호스트 이름으로 대체하십시오)

재부팅 후 다른 명령을 입력하지 않고 작동했습니다.


1

UV4L은 이제 웹을 통해 Jitsi Meet Rooms에 라이브 오디오 및 비디오 방송 을 지원합니다 . 특별한 구성이 필요하지 않습니다. 이름, 방을 채우고 시작을 클릭하는 것만 큼 쉽습니다 .


어떤 브라우저를 사용하고 있습니까? Jitsi는 Chrome에서 Chromium 만 사용할 수있는 Chrome, Chromium, Opera 및 Firefox 만 지원합니다. 그러나 Chromium에서 webkitRTCPeerConnection is not defined오류가 발생합니다. 나는 보통 WebRTC에 IceWeasel을 사용하지만 Jitsi에서는 지원되지 않습니다.
modulitos

1
PI에는 IceWeasel에서 거의 깨진 지원을 제외하고 WebRTC를 지원하는 브라우저가 없습니다. 내가 사용하는 방법은 다음과 같습니다 : Pi-> Jitsi Server on Cloud-> 다른 곳의 내 PC
prinxis

1
UV4L은 대기 시간없이 하드웨어 인코딩 H264 라이브 스트리밍을 지원합니다.
prinxis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.