Làm cách nào tôi có thể truyền phát video H.264 từ mô-đun máy ảnh Raspberry Pi qua máy chủ web?


50

Vì vậy, tôi đã nhận được Raspberry Camera ngày hôm nay và vẫn hoạt động tốt.

Chụp ảnh ở định dạng JPEG:

raspistill -o image.jpg

Quay video 5 giây ở định dạng H.264 :

raspivid -o video.h264

Tôi không muốn cài đặt bất kỳ ứng dụng bổ sung nào vì tôi muốn tận dụng HTML5 có sẵn. Vì Chrome / Safari có bộ giải mã tích hợp cho H.264, tôi chỉ muốn trỏ trình duyệt của mình tới URL và xem luồng.

Làm thế nào tôi có thể đạt được điều này?


2
Tôi cũng đang làm việc này. Tôi nghĩ bạn cần thêm hỗ trợ MP4 cho nginx hoặc đại loại như thế. Sẽ cho bạn biết nếu tôi có một bước đột phá.
recantha

@recantha Bạn đã có bước đột phá mới nào với phát trực tuyến video chưa?
Piotr Kula

3
Giải pháp tốt nhất tôi tìm thấy được dựa trên RaspiMJPEG của Silvan Melchoir. Hãy xem blog của tôi có chứa một liên kết đến diễn đàn của Raspberry Pi Foundation giải thích mọi thứ. ( recantha.co.uk/blog/?p=11176 )
recantha

2
Yea trông tuyệt vời để có thể truyền phát đến các thiết bị khác nhau. FPS và lag nào bạn nhận được ?? Tôi đã quản lý để có được uv4l để làm việc với VLC khá tốt và OSD. Một bản demo rất ngắn và xấu. Sẽ làm cho một tốt hơn sớm. Được thực hiện vào đêm khuya sau nhiều giờ thử và sai. youtu.be/LO10Ytlauag
Piotr Kula

@pumkin
Coderaemon

Câu trả lời:


32

Truyền phát với HLS

Phương pháp độc quyền của Apple để phát trực tiếp video. Nó được gọi là HTTP Live Streaming (HLS) và chỉ được hỗ trợ bởi công nghệ của Apple. Google (Chromium / YouTube) sử dụng triển khai riêng của mình được gọi là dash mpeg và mọi người khác đều bị nhầm lẫn hoặc sử dụng H.264 được gói gọn trong MP4 .

PROS

  • Có thể truyền phát HD 1080p trên mạng LAN tới bất kỳ thiết bị nào hỗ trợ .m3u8danh sách phát
  • Sử dụng ngữ nghĩa HTML5 (nhưng nó không phải là định dạng chuẩn)
  • Một số hỗ trợ trong phần mềm cao cấp của bên thứ ba như jwplayer 6 có thể được sử dụng

TIÊU DÙNG

  • Có độ trễ ít nhất 5 giây (trong ứng dụng này, nhưng sử dụng phản chiếu từ iPhone sang AppleTv, họ đạt được 50 ms - 500 ms bằng cách nào đó). Vì vậy, nó không tốt cho các ứng dụng được điều khiển từ xa, nơi cần có các phản ứng tức thời, ví dụ như robot hoặc máy bay trực thăng.
  • Phải trả tiền cho phần mềm của bên thứ ba nếu bạn muốn hỗ trợ trình duyệt rộng hơn có thể flash.

m3u8

  • .m3u8chỉ đơn giản là phiên bản UTF-8 của định dạng M3U. (các tệp .m3u có thể có nhiều mã hóa khác nhau.) Một số người cho rằng việc đổi tên .m3u8 thành .m3u sẽ hoạt động như mong đợi trên tất cả các trình duyệt HTML5. Tôi đã thử điều này, và nó đã không làm việc cho tôi.

Khái niệm đằng sau việc truyền phát này là các phân đoạn tệp ngắn, dài ít nhất 5 giây (trong ví dụ này - có thể có các cách mới để tăng tốc độ) được ghi lại và lưu vào một tệp thích hợp. Tệp danh sách phát được cập nhật với tên tệp mới và khách hàng luôn thăm dò danh sách phát này và tải xuống tệp gần đây nhất. Có một số cơ chế liên quan để hợp nhất video liền mạch trên máy khách. Đây là lý do tại sao các nhà phát triển khác không muốn thực hiện điều này vì nó đòi hỏi rất nhiều nỗ lực và không tuân thủ các tiêu chuẩn HTML5 (mặc dù không có tiêu chuẩn HTML5 thích hợp cho phát trực tiếp ?? Ehh, thở dài ).

Cài đặt

Bạn cần biên dịch ffmpeg- không sử dụng apt-get installcho FFmpeg

Điều này có thể mất đến 5 giờ - Nó được phiên bản 1.1 hoặc cao hơn, hỗ trợ phân khúc streaming. Bạn có thể sử dụng nó để sao chép nó và biên dịch nó.

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

cd ffmpeg
./configure
make && make install
  • Cài đặt nginx (engine-x) - nginx được thiết kế đặc biệt cho các thiết bị nhúng và là máy chủ web hỗ trợ PHP nhẹ nhất và nhanh nhất hiện có. (Vâng, nó tốt hơn Apache cồng kềnh )
  • Tạo một thư mục, ví dụ, sống trong thư mục www của bạn, /usr/share/nginx/www/

Tạo một tệp script Bash được gọi là một cái gì đó giống như video.sh, áp dụng chmod +xnó và dán nó vào. Thay đổi thư mục cơ sở đến nơi mà máy chủ HTTP của bạn tồn tại. Tôi đã sử dụng 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

Tạo một tệp HTML sẽ tải danh sách phát

<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>

Ủng hộ

  • iPhone, mở trang, nhưng rơi vào QuickTime . Chất lượng thực sự tuyệt vời!
  • Windows Safari, luồng tốt.
  • Macintosh hoặc Windows, QuickTime. Luồng tốt.
  • Android 2.3.5 và không hoạt động, nhưng nó được cho là được hỗ trợ kể từ 2.1.x
  • Windows, Chrome - Không có gì
  • Windows, Internet Explorer 10 --- Không có gì (loại video không được hỗ trợ)
  • Windows, VLC media player - Không có gì

Tham khảo: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392

Mã gốc: https://github.com/AndyA/psips/blob/master/examples/hls.sh


Liên quan đến việc tăng tốc độ biên dịch của ffmpeg Để tránh khả năng tính toán thấp của RPI và thời gian biên dịch dài cho ffmpeg, tôi đã thử sử dụng Qemu với Wheeze nhưng gặp một số trở ngại khi đăng nhập và phải thử với hình ảnh Arch . Điều này đã làm việc. Cũng đã thử Sqeeze trên một hình ảnh Ubuntu , thông qua VirtualBo
LuboP

2
Có cách nào để tự động xóa các phân đoạn cũ? Thẻ SD đầy sau một thời gian. Tôi cũng muốn xóa chúng để tôi có thể chạy nó trên một tmpfs và không làm hỏng thẻ SD.
Dimme

2
@Dimmme Nếu bạn thêm -segment_wrap 10làm đối số cho ffmpeg, nó sẽ sử dụng tối đa 10 tệp phân đoạn.
Gregers

Có ai nhận được điều này để làm việc? Các tệp được tạo nhưng dường như bỏ lỡ thông tin SPS / PPS, vì vậy video sẽ không phát trong iOS Safari cũng như VLC. Stream.m3u8 cũng không bao gồm segments/khi trỏ đến các tệp phân đoạn, vì vậy tôi đã bỏ thư mục phân đoạn. Có phải tôi đã hiểu nhầm điều gì không?
Gregers

bạn cần dẫn luồng qua nhị phân bộ lọc PSIPS. Phiên bản mới nhất của raspicam đáng ra phải làm điều này .. nhưng vì một số lý do tôi không thể làm cho nó hoạt động mà không có PSIPS
Piotr Kula

23

UV4L MMAL

Cảm ơn bình luận từ @mpromonet về bản cập nhật trên trình điều khiển Linux-Project V4L2 hiện triển khai MMAL rất hiệu quả - nhưng nó vẫn đang trong quá trình hoàn thiện.

Thực hiện theo các hướng dẫn này để cài đặt kho dự án linux và cài đặt trình điều khiển UV4L với các tính năng bổ sung. Sau đó cài đặt máy chủ và mjpeg. Nếu bạn muốn, bạn cũng có thể thử nghiệm với những người khác.

Sau khi cài đặt mọi thứ, bạn có thể truy cập máy chủ HTTP trên cổng 8080. Bạn cũng nên kiểm tra /etc/uv4l/conftệp và đặt nếu bạn muốn mjpeg hoặc H.264 vì nó tạo ra sự khác biệt, nhưng bạn có thể điều chỉnh một vài cài đặt qua web tích hợp người phục vụ.

HTML 5

Đây là những gì tất cả chúng ta đang chờ đợi (được gọi là WebRTC ) và nhờ trình điều khiển mới, nó hoạt động rất tốt (trên Raspberry Pi 2).

Trước tiên, hãy làm theo các bước sau, 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

Sau đó, trên Raspberry Pi 2 của bạn cài đặt WebRTC này (đối với Raspberry Pi 1, hãy đọc trang web được liên kết để biết các tùy chọn khác)

sudo apt-get install uv4l-webrtc

Khởi động lại tất cả các trình điều khiển và đi đến

http://raspberry:8080/

Bây giờ bạn có truyền phát video chất lượng cao, độ trễ thấp trực tiếp vào một trình duyệt hiện đại như Chrome hoặc Firefox. (Có thể là Safari, nhưng tôi không thể kiểm tra vì họ không thực hiện Winblows nữa và Internet Explorer ... eh)

MJPEG

Theo mặc định, nó sử dụng mjpegở 1080p và rất chậm chạp. Tôi đã điều chỉnh nó thành 800x600 khung hình và sử dụng một cái gì đó như iSpy để xử lý video. Để bảo mật, tôi nhận được khoảng 10 khung hình / giây trên một video sắc nét. Đó là cách tốt hơn so với 3 khung hình / giây ở 640x480 trước trình điều khiển này. Nó hoạt động trên iPhone với Safari, Android Chrome và hầu hết mọi thứ khác.

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

Điều này cũng có nghĩa là motionbây giờ (tôi vẫn cần kiểm tra và so sánh) hoạt động tốt hơn rất nhiều. Đảm bảo đặt cấu hình để sử dụng v4l2_palette 8hoặcv4l2_palette 2

H.264

Điều này hiện đã được sửa cho "phát trực tuyến" và chúng tôi không phải mất nhiều thời gian để xem video H.264 thông qua trình phát phương tiện VLC . Luồng này là RAW RAW64, vì vậy bạn cần phải giải mã nó hoặc chuyển mã / encapsualte nếu bạn cần nó để làm việc ở một nơi khác. Bạn nên điều chỉnh bitrate=xxxxxxtệp trong cấu hình nếu bạn phát trực tuyến qua Wi-Fi.

Trong trình phát phương tiện VLC, bạn phải nói với nó rằng bạn muốn sử dụng trình giải mã H.264. Vì vậy, nếu bạn đang sử dụng GUI, thì hãy đảm bảo thêm đối số :demux=264. Từ dòng lệnh , vlc http.../video.h264 --demux h264. Nếu không, bạn sẽ chỉ thấy một màn hình trống ngay cả khi đèn LED của camera được bật.

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

Voila! Truyền phát HD với độ trễ khoảng 500 ms (có tinh chỉnh, giảm xuống 200 ms). Nó chắc chắn dễ dàng hơn nhiều so với việc sử dụng các phương pháp cũ. Chất lượng và FPS là tuyệt vời, nhưng bạn không thể nhúng nó vào HTML5 mà không chuyển mã sang MP4 hoặc WebM . Tôi hy vọng điều này sẽ được thực hiện vì nó thực sự sẽ biến đây thành một máy chủ độc lập tuyệt vời.

RTSP / RTMP / RTP

Không được hỗ trợ / thực hiện

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

HLS

Không được hỗ trợ / thực hiện


Không có video4linuxtrình điều khiển availabe nào. Điều này có nghĩa là chúng ta không thể sử dụng ffserver để truyền dữ liệu bằng cách sử dụng /dev/video0hoặc mô phỏng như webcam USB.

Đó là lý do tại sao rất khó tìm thấy phát trực tiếp phù hợp cho trình duyệt HTML5.


Bây giờ có video4linuxtài xế lái xe chính thức v4l2 bcm2835-v4l2 và người lái xe userspace v4l2 [ linux-projects.org/modules/sections/...
mpromonet

Là một trình điều khiển v4l thực sự hay chỉ là trình bao bọc xung quanh raspivid mang lại hiệu suất khủng khiếp?
Piotr Kula

1
Trình điều khiển chính thức sử dụng giao diện MMAL, xem mã nguồn [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/ đấm . Hiệu suất có vẻ đúng.
mpromonet

Tôi đã chơi với điều này trong 3 ngày nay. Bộ mã hóa mjpeg ổn định hơn nhiều và có thể xem 800x600 @ 10fps trên iPhone, Android hoặc iSpy một cách đáng tin cậy. h264 tuyệt vời ở 1080p 30 khung hình / giây và chúng ta có thể xem điều này trong vlc bằng cách sử dụng --demux h264cờ. Chúng tôi vẫn cần chuyển mã này để sử dụng trên thiết bị di động hoặc nhúng dưới dạng mp4 / webm trên các trang web. Nhưng nó thực sự là bước tiến lớn về hiệu quả và chất lượng. Đừng nhầm lẫn với điều khiển trình điều khiển dự án không phải là UV4L "khác" là rác rưởi.
Piotr Kula

Lưu ý rằng việc thêm: demux = 264 trong phương thức H264 là dành cho máy chủ vlc, không phải máy khách vlc. Vì vậy, dòng lệnh để bắt đầu phát trực tuyến trên quả mâm xôi để có được sự tương thích với vlc trong điện thoại thông minh là:/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

Truyền phát với MJPEG

U4VL

Giao diện kernel với máy chủ HTTP (S) tích hợp.

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

Giao diện web Raspberry Pi Cam

Một dự án tốt đẹp của silvanmelchior triển khai một máy chủ web, giống như dvr, máy chủ phát đa mục tiêu. Cần thêm thông tin

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

Phương pháp kế thừa

Truyền phát với mjpg được hầu hết tất cả các trình duyệt hỗ trợ, bao gồm cả Internet Explorer 6. Rất nhiều máy ảnh được sử dụng trước H.264 sử dụng mjpg phần cứng, về cơ bản đã đổ các tệp JPEG nhanh nhất có thể vào một thư mục trong khi mjpg đọc tệp vào bộ đệm và xóa họ Một số thiết bị có thể đạt tới 25 khung hình / giây và ngay cả khi bạn có kết nối kém, bạn sẽ nhận được ít nhất 1 khung hình / giây.

Hỗ trợ cho mjpg đã bị bỏ trong các camera HD vì tệp JPEG chỉ quá lớn để truyền phát qua Internet và H.264 là giao thức nhanh hơn và chất lượng tốt hơn nhiều.

Vì chúng tôi không có cách nào để phát H.264 bằng cách sử dụng mô-đun máy ảnh, điều này có vẻ như là một dự phòng khả thi ...

Nó là khá nhiều ngay lập tức, nhưng đừng mong đợi để có được hơn 1,5 khung hình / giây. Điều này là xuống raspistillcực kỳ SLOOOW! Sử dụng chức năng time-lapse được đặt thành 100 ms sẽ cung cấp cho chúng tôi 10 khung hình / giây không hoạt động vì raspistillchỉ bị nghẹt và có vấn đề nghiêm trọng về hiệu suất.

  1. Thay đổi /tmpđể sử dụng RAM cho tốc độ /etc/default/tmpfs- thay đổi RAMTMP=yes(Đây là một nỗ lực để tăng khung hình / giây, nhưng raspistill chỉ không thể giữ với chính nó.)
  2. Khởi động lại
  3. apt-get cài đặt git
  4. apt-get cài đặt libjpeg8-dev
  5. apt-get cài đặt libv4l-dev
  6. apt-get install fantemagick
  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. TÙY CHỌN Nếu bạn có lỗi
  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. Trong makefile, nhận xét tất cả các plugin ngoại trừ input_file và output_http và thực hiện lại. Tôi đã có rất nhiều vấn đề ở đây.
  14. Sao chép nhị phân, mjpg_streamervà plugin của nó input_*.sooutput_*.sođể /usr/local/bin. Nếu không, chạy nó trực tiếp từ thư mục src.
  15. Kết thúc tùy chọn
  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" (chạy cái này ở nơi nhị phân và plugin)
  19. Đi đến http://<IP-address>:8080
  20. Dưới đây là một vài lựa chọn, tận hưởng "phát trực tiếp" theo cách cũ ... được hầu hết các trình duyệt hỗ trợ - hiện đại, cũ và thử nghiệm.

Tôi đã vật lộn để biên dịch nó trong khoảng 5 giờ ... thở dài , nhưng tôi nghĩ rằng tôi sẽ sử dụng điều này vì tôi có thể truy cập luồng từ bất kỳ điện thoại và bất kỳ trình duyệt nào. Tôi chỉ cần đợi cho đến khi chúng tôi có được trình điều khiển tốt hơn ... Một hoặc hai năm nữa. :

Bất kể chất lượng nào tôi thử, tôi không nhận được nhanh hơn hoặc chậm hơn 1 khung hình / giây khi sử dụng luồng. Tôi đã sử dụng 720p và 1080p và chỉ có chất lượng hình ảnh trở nên tốt hơn, nhưng khung hình / giây không có sự khác biệt trên mạng LAN. Tôi cho rằng các cài đặt nhỏ hơn sẽ giúp với mạng WAN / 3G hoặc các đường truyền vô tuyến khác.

raspistill ghi hình ảnh vào một tập tin duy nhất. Đây có thể là một nút cổ chai. Nó ghi tập tin, mjpg strreamer đọc nó và xóa nó gây ra I / O chặn, vì vậy raspistill không thể ghi vào tập tin.

Điều duy nhất tôi có thể nghĩ đến là sử dụng raspivid piped vào FFmpeg sẽ tạo các tệp JPEG cho chúng tôi - tôi cần thử điều này và có thể nó nhanh hơn nhiều so với sử dụng raspistill. Tôi đã xoay sở để có được 25 khung hình / giây với chất lượng gây sốc và nó đã bị trì hoãn khoảng 10 giây ... Tinh chỉnh các cài đặt cho tôi khoảng 3 khung hình / giây, nhưng CPU 100%. Không có phần cứng nào được sử dụng để xử lý luồng video ...

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

Tôi cũng đã đọc và thấy rằng chúng ta có thể sử dụng %dtrong tên tệp đầu ra raspistill. Tôi tự hỏi nếu điều đó sẽ tăng fps. Ngoài ra mã hóa JPG là phần cứng được tăng tốc trong raspistill, vì vậy tôi thực sự đấu tranh để tìm ra lý do tại sao nó quá chậm ...

Tôi đã nhận được 2 FPS đáng kinh ngạc bằng cách sử dụng %dtên tệp. Vì một số lý do, việc viết tệp JPEG bị chậm khủng khiếp từ raspistill. Thở dài.


cảm ơn bạn đã chia sẻ kiến ​​thức
user566245

10

Kể từ năm 2017 (hoặc có lẽ sớm hơn) raspividkhông còn là phương pháp ưa thích, với các nhà phát triển Pi khuyên mọi người nên sử dụng V4L2 thay thế.

Vì vậy, phương pháp này cho phép bạn truyền phát H264 qua RTP bằng V4L2 thay vì raspivid. Tôi nhận thấy phương pháp này dẫn đến việc bỏ học ít hơn và cho phép tốc độ bit cao hơn:

#!/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

Kịch bản này phát đa hướng video và nó có thể được xem trên một máy khác trên mạng LAN với lệnh như sau:

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

-sync extlàm cho video được phát nhanh nhất có thể để nó chạy trong thời gian thực, trái ngược với việc chạy nó ở tốc độ khung hình cố định và bị trễ nếu Pi chụp các khung hình nhanh hơn mức này. Vẫn còn một số độ trễ với phương thức này, nhưng không tệ hơn các raspividphương thức khác .

(Mẹo: nếu bạn cắm vào bộ định tuyến hoặc bộ chuyển đổi hỗ trợ IGMP, hãy đảm bảo rằng 224.0.0.0/4không được tường lửa trên máy của bạn, nếu không, bộ định tuyến sẽ hỏi PC của bạn xem nó có muốn lưu lượng phát đa hướng không bất kỳ video nào.)

Ghi vào đĩa

Như tôi đã đề cập ghi âm trong các bình luận bên dưới, tôi sẽ mở rộng về điều đó ở đây. Bạn có thể sử dụng một lệnh như thế này để ghi lại luồng mạng vào đĩa:

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

Nhìn vào man strftimeý nghĩa của các %ký hiệu trong tên tệp. Những người trong ví dụ này sử dụng số ngày (0 = Chủ nhật, 1 = Thứ hai, v.v.) theo sau là a Tvà sau đó là thời gian. Nó bắt đầu một tập tin mới cứ sau 15 phút.

Để rõ ràng, lệnh ghi âm này có nghĩa là được chạy trên một PC từ xa (không phải trên chính Pi) mặc dù nó cũng có thể hoạt động trên Pi (chưa được kiểm tra).

Vì bạn nhận được một tệp mới cứ sau 15 phút với ngày và thời gian trong tên tệp, điều đó có nghĩa là sau một tuần bạn sẽ bắt đầu nhận được tên tệp đã được sử dụng, khiến các tệp cũ nhất bị ghi đè. Nói cách khác, bạn sẽ kết thúc với một đoạn phim ngắn có giá trị của tuần trước. Điều này là lý tưởng cho một camera an ninh, nơi bạn sẽ hiếm khi cần phải quay lại hơn một tuần.

Như một lưu ý phụ, điều này tạo ra các tệp có giá trị khoảng 500 GB, vì vậy bạn có thể muốn điều chỉnh tốc độ bit, độ phân giải hoặc ghi đè lên các tệp sớm hơn (giả sử cứ sau 24 giờ) nếu bạn không muốn chúng chiếm quá nhiều dung lượng.


Thật tuyệt - Cảm ơn bạn đã chia sẻ điều này. Bạn có thể giải thích tại sao việc sử dụng multicast là cần thiết ở đây không? Từ những gì tôi đã học được là multicast hiếm khi được sử dụng - vì vậy tôi đã tự hỏi những gì nó mang lại cho bảng ở đây? Tuy nhiên - Kịch bản có vẻ hay và tôi chắc chắn nó sẽ giúp ích cho mọi người. Cảm ơn +1
Piotr Kula

1
Multicast là tùy chọn - bạn chỉ có thể thay thế một địa chỉ IP bình thường nếu muốn - nhưng bạn sẽ cần thay đổi lệnh để sử dụng ffserverhoặc một số hệ thống máy chủ khác nếu bạn muốn có nhiều máy để hiển thị nguồn cấp. Sau đó, có thể sau 2-3 khách hàng (tùy thuộc vào tốc độ bit của video), bộ điều hợp USB Ethernet của Pi sẽ hết băng thông. Với phát đa hướng, không cần chạy máy chủ (máy khách chỉ cần chọn nghe lưu lượng hoặc bỏ qua nó) để bạn có thể có hàng ngàn máy hiển thị video mà không ảnh hưởng đến Pi, chỉ gửi một luồng video duy nhất .
Malvineous

Cảm ơn đã giải thích - Nhưng multicast chỉ hoạt động trên các mạng nội bộ? Nếu một ISP nhận được một gói phát đa hướng, họ thường chỉ loại bỏ nó - Vì vậy, không giống như bạn chỉ có thể phát cho mọi người trên internet. Tôi cho rằng nếu bạn có một mạng nội bộ lớn, việc truyền một luồng lớn cũng có thể ảnh hưởng đến mạng của bạn? Nhưng phải .. chỉ để tôi xem một luồng tôi sẽ chỉ UDP đến một IP được chọn .. nhưng tôi vẫn thích tùy chọn phát đa hướng: D Tôi sẽ thử và làm điều đó vào cuối tuần này chỉ vì tôi chưa bao giờ làm điều đó trước đây. :) Cảm ơn
Piotr Kula

1
Có multicast chủ yếu cho các mạng nội bộ. Nó được cho là hoạt động tốt hơn với IPv6 nhưng tôi nghĩ nó vẫn cần sự hợp tác từ ISP. Tôi sử dụng nó bởi vì điều đó có nghĩa là tôi không phải chạy máy chủ trên Pi và tôi có thể xem các luồng từ hai máy khác nhau và ghi lại vào đĩa mà không thay đổi cấu hình của Pi hoặc làm quá tải băng thông mạng của Pi. Nếu mạng nội bộ của bạn lớn thì có lẽ bạn sẽ sử dụng các bộ chuyển mạch có khả năng IGMP được thiết kế để chỉ gửi lưu lượng phát đa hướng khi cần thiết để tác động không khác gì bình thường.
Malvineous

1
Cảm ơn bạn đã giải thích .. Bây giờ tôi có thể thấy nhiều lợi ích của việc sử dụng phát đa hướng với những cảnh báo nhỏ thậm chí sẽ không ảnh hưởng đến người dùng gia đình thực sự. Tôi chắc chắn sẽ thử cái này Đó là những điều đơn giản và rõ ràng đôi khi cần phải được chỉ ra để có ý nghĩa. Và nhìn vào bản cập nhật của bạn .. bit ghi âm thực sự rất tuyệt!
Piotr Kula

4

Tôi đã quản lý để truyền phát từ Raspberry Pi của mình đến một máy chủ web với mô-đun nginx-rtmp được biên dịch .

Để tiết kiệm rắc rối ffmpeg, tôi khuyên bạn nên phân phối như Arch Linux Arm .

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

Một số lưu ý:

Vì vậy, trên cơ sở này, tôi nghĩ phát trực tiếp từ Raspberry Pi có thể ổn khi phát sóng tạm thời, nhưng không phải cho một máy quay Web luôn bật vì nó quá đói băng thông. Bạn sẽ không nhận được âm thanh và nếu bạn làm như vậy, nó sẽ là một nhiệm vụ để đồng bộ hóa.

Bạn có thể ghi âm hiệu quả hơn một cách riêng biệt cùng lúc với quay video. Sau đó, có lẽ sau đó chuyển nguồn cấp âm thanh vào sau và chuyển đổi nó thành WebM và đưa nó vào httpd của bạn dưới dạng tệp tĩnh với thẻ video HTML. Quy trình làm việc khá khó xử, mặc dù đó là cách tốt nhất tôi có thể nghĩ đến để phát sóng hiệu quả sẽ hoạt động không đau trên các trình duyệt.


1
Bạn có thể kiểm soát băng thông và độ phân giải mặc dù. Nếu truyền phát LAN cục bộ cho camera quan sát sử dụng thì đó không phải là vấn đề. Phát sóng qua internet có thể cần theo yêu cầu và / hoặc độ phân giải thấp hơn nhiều. Nhưng đó là một cách khác để làm điều đó. Cảm ơn +1
Piotr Kula

và làm thế nào để nó hoạt động? nó không phù hợp với tôi ... FFMPEG nói "RTMP_Connect0, không thể kết nối ổ cắm. 111 (Kết nối bị từ chối)"
Flash Thunder

2

UV4L hiện hỗ trợ Truyền phát âm thanh & video trực tiếp với WebRTC và HTML5.


chỉ cần đọc liên kết ở trên ...
Strunz

Hoạt động thực sự tốt!
Piotr Kula

Làm sao? Liên kết đến trang ví dụ của nó bị hỏng ...
Cerin

Tôi đã xem qua các hướng dẫn đó và tôi có thể xác nhận rằng chúng không hoạt động
Quintin Balsdon

Tôi có thể xác nhận nó hoạt động như tôi đã thử .. hướng
Streaming

2

Câu trả lời của Piotr Kula dường như đang đi đúng hướng nhưng đã lỗi thời đối với Raspberry.

Có hướng dẫn cập nhật cho uv4l trên Raspberry căng tại

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

Bạn có thể điều chỉnh các tùy chọn uv4l qua /etc/uv4l/uv4l-raspicam.conf và sau đó khởi động lại dịch vụ với

sudo service uv4l_raspicam restart

Trong trường hợp của tôi, mọi thứ đã không hoạt động (nếu quên cài đặt máy chủ uv4l ...). Các ý kiến ​​sau đây có thể giúp bạn gỡ lỗi các vấn đề tương tự.

Tôi đã kiểm tra rằng máy chủ đang chạy với:

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

và liệu nó có nghe

sudo netstat -tulpn 

nhưng không có mục nào cho uv4l trong danh sách. Tôi đã mong đợi một cho cổng 8080

Vì vậy, tôi đã thử lệnh từ Làm thế nào để cấu hình 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

Nhưng máy chủ vẫn không tự động khởi động ...

man uv4l

sau đó chỉ cho tôi lựa chọn

--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).

vì vậy tôi đã cố gắng:

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

nhưng vẫn không có máy chủ nào chạy trên cổng 8080 hoặc elswhere. Vì vậy, có vẻ như tôi đã quên tùy chọn "--Forground" mà trang man nói là cần thiết:

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

Bây giờ đó là một gợi ý rõ ràng! Dường như chưa có máy chủ nào - vì vậy hãy cài đặt nó:

sudo apt-get install uv4l-server

và thử lại:

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

Máy chủ hiện có sẵn tại http: // pi: 8080 (thay thế pi bằng tên máy chủ hoặc tên máy chủ của bạn)

Sau khi khởi động lại, nó hoạt động với việc nhập một lệnh khác.


1

UV4L hiện hỗ trợ truyền phát âm thanh & video trực tiếp tới Jitsi Meet Rooms qua Web. Không cần cấu hình đặc biệt. Thật dễ dàng như điền tên, phòng và nhấp vào Bắt đầu .


trình duyệt mà bạn đang sử dụng? Jitsi chỉ hỗ trợ Chrome, Chromium, Opera và Firefox NIghtly, trong đó chỉ có Chromium có sẵn trên Pi. Nhưng Chromium cho tôi một webkitRTCPeerConnection is not definedlỗi. Tôi thường sử dụng IceWeasel cho WebRTC, nhưng điều đó không được hỗ trợ cho Jitsi.
modulitos

1
trên PI không có trình duyệt hỗ trợ WebRTC, ngoại trừ hỗ trợ gần như bị hỏng trong IceWeasel. Cách tôi đang sử dụng là: Pi-> Máy chủ Jitsi trên đám mây -> PC của tôi ở nơi khác
prinxis

1
UV4L hỗ trợ phát trực tiếp H264 được mã hóa bằng phần cứng mà không có độ trễ.
prinxis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.