Bagaimana saya bisa melakukan streaming video H.264 dari modul kamera Raspberry Pi melalui server web?


50

Jadi saya mendapat Kamera Raspberry hari ini dan masih berfungsi dengan baik.

Abadikan gambar dalam format JPEG:

raspistill -o image.jpg

Rekam video 5 detik dalam format H.264 :

raspivid -o video.h264

Saya tidak ingin menginstal aplikasi tambahan karena saya ingin memanfaatkan HTML5 yang sudah tersedia. Karena Chrome / Safari memiliki dekoder bawaan untuk H.264, saya hanya ingin mengarahkan browser saya ke URL dan menonton streaming.

Bagaimana saya bisa mencapai ini?


2
Saya sedang mengerjakan ini juga. Saya pikir Anda perlu menambahkan dukungan MP4 ke nginx atau sesuatu seperti itu. Akan memberi tahu Anda jika saya memiliki terobosan.
recantha

@recantha Apakah Anda punya terobosan baru dengan streaming video?
Piotr Kula

3
Solusi terbaik yang saya temukan didasarkan pada RasvanMJPP dari Silvan Melchoir. Lihatlah blog saya yang berisi tautan ke forum Raspberry Pi Foundation yang menjelaskan semuanya. ( recantha.co.uk/blog/?p=11176 )
recantha

2
Ya itu terlihat luar biasa untuk dapat melakukan streaming ke berbagai perangkat. Apa FPS dan lag yang Anda dapatkan ?? Saya berhasil membuat uv4l bekerja dengan VLC dengan cukup baik dan OSD. Demo yang sangat singkat dan buruk. Akan membuat yang lebih baik segera. Dibuat larut malam setelah jam trial and error. youtu.be/LO10Ytlauag
Piotr Kula

@ppumkin bagaimana saya bisa merekam melalui skrip python saat RaspiMJPEG berjalan? Ini memberikan video rekaman awal tetapi merekam dalam format .h264 bagaimana membuat skrip python dijalankan dengan menekan start_recording?
Coderaemon

Jawaban:


32

Streaming dengan HLS

Metode eksklusif Apple untuk streaming video langsung. Ini disebut HTTP Live Streaming (HLS) dan hanya didukung oleh teknologi Apple. Google (Chromium / YouTube) menggunakan implementasinya sendiri yang disebut dash mpeg dan semua orang bingung atau menggunakan H.264 yang dienkapsulasi dalam MP4 .

PROS

  • Dapat melakukan streaming HD 1080p pada LAN ke perangkat apa pun yang mendukung .m3u8daftar putar
  • Menggunakan semantik HTML5 (tetapi bukan format standar)
  • Beberapa dukungan dalam perangkat lunak premium pihak ketiga seperti jwplayer 6 dapat digunakan

Kon

  • Memiliki penundaan setidaknya 5 detik (dalam aplikasi ini, tetapi menggunakan mirroring dari iPhone ke AppleTv mereka mencapai 50 ms - 500 ms entah bagaimana). Jadi itu tidak baik untuk aplikasi yang dikendalikan dari jarak jauh di mana reaksi instan diperlukan, yaitu robot atau helikopter.
  • Harus membayar untuk perangkat lunak pihak ketiga jika Anda ingin dukungan browser yang lebih luas yang mungkin berkedip.

m3u8

  • .m3u8hanyalah versi UTF-8 dari format M3U. (File .m3u dapat memiliki berbagai penyandian.) Beberapa orang mengklaim bahwa mengubah nama .m3u8 menjadi .m3u akan berfungsi seperti yang diharapkan di semua browser HTML5. Saya mencoba ini, dan itu tidak berhasil untuk saya.

Konsep di balik streaming ini adalah bahwa segmen file pendek, setidaknya 5 detik (dalam contoh ini - mungkin cara baru tersedia untuk mempercepatnya) direkam dan disimpan ke file yang tepat. File daftar putar diperbarui dengan nama file baru dan klien selalu memilih daftar putar ini dan mengunduh file terbaru. Ada beberapa mekanisme yang terlibat untuk menggabungkan video dengan mulus pada klien. Inilah sebabnya mengapa pengembang lain tidak ingin menerapkan ini karena memerlukan banyak usaha dan tidak mematuhi standar HTML5 (meskipun tidak ada standar HTML5 yang tepat untuk streaming langsung ?? Ehh, desah ).

Menginstal

Anda perlu mengkompilasi ffmpeg- jangan gunakan apt-get installuntuk FFmpeg

Hal ini dapat memakan waktu hingga 5 jam - Ini memiliki menjadi versi 1.1 atau lebih tinggi yang mendukung segmen mengalir. Anda dapat menggunakan ini untuk mengkloning dan mengkompilasinya.

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

cd ffmpeg
./configure
make && make install
  • Instal nginx (engine-x) - nginx dirancang khusus untuk perangkat tertanam dan merupakan server web yang diaktifkan dengan PHP paling ringan dan tercepat yang tersedia saat ini. (Ya, itu lebih baik daripada Apache besar )
  • Buat direktori, misalnya, tinggal di folder www Anda, /usr/share/nginx/www/

Buat file skrip Bash dengan nama seperti video.sh, terapkan chmod +xpadanya dan tempelkan ini. Ubah folder basis ke tempat server HTTP Anda tinggal. Saya menggunakan 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

Buat file HTML yang akan memuat daftar putar

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

Dukung

  • iPhone, buka halaman, tetapi masuk ke QuickTime . Kualitasnya sungguh menakjubkan!
  • Windows Safari, stream dengan baik.
  • Macintosh atau Windows, QuickTime. Streaming dengan baik.
  • Android 2.3.5 dan tidak berfungsi, tetapi seharusnya didukung sejak 2.1.x
  • Windows, Chrome - Tidak ada
  • Windows, Internet Explorer 10 --- Tidak ada (tipe video yang tidak didukung)
  • Windows, VLC media player - Tidak ada

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

Kode asli: https://github.com/AndyA/psips/blob/master/examples/hls.sh


Dalam hal mempercepat kompilasi ffmpeg Untuk menghindari kapasitas komputasi RPI yang rendah dan waktu kompilasi yang lama untuk ffmpeg, saya telah mencoba menggunakan Qemu dengan Wheeze tetapi menemukan beberapa kendala saat masuk, dan harus mencoba dengan gambar Arch . Ini berhasil. Juga mencoba Sqeeze pada gambar Ubuntu , melalui VirtualBo
luboP

2
Apakah ada cara untuk menghapus segmen lama secara otomatis? Kartu SD menjadi penuh setelah beberapa waktu. Saya juga ingin mereka dihapus agar saya dapat menjalankan ini pada tmpfs dan tidak merusak kartu SD.
Dimme

2
@Dimmme Jika Anda menambahkan -segment_wrap 10sebagai argumen ke ffmpeg, ia akan menggunakan maksimal 10 file segmen.
gregers

Adakah yang berhasil melakukannya? File dibuat, tetapi sepertinya ketinggalan informasi SPS / PPS, sehingga video tidak akan diputar di iOS Safari atau VLC. Stream.m3u8 juga tidak termasuk segments/ketika menunjuk ke file segmen, jadi saya menjatuhkan folder segmen. Apakah saya salah paham akan sesuatu?
gregers

Anda perlu menyalurkan aliran melalui biner filter PSIPS. Versi terbaru dari raspicam seharusnya melakukan ini .. tetapi untuk beberapa alasan saya tidak bisa membuatnya bekerja tanpa PSIPS
Piotr Kula

23

UV4L MMAL

Terima kasih untuk komentar dari @mpromonet untuk pembaruan pada driver Linux-Projects V4L2 yang sekarang mengimplementasikan MMAL dengan sangat efisien - tetapi ini masih dalam proses.

Ikuti petunjuk ini untuk menginstal repositori proyek-linux dan instal driver UV4L dengan ekstra. Kemudian instal server dan mjpeg. Jika mau, Anda juga bisa bereksperimen dengan yang lain.

Setelah Anda menginstal semuanya, Anda dapat mengakses server HTTP pada port 8080. Anda juga harus memeriksa /etc/uv4l/conffile dan mengatur apakah Anda ingin mjpeg atau H.264 karena itu membuat perbedaan, tetapi Anda dapat menyesuaikan beberapa pengaturan melalui web bawaan. server.

HTML 5

Inilah yang kami semua menunggu (disebut WebRTC ) dan berkat driver baru ini berfungsi dengan baik (pada Raspberry Pi 2).

Pertama, ikuti langkah-langkah ini, 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

Kemudian pada Raspberry Pi 2 Anda instal ini WebRTC (untuk Raspberry Pi 1, baca situs tertaut untuk opsi lain)

sudo apt-get install uv4l-webrtc

Nyalakan kembali semua driver dan buka

http://raspberry:8080/

Sekarang Anda memiliki streaming video latensi rendah dan berkualitas tinggi langsung ke peramban modern seperti Chrome atau Firefox. (Mungkin Safari, tetapi saya tidak dapat memeriksa karena mereka tidak melakukan Winblows lagi dan Internet Explorer ... eh)

MJPEG

Secara default, ini digunakan mjpegpada 1080p, dan itu sangat lamban. Saya mengubah ukurannya menjadi 800x600 bingkai dan menggunakan sesuatu seperti iSpy untuk memproses video. Untuk keamanan, saya mendapatkan sekitar 10 fps pada video yang jernih. Ini jauh lebih baik daripada 3 fps pada 640x480 sebelum driver ini. Ini bekerja di iPhone dengan Safari, Android Chrome dan hampir semua yang lainnya.

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

Ini juga berarti bahwa motionseharusnya (saya masih perlu menguji dan membandingkan) bekerja jauh lebih baik sekarang. Pastikan untuk mengatur konfigurasi yang akan digunakan v4l2_palette 8atauv4l2_palette 2

H.264

Ini sekarang telah diperbaiki untuk "streaming", dan kita tidak perlu berusaha keras untuk menonton video H.264 melalui VLC media player . Alirannya masih berupa RAW H.264, jadi Anda harus melakukan demux atau transcode / encapsualte jika Anda memerlukannya untuk bekerja di tempat lain. Anda harus men-tweak bitrate=xxxxxxdalam file konfigurasi jika Anda streaming melalui Wi-Fi.

Dalam pemutar media VLC, Anda harus memberi tahu bahwa Anda ingin menggunakan demuxer H.264. Jadi jika Anda menggunakan GUI, maka pastikan untuk menambahkan argumen :demux=264. Dari baris perintah vlc http.../video.h264 --demux h264,. Jika tidak, Anda hanya akan melihat layar kosong meskipun LED kamera dihidupkan.

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

Voila! Streaming HD dengan jarak jeda 500 ms (dengan penyesuaian, hingga 200 ms). Ini jelas jauh lebih mudah daripada menggunakan metode lama. Kualitas dan FPS luar biasa, tetapi Anda tidak dapat menanamkan ini dalam HTML5 tanpa transkode ke MP4 atau WebM . Saya harap ini akan diterapkan karena akan benar-benar menjadikan ini server mandiri yang hebat.

RTSP / RTMP / RTP

Tidak didukung / diimplementasikan

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

HLS

Tidak didukung / diimplementasikan


Belum ada video4linuxdriver yang tersedia. Ini berarti bahwa kami tidak dapat menggunakan ffserver untuk mengalirkan data menggunakan /dev/video0atau simlar seperti webcam USB.

Itulah mengapa sangat sulit untuk menemukan streaming langsung yang tepat untuk browser HTML5.


Sekarang ada video4linuxdriver driver V4L2 resmi bcm2835-v4l2 dan driver userspace V4L2 [ linux-projects.org/modules/sections/…
mpromonet

Apakah driver v4l asli atau hanya pembungkus raspivid yang memberikan kinerja mengerikan?
Piotr Kula

1
Pengemudi resmi menggunakan antarmuka MMAL, lihat kode sumber [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… . Performa sepertinya benar.
mpromonet

Saya telah bermain dengan ini selama 3 hari sekarang. Pengkodean mjpeg jauh lebih stabil dan dapat melihat 800x600 @ 10fps di iPhone, Android atau iSpy, andal. h264 hebat di 1080p 30fps dan kita bisa melihatnya dalam vlc menggunakan --demux h264flag. Kita masih perlu transkode ini untuk digunakan di ponsel atau menanamkan sebagai mp4 / webm di halaman web. Tetapi ini adalah langkah yang sangat bagus untuk maju secara efisien dan berkualitas. Jangan bingung dengan "driver lain" proyek non-proyek linux4L UV4 yang sampah.
Piotr Kula

Perhatikan bahwa menambahkan: demux = 264 dalam metode H264 adalah untuk server vlc, bukan klien vlc. Jadi baris perintah untuk memulai streaming pada raspberry untuk mendapatkan kompatibilitas dengan vlc di smartphone adalah:/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

Streaming dengan MJPEG

U4VL

Antarmuka kernel dengan server build in HTTP (S).

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

Antarmuka Web Raspberry Pi Cam

Sebuah proyek yang bagus oleh silvanmelchior yang menyebarkan server web, seperti dvr, server streaming multi target. Perlu informasi lebih lanjut

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

Metode warisan

Streaming dengan mjpg didukung oleh hampir semua browser, termasuk Internet Explorer 6. Banyak kamera yang digunakan sebelum H.264 menggunakan perangkat keras mjpg, yang pada dasarnya membuang file JPEG secepat mungkin ke dalam folder sementara mjpg membaca file ke dalam buffer dan dihapus mereka. Beberapa perangkat dapat mencapai hingga 25 fps dan bahkan jika Anda memiliki koneksi yang buruk, Anda akan mendapatkan setidaknya 1 fps.

Dukungan untuk mjpg dijatuhkan dalam kamera HD karena file JPEG terlalu besar untuk streaming melalui Internet dan H.264 adalah protokol kualitas yang jauh lebih cepat dan lebih baik.

Karena kita tidak memiliki cara untuk menyiarkan H.264 menggunakan modul kamera secara nativly ini sepertinya merupakan sebuah ...

Ini cukup instan, tetapi jangan berharap untuk mendapatkan lebih dari 1,5 fps. Ini raspistillmenjadi sangat SLOOOW! Menggunakan fungsi time-lapse diatur ke 100 ms yang seharusnya memberi kita 10 fps tidak bekerja karena raspistillhanya tersedak dan memiliki masalah kinerja yang serius di dalam dirinya.

  1. Ubah /tmpuntuk menggunakan RAM untuk /etc/default/tmpfsperubahan kecepatan RAMTMP=yes(Ini adalah upaya untuk meningkatkan fps, tetapi raspistill tidak dapat bertahan dengan sendirinya.)
  2. Mulai ulang
  3. apt-get install git
  4. apt-get install libjpeg8-dev
  5. apt-get install libv4l-dev
  6. apt-get install imagemagick
  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. OPSIONAL Jika Anda memiliki kesalahan
  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. Di dalam makefile, komentar semua plugin kecuali untuk input_file dan output_http dan lakukan make lagi. Saya punya banyak masalah di sini.
  14. Salin biner, mjpg_streamerdan plugin-nya input_*.sodan output_*.sountuk /usr/local/bin. Kalau tidak, jalankan langsung dari direktori src.
  15. Akhir opsional
  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" (jalankan ini di mana biner dan plugin berada)
  19. Pergi ke http://<IP-address>:8080
  20. Berikut adalah beberapa opsi, nikmati streaming "langsung" dengan cara lama ... didukung oleh sebagian besar browser - modern, lama, dan eksperimental.

Saya kesulitan mengompilasinya selama sekitar 5 jam ... huh , tapi saya pikir saya akan menggunakan ini karena saya bisa mengakses stream dari ponsel apa saja dan browser apa pun. Saya hanya harus menunggu sampai kita mendapatkan driver yang lebih baik ... Satu atau dua tahun lagi. :(

Tidak peduli kualitas apa yang saya coba, saya mendapatkan tidak lebih cepat atau tidak lebih lambat dari 1 fps menggunakan aliran. Saya menggunakan 720p dan 1080p dan hanya kualitas gambar yang lebih baik, tetapi fps tidak ada perbedaan pada LAN. Saya kira pengaturan yang lebih kecil akan membantu dengan WAN / 3G atau transmisi radio lainnya.

raspistill menulis gambar ke satu file. Ini bisa menjadi hambatan. Itu menulis file, mjpg strreamer membacanya dan menghapusnya menyebabkan I / O memblokir, sehingga raspistill tidak dapat menulis ke file.

Satu-satunya hal yang dapat saya pikirkan adalah menggunakan raspivid yang disalurkan ke FFmpeg yang akan membuat file JPEG untuk kita - saya perlu mencoba ini dan mungkin ini jauh lebih cepat daripada uspp raspistill. Saya berhasil mendapatkan 25 fps dengan kualitas yang mengejutkan, dan itu tertunda sekitar 10 detik ... Tweaking pengaturan membuat saya sekitar 3 fps, tetapi CPU 100%. Tidak ada perangkat keras yang digunakan untuk memproses aliran video ...

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

Saya juga membaca dan menemukan bahwa kita dapat menggunakan %dnama file keluaran raspistill. Saya bertanya-tanya apakah itu akan meningkatkan fps. Encoding JPG juga dipercepat perangkat keras di raspistill, jadi saya benar-benar berjuang untuk mencari tahu mengapa itu sangat lambat ...

Saya mendapat 2 FPS mengejutkan menggunakan %dnama file. Untuk beberapa alasan, menulis file JPEG sangat lambat dari raspistill. Mendesah.


terima kasih telah berbagi pengetahuan
user566245

10

Pada 2017 (atau mungkin sebelumnya) raspividtidak lagi menjadi metode yang disukai, dengan Pi dev merekomendasikan orang menggunakan V4L2 sebagai gantinya.

Jadi metode ini memungkinkan Anda untuk melakukan streaming H264 melalui RTP menggunakan V4L2 bukan raspivid. Saya perhatikan metode ini menghasilkan lebih sedikit dropout dan memungkinkan bitrate lebih tinggi:

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

Skrip ini multicast video, dan dapat dilihat di komputer lain di LAN dengan perintah seperti ini:

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

-sync extmenyebabkan video diputar secepat mungkin sehingga akan berjalan secara real time, sebagai lawan menjalankannya pada framerate tetap dan tertinggal jika Pi menangkap frame lebih cepat dari ini. Masih ada beberapa kelambatan dengan metode ini, tetapi tidak lebih buruk dari raspividmetode lainnya .

(Kiat: jika Anda dicolokkan ke router atau sakelar yang mendukung IGMP, pastikan 224.0.0.0/4tidak di-firewall pada mesin Anda, jika tidak, router akan menanyakan PC Anda apakah menginginkan lalu lintas multicast yang tidak akan pernah direspon oleh PC dan Anda tidak akan pernah melihat video apa pun.)

Merekam ke disk

Seperti yang saya sebutkan merekam dalam komentar di bawah, saya akan mengembangkannya di sini. Anda dapat menggunakan perintah seperti ini untuk merekam aliran jaringan ke disk:

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

Lihatlah man strftimearti dari %simbol - simbol dalam nama file. Yang dalam contoh ini menggunakan nomor hari (0 = Minggu, 1 = Senin, dll.) Diikuti oleh a Tdan kemudian waktu. Ini memulai file baru setiap 15 menit.

Hanya untuk memperjelas, perintah rekaman ini dimaksudkan untuk dijalankan pada PC jarak jauh (bukan pada Pi itu sendiri) meskipun mungkin akan bekerja pada Pi juga (belum diuji).

Karena Anda mendapatkan file baru setiap 15 menit dengan hari dan waktu dalam nama file, itu berarti bahwa setelah satu minggu Anda akan mulai mendapatkan nama file yang dihasilkan yang telah digunakan, menyebabkan file terlama ditimpa. Dengan kata lain, Anda akan berakhir dengan lingkaran berulang dari rekaman minggu sebelumnya. Ini sangat ideal untuk kamera keamanan di mana Anda jarang perlu kembali lebih dari seminggu.

Sebagai catatan tambahan ini menghasilkan file bernilai sekitar 500GB, jadi Anda mungkin ingin menyesuaikan bitrate, resolusi, atau menimpa file lebih cepat (katakanlah setiap 24 jam) jika Anda tidak ingin mereka mengambil begitu banyak ruang.


Keren - Terima kasih telah berbagi ini. Bisakah Anda menjelaskan mengapa penggunaan multicast diperlukan di sini? Dari apa yang saya pelajari adalah bahwa multicast jarang digunakan - jadi saya bertanya-tanya apa yang dibawa ke meja di sini? Tetap saja - Skripnya tampak hebat dan saya yakin itu akan membantu membagikan orang. Terima kasih +1
Piotr Kula

1
Multicast adalah opsional - Anda dapat mengganti alamat IP normal jika diinginkan - tetapi Anda perlu mengubah perintah untuk menggunakan ffserveratau sistem server lain jika Anda ingin lebih dari satu mesin menampilkan umpan. Kemudian setelah mungkin 2-3 klien (tergantung pada bitrate video) adaptor USB Ethernet Pi akan kehabisan bandwidth. Dengan multicast tidak perlu menjalankan server (mesin klien hanya memilih apakah akan mendengarkan lalu lintas atau mengabaikannya) sehingga Anda dapat memiliki ribuan mesin yang menampilkan video tanpa dampak pada Pi, yang hanya mengirim satu aliran video tunggal .
Malvineous

Terima kasih telah menjelaskan - Tetapi multicast hanya berfungsi di jaringan internal? Jika ISP mendapatkan paket multicast mereka biasanya hanya menelanjangi- Jadi tidak seperti Anda hanya bisa menyiarkan ke semua orang di internet. Saya kira jika Anda memiliki jaringan internal yang besar, mulit casting aliran besar juga dapat mempengaruhi jaringan Anda? Tapi ya .. hanya bagi saya untuk melihat aliran saya hanya akan UDP ke IP yang dipilih .. tapi saya suka opsi multicast: D Akan mencoba dan melakukannya akhir pekan ini hanya karena saya belum pernah melakukannya sebelumnya. :) Terima kasih
Piotr Kula

1
Ya multicast terutama untuk jaringan internal. Seharusnya bekerja lebih baik dengan IPv6 tapi saya pikir itu masih membutuhkan kerja sama dari ISP. Saya menggunakannya karena itu berarti saya tidak harus menjalankan server pada Pi, dan saya dapat melihat stream dari dua mesin yang berbeda plus merekamnya ke disk tanpa mengubah konfigurasi Pi, atau membebani bandwidth jaringan Pi. Jika jaringan internal Anda besar maka Anda mungkin akan menggunakan sakelar berkemampuan IGMP yang dirancang untuk hanya mengirim lalu lintas multicast di mana diperlukan untuk membuat dampaknya tidak berbeda dengan normal.
Malvineous

1
Terima kasih telah menjelaskan .. Sekarang saya dapat melihat banyak manfaat menggunakan multicast dengan peringatan kecil yang bahkan tidak akan berdampak pada pengguna rumahan. Saya pasti akan mencoba ini. Hal-hal sederhana dan jelas kadang-kadang yang perlu ditunjukkan agar masuk akal. Dan melihat pembaruan Anda .. bit rekaman sebenarnya sangat, sangat keren!
Piotr Kula

4

Saya berhasil melakukan streaming dari Raspberry Pi saya ke server web dengan modul nginx-rtmp yang dikompilasi .

Untuk menghemat kerepotan ffmpeg, saya sarankan distribusi bergulir seperti 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

Beberapa catatan:

  • Streaming video H.264 yang disandikan dengan perangkat keras membutuhkan bandwidth sekitar 300 KB / detik , yang jika saya lakukan perhitungan dengan benar, akan memakan waktu setidaknya 750 GB sebulan jika Anda ingin melakukan streaming ke http nginx-rtmp Anda atau layanan RTMP seperti ustream .
  • Audio: Jika Anda ingin audio menyertai aliran H.264 Anda, Anda membutuhkannya di AAC . Pada dasarnya Raspberry Pi terlalu lambat untuk menyandikan mikrofon USB ke AAC dengan cepat .

Jadi atas dasar ini, saya pikir streaming langsung dari Raspberry Pi mungkin OK untuk siaran sementara, tetapi tidak untuk cam Web yang selalu aktif karena terlalu haus bandwidth. Anda tidak akan mendapatkan audio dan jika Anda melakukannya, itu akan menjadi misi untuk disinkronkan.

Anda dapat merekam audio secara lebih efisien secara terpisah pada saat bersamaan dengan merekam video. Kemudian nanti mungkin mux feed audio di kemudian dan mengubahnya ke WebM dan meletakkannya di httpd Anda sebagai file statis dengan tag video HTML. Alur kerjanya cukup canggung, meskipun itu yang terbaik yang bisa saya pikirkan untuk siaran yang efisien yang akan bekerja tanpa rasa sakit di seluruh browser.


1
Anda dapat mengontrol bandwidth dan resolusi. Jika streaming LAN lokal untuk penggunaan CCTV maka itu tidak masalah. Penyiaran melalui internet mungkin harus sesuai permintaan dan / atau resolusi yang jauh lebih rendah. Tapi ini cara lain untuk melakukannya. Terima kasih +1
Piotr Kula

dan bagaimana cara kerjanya? itu tidak untuk saya ... FFMPEG mengatakan "RTMP_Connect0, gagal menghubungkan soket. 111 (Sambungan ditolak)"
Flash Thunder

2

UV4L sekarang mendukung Streaming Audio & Video langsung dengan WebRTC dan HTML5.


baca saja tautan di atas ...
Strunz

Bekerja dengan sangat baik!
Piotr Kula

Bagaimana? Tautan ke halaman contohnya rusak ...
Cerin

Saya telah melalui tutorial-tutorial tersebut dan saya dapat mengonfirmasi bahwa mereka tidak bekerja
Quintin Balsdon

Saya dapat mengonfirmasi bahwa itu berfungsi karena saya telah mencobanya .. instructables.com/id/Raspberry-Pi-Video-Streaming
Tia

2

Jawaban Piotr Kula tampaknya berada di jalur yang benar tetapi sudah ketinggalan zaman karena raspberry.

Ada petunjuk yang diperbarui untuk uv4l pada peregangan Raspberry di

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

Anda dapat tweek opsi uv4l melalui /etc/uv4l/uv4l-raspicam.conf dan kemudian restart layanan dengan

sudo service uv4l_raspicam restart

Dalam kasus saya hal-hal tidak berjalan di luar kotak (jika lupa menginstal server uv4l ...). Komentar berikut mungkin membantu Anda men-debug masalah yang sama.

Saya memeriksa apakah server berjalan dengan:

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

dan apakah itu mendengarkan

sudo netstat -tulpn 

tetapi tidak ada entri untuk uv4l dalam daftar. Saya mengharapkan satu untuk port 8080

jadi saya mencoba perintah dari Cara mengkonfigurasi 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

Tapi tetap saja server tidak memulai secara otomatis ...

man uv4l

lalu tunjukkan saya pilihan

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

jadi saya mencoba:

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

tapi masih tidak ada server yang berjalan di port 8080 atau di tempat lain. Jadi sepertinya saya lupa opsi "--foreground" yang menyatakan halaman manual diperlukan:

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

Nah, itu petunjuk yang jelas! Tampaknya belum ada server - jadi instal:

sudo apt-get install uv4l-server

dan coba lagi:

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

Server sekarang tersedia di http: // pi: 8080 (ganti pi dengan ip atau nama host server Anda)

Setelah reboot itu bekerja tanpa memasukkan perintah lain.


1

UV4L sekarang mendukung siaran audio & video langsung ke Jitsi Meet Rooms melalui Web. Tidak diperlukan konfigurasi khusus. Semudah mengisi nama, ruang, dan mengklik Mulai .


browser mana yang kamu gunakan? Jitsi hanya mendukung Chrome, Chromium, Opera, dan Firefox NIghtly, yang hanya Chromium yang tersedia di Pi. Tapi Chromium memberi saya webkitRTCPeerConnection is not definedkesalahan. Saya biasanya menggunakan IceWeasel untuk WebRTC, tetapi itu tidak didukung untuk Jitsi.
modulitos

1
pada PI tidak ada browser yang mendukung WebRTC, kecuali dukungan yang hampir putus di IceWeasel. Cara saya menggunakannya adalah: Pi-> Jitsi Server on the Cloud -> PC saya di tempat lain
prinxis

1
UV4L mendukung streaming langsung H264 yang disandikan dengan perangkat keras tanpa latensi.
prinxis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.