ฉันจะสตรีมวิดีโอ H.264 จากโมดูลกล้อง Raspberry Pi ผ่านเว็บเซิร์ฟเวอร์ได้อย่างไร


50

ดังนั้นฉันจึงได้กล้องราสเบอร์รี่วันนี้และยังทำงานได้ดี

ถ่ายภาพในรูปแบบ JPEG:

raspistill -o image.jpg

ถ่ายวิดีโอ 5 วินาทีในรูปแบบH.264 :

raspivid -o video.h264

ฉันไม่ต้องการติดตั้งแอปพลิเคชันพิเศษใด ๆ เนื่องจากฉันต้องการใช้ประโยชน์จากHTML5ที่พร้อมใช้งาน เนื่องจากChrome / Safariมีตัวถอดรหัสในตัวสำหรับ H.264 ฉันเพียงต้องการชี้เบราว์เซอร์ของฉันไปที่ URL และดูสตรีม

ฉันจะบรรลุสิ่งนี้ได้อย่างไร


2
ฉันกำลังทำสิ่งนี้เช่นกัน ฉันคิดว่าคุณต้องเพิ่มการรองรับ MP4 ใน nginx หรืออะไรทำนองนั้น จะแจ้งให้คุณทราบหากฉันมีความก้าวหน้า
recantha

@recantha คุณมีความก้าวหน้าครั้งใหม่กับวิดีโอสตรีมมิ่งหรือไม่
Piotr Kula

3
ทางออกที่ดีที่สุดที่ฉันพบขึ้นอยู่กับ RaspiMJPEG ของ Silvan Melchoir ลองดูบล็อกของฉันซึ่งมีลิงค์ไปยังฟอรัมของมูลนิธิราสเบอร์รี่ Pi ที่อธิบายทุกอย่าง ( recantha.co.uk/blog/?p=11176 )
recantha

2
ใช่แล้วมันดูยอดเยี่ยมที่สามารถสตรีมไปยังอุปกรณ์ต่างๆ คุณได้รับ FPS และความล่าช้าอะไรบ้าง ?? ฉันจัดการเพื่อให้ uv4l ทำงานกับ VLC ได้ดีและ OSD การสาธิตที่สั้นมากและแย่ จะทำให้ดีขึ้นเร็ว ๆ นี้ ถูกทำให้สายในเวลากลางคืนหลังจากชั่วโมงแห่งการลองผิดลองถูก youtu.be/LO10Ytlauag
Piotr Kula

@ppumkin ฉันจะบันทึกสคริปต์ python ในขณะที่ RaspiMJPEG กำลังทำงานอยู่ได้อย่างไรมันให้วิดีโอการบันทึกเริ่มต้น แต่บันทึกในรูปแบบ. h264 จะทำให้สคริปต์ python ทำงานบนการกด start_recording ได้อย่างไร
Coderaemon

คำตอบ:


32

สตรีมมิ่งด้วย HLS

วิธีการที่เป็นกรรมสิทธิ์ของ Apple ในการสตรีมวิดีโอสด เรียกว่า HTTP Live Streaming (HLS) และรองรับเฉพาะเทคโนโลยีของ Apple เท่านั้น Google (โครเมี่ยม / YouTube) ใช้การดำเนินงานของตัวเองที่เรียกว่าMPEG เส้นประและคนอื่น ๆ เป็นทั้งสับสนหรือใช้ H.264 ห่อหุ้มใน MP4

ข้อดี

  • สามารถสตรีม HD 1080pบน LAN ไปยังอุปกรณ์ใดก็ได้ที่รองรับ.m3u8เพลย์ลิสต์
  • ใช้ซีแมนทิกส์ HTML5 (แต่ไม่ใช่รูปแบบที่เป็นมาตรฐาน)
  • รองรับซอฟต์แวร์พรีเมียมของบุคคลที่สามบางอย่างเช่น jwplayer 6

ข้อเสีย

  • มีความล่าช้าอย่างน้อย 5 วินาที (ในแอปพลิเคชั่นนี้ แต่ใช้การมิเรอร์จาก iPhone ไปยัง AppleTv พวกเขาจะได้ 50 มิลลิวินาที - 500 มิลลิวินาที) ดังนั้นจึงไม่ดีสำหรับแอปพลิเคชันที่มีการควบคุมจากระยะไกลซึ่งจำเป็นต้องมีปฏิกิริยาโต้ตอบแบบทันทีเช่นหุ่นยนต์หรือเฮลิคอปเตอร์
  • ต้องจ่ายสำหรับซอฟต์แวร์บุคคลที่สามหากคุณต้องการการสนับสนุนเบราว์เซอร์ที่กว้างขึ้นซึ่งอาจกระพริบ

m3u8

  • .m3u8เป็นเพียงรูปแบบ M3U รุ่นUTF-8 (ไฟล์. m3u สามารถเข้ารหัสได้หลายอย่าง) บางคนอ้างว่าการเปลี่ยนชื่อ. m3u8 เป็น. m3u จะทำงานได้ตามที่คาดหวังในเบราว์เซอร์ HTML5 ทั้งหมด ฉันลองสิ่งนี้และมันไม่ได้ผลสำหรับฉัน

แนวคิดที่อยู่เบื้องหลังการสตรีมนี้คือส่วนสั้น ๆ ของไฟล์อย่างน้อย 5 วินาที (ในตัวอย่างนี้ - เป็นไปได้ที่จะมีวิธีใหม่ในการเพิ่มความเร็ว) บันทึกและบันทึกเป็นไฟล์ที่เหมาะสม ไฟล์เพลย์ลิสต์จะได้รับการอัพเดตด้วยชื่อไฟล์ใหม่และไคลเอนต์จะทำการสำรวจเพลย์ลิสต์นี้และดาวน์โหลดไฟล์ล่าสุดเสมอ มีกลไกบางอย่างที่เกี่ยวข้องกับการรวมวิดีโอเข้ากับลูกค้าอย่างราบรื่น นี่คือเหตุผลที่นักพัฒนาอื่น ๆ ไม่ต้องการที่จะดำเนินการนี้เพราะมันต้องใช้จำนวนมาก AA ของความพยายามและไม่สอดคล้องกับมาตรฐาน HTML5 (แม้ว่าไม่มีมาตรฐาน HTML5 ที่เหมาะสมสำหรับการสตรีมสด ?? Ehh, ถอนหายใจ )

การติดตั้ง

คุณต้องรวบรวม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 (engine-x) - nginxได้รับการออกแบบมาเป็นพิเศษสำหรับ devises ฝังตัวและเป็นเว็บเซิร์ฟเวอร์ที่เปิดใช้งานPHP ที่เบาและเร็วที่สุดที่มีอยู่ในขณะนี้ (ใช่มันดีกว่าApacheขนาดใหญ่)
  • สร้างไดเรกทอรีเช่นอยู่ในโฟลเดอร์ www ของคุณ /usr/share/nginx/www/

สร้างไฟล์สคริปต์Bash ที่เรียกว่าสิ่งที่ชอบ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, Chrome - ไม่มีอะไร
  • Windows, Internet Explorer 10 --- ไม่มีอะไร (ประเภทวิดีโอที่ไม่รองรับ)
  • Windows, VLC media player - ไม่มีอะไร

ข้อมูลอ้างอิง: 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 ฉันพยายามใช้Qemu กับ Wheezeแต่เจออุปสรรคบางอย่างในการเข้าสู่ระบบและต้องลองด้วยภาพโค้ง . สิ่งนี้ใช้ได้ผล ยังพยายามSqeeze ในรูป Ubuntuผ่าน VirtualBo
luboP

2
มีวิธีลบกลุ่มเก่าโดยอัตโนมัติหรือไม่? การ์ด SD เต็มหลังจากผ่านไประยะหนึ่ง ฉันต้องการให้พวกเขาถูกลบไปที่ฉันสามารถเรียกใช้งานบน tmpfs และไม่ทำลายการ์ด SD
Dimme

2
@Dimmme หากคุณเพิ่ม-segment_wrap 10เป็นอาร์กิวเมนต์ให้กับ ffmpeg มันจะใช้ไฟล์เซกเมนต์สูงสุด 10 ไฟล์
gregers

มีใครได้รับสิ่งนี้ในการทำงาน? ไฟล์ถูกสร้าง แต่ดูเหมือนจะพลาดข้อมูล SPS / PPS ดังนั้นวิดีโอจะไม่เล่นใน iOS Safari หรือ VLC stream.m3u8 ยังไม่ได้รวมsegments/เมื่อชี้ไปที่ไฟล์เซกเมนต์ดังนั้นฉันจึงทิ้งโฟลเดอร์เซกเมนต์ ฉันเข้าใจผิดบางอย่างเหรอ?
gregers

คุณต้องไพพ์สตรีมผ่านไบนารีตัวกรอง PSIPS Raspicam รุ่นใหม่ล่าสุดควรจะทำเช่นนี้ .. แต่ด้วยเหตุผลบางอย่างฉันไม่สามารถทำงานได้โดยไม่ต้องใช้ PSIPS
Piotr Kula

23

UV4L MMAL

ขอบคุณที่คอมเม้นท์จาก @mpromonet สำหรับการอัพเดทไดรเวอร์ Linux-Projects V4L2 ซึ่งตอนนี้ใช้ MMAL ได้อย่างมีประสิทธิภาพ แต่ตอนนี้มันยังอยู่ระหว่างการพัฒนา

ทำตามคำแนะนำเหล่านี้เพื่อติดตั้งที่เก็บ linux-projectและติดตั้งไดรเวอร์ UV4L พร้อมอุปกรณ์เสริม จากนั้นติดตั้งเซิร์ฟเวอร์และ mjpeg ถ้าคุณต้องการคุณสามารถทดลองกับคนอื่นด้วย

หลังจากที่คุณติดตั้งทุกอย่างคุณสามารถเข้าถึงเซิร์ฟเวอร์ HTTP บนพอร์ต 8080 ได้คุณควรตรวจสอบ/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 (อาจจะเป็น Safari แต่ฉันไม่สามารถตรวจสอบได้เพราะพวกเขาไม่ทำ Winblow อีกแล้วและ Internet Explorer ... ใช่มั้ย)

MJPEG

โดยค่าเริ่มต้นมันใช้mjpegที่ 1080p และมันช้ามาก ฉันปรับแต่งมันให้มีขนาด 800x600 เฟรมและใช้บางอย่างเช่น iSpy เพื่อประมวลผลวิดีโอ เพื่อความปลอดภัยฉันได้รับประมาณ 10 fps ในวิดีโอที่คมชัด มันเป็นวิธีที่ดีกว่า 3 fps ที่ 640x480 ก่อนไดรเวอร์นี้ มันทำงานได้บน iPhone กับ Safari, Android Chrome และเกือบทุกอย่างอื่น

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

นอกจากนี้ยังหมายความว่าmotionควร (ฉันยังคงต้องทดสอบและเปรียบเทียบ) ทำงานได้ดีขึ้นมากในขณะนี้ ตรวจสอบให้แน่ใจว่าตั้งค่าการใช้v4l2_palette 8หรือv4l2_palette 2

H.264

สิ่งนี้ได้รับการแก้ไขแล้วสำหรับ "การสตรีม" และเราไม่ต้องไปไกลมากในการรับชมวิดีโอ H.264 ผ่านVLC มีเดียเพลเยอร์ สตรีมคือ Sill RAW H.264 ดังนั้นคุณจำเป็นต้อง demux มันหรือ transcode / encapsualte หากคุณต้องการให้มันทำงานที่อื่น คุณควรปรับแต่งไฟล์bitrate=xxxxxxในการกำหนดค่าหากคุณสตรีมผ่าน Wi-Fi

ใน VLC media player คุณต้องบอกว่าคุณต้องการใช้ demuxer H.264 ดังนั้นหากคุณกำลังใช้ GUI :demux=264แล้วให้แน่ใจว่าจะเพิ่มการโต้แย้ง vlc http.../video.h264 --demux h264จากบรรทัดคำสั่ง มิฉะนั้นคุณจะเห็นหน้าจอว่างเปล่าแม้ว่าไฟ LED กล้องจะเปิดอยู่

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

Voila! การสตรีมแบบ HD ด้วยความล่าช้าประมาณ 500 ms (ด้วยการปรับแต่งลดลงไปถึง 200 ms) มันง่ายกว่าการใช้วิธีการแบบเดิม ๆ อย่างแน่นอน คุณภาพและ FPS เป็นเลิศ แต่คุณไม่สามารถฝังนี้ใน HTML5 โดยไม่ต้อง transcodding เป็น MP4 หรือWebM ฉันหวังว่าสิ่งนี้จะถูกนำไปใช้เนื่องจากจะทำให้เซิร์ฟเวอร์นี้เป็นแบบสแตนด์อโลนที่ยอดเยี่ยมอย่างแท้จริง

RTSP / RTMP / RTP

ไม่รองรับ / ใช้งาน

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

HLS

ไม่รองรับ / ใช้งาน


ไม่มีvideo4linuxคนขับไม่มีประโยชน์เลย ซึ่งหมายความว่าเราไม่สามารถใช้ffserverเพื่อสตรีมข้อมูลโดยใช้/dev/video0หรือ simlar เหมือนเว็บแคม USB

ด้วยเหตุนี้จึงเป็นเรื่องยากที่จะค้นหาการสตรีมสดที่เหมาะสมสำหรับเบราว์เซอร์ HTML5


ขณะนี้มีvideo4linuxไดร์เวอร์ตัวขับ V4L2 อย่างเป็นทางการ bcm2835-v4l2 และไดรเวอร์ userspace 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 นั้นมีความเสถียรมากกว่าและสามารถดู 800x600 @ 10fps บน iPhone, Android หรือ iSpy ได้อย่างน่าเชื่อถือ h264 นั้นยอดเยี่ยมที่ 1080p 30fps และเราสามารถดูได้ใน vlc โดยใช้--demux h264flag เรายังต้องแปลงรหัสนี้เพื่อใช้บนมือถือหรือฝังเป็น mp4 / webm บนหน้าเว็บ แต่เป็นการก้าวไปข้างหน้าอย่างมีประสิทธิภาพและมีคุณภาพ อย่าสับสนกับ "ไดรเวอร์อื่น ๆ " ของ UV4L ที่ไม่ใช่ลินุกซ์โปรเจ็กต์ที่เป็นขยะ
Piotr Kula

โปรดทราบว่าการเพิ่ม: demux = 264 ในวิธี H264 สำหรับเซิร์ฟเวอร์ 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
ไจเอ็ม

10

สตรีมมิ่งด้วย MJPEG

U4VL

เคอร์เนลอินเตอร์เฟสที่มีบิลด์ในเซิร์ฟเวอร์ HTTP (S)

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

เว็บแคม Raspberry Pi

โครงการที่ดีโดยsilvanmelchiorที่ปรับใช้เว็บเซิร์ฟเวอร์, dvr like, เซิร์ฟเวอร์การสตรีมเป้าหมายหลาย ๆ ต้องการข้อมูลเพิ่มเติม

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

วิธีการดั้งเดิม

การสตรีมด้วย mjpg รองรับเกือบทุกเบราว์เซอร์รวมถึง Internet Explorer 6 กล้องจำนวนมากที่ใช้ก่อน H.264 ใช้ฮาร์ดแวร์ mjpg ซึ่งทิ้งไฟล์ JPEG โดยเร็วที่สุดในโฟลเดอร์ขณะที่ mjpg อ่านไฟล์ลงในบัฟเฟอร์และลบ พวกเขา อุปกรณ์บางอย่างสามารถบรรลุถึง 25 fps และแม้ว่าคุณจะมีการเชื่อมต่อที่ไม่ดีคุณจะได้รับอย่างน้อย 1 fps

การสนับสนุน mjpg ถูกทิ้งในกล้อง HD เพราะไฟล์ JPEG มีขนาดใหญ่เกินกว่าที่จะสตรีมผ่านอินเทอร์เน็ตและ H.264 เป็นโปรโตคอลที่มีคุณภาพดีกว่าและเร็วกว่ามาก

เนื่องจากเราไม่มีวิธีออกอากาศ H.264 โดยใช้โมดูลกล้อง nativly นี่ดูเหมือนว่าเป็นทางเลือกที่ทำงานได้ ...

มันค่อนข้างจะทันใจ แต่อย่าคาดหวังว่าจะได้มากกว่า 1.5 fps นี่มันแย่raspistillมาก ๆ ! การใช้ฟังก์ชั่นไทม์แลปส์ตั้งไว้ที่ 100 ms ซึ่งควรให้ 10 fps เราไม่ทำงานเพราะraspistillเพียงแค่โช้คอัพและมีปัญหาประสิทธิภาพการทำงานที่รุนแรงภายในตัวเอง

  1. เปลี่ยน/tmpเป็น RAM เพื่อความเร็ว/etc/default/tmpfs- เปลี่ยนRAMTMP=yes(นี่คือความพยายามในการเพิ่ม fps แต่ raspistill ไม่สามารถรักษาตัวเองไว้ได้)
  2. Reboot
  3. apt-get git install
  4. apt-get install libjpeg8-dev
  5. apt-get install libv4l-dev
  6. ฉลาด - รับติดตั้ง 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. ตัวเลือกหากคุณมีข้อผิดพลาด
  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_*.soและเพื่อoutput_*.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 ชั่วโมง ... ถอนหายใจแต่ฉันคิดว่าฉันจะใช้มันเพราะฉันสามารถเข้าถึงสตรีมได้จากโทรศัพท์ทุกเครื่องและเบราว์เซอร์ใด ๆ ฉันต้องรอจนกว่าเราจะได้ไดรเวอร์ที่ดีขึ้น ... อีกหนึ่งหรือสองปี :(

ไม่ว่าฉันจะพยายามทำอะไรที่มีคุณภาพฉันก็ไม่ได้เร็วหรือช้ากว่า 1 fps ด้วยการสตรีม ฉันใช้ 720p และ 1080p และคุณภาพของภาพจะดีขึ้น แต่ fps นั้นไม่ต่างกับ LAN ฉันคิดว่าการตั้งค่าขนาดเล็กจะช่วยในเรื่อง WAN / 3G หรือการส่งสัญญาณวิทยุอื่น ๆ

raspistill เขียนภาพไปยังไฟล์เดียว นี่อาจเป็นคอขวด มันเขียนไฟล์ mjpg strreamer อ่านมันและลบมันทำให้เกิดการบล็อก I / O ดังนั้น raspistill จึงไม่สามารถเขียนลงไฟล์ได้

สิ่งเดียวที่ฉันคิดได้ก็คือการใช้ raspivid piped ในFFmpegซึ่งจะสร้างไฟล์ JPEG สำหรับเรา - ฉันต้องลองและอาจเร็วกว่า usign raspistill มาก ฉันจัดการเพื่อรับ 25 fps ที่คุณภาพตกตะลึงและมันล่าช้าประมาณ 10 วินาที ... การปรับการตั้งค่าทำให้ฉันมีค่าประมาณ 3 fps แต่ 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

ฉันอ่านและพบว่าเราสามารถใช้%dในชื่อไฟล์เอาต์พุต raspistill ฉันสงสัยว่าจะเพิ่ม fps หรือไม่ การเข้ารหัส JPG เป็นฮาร์ดแวร์ที่เร่งความเร็วด้วย raspistill ดังนั้นฉันจึงพยายามดิ้นรนเพื่อหาสาเหตุว่าทำไมจึงช้า ...

ฉันได้รับ 2 FPS ที่ส่ายมาใช้%dในชื่อไฟล์ ด้วยเหตุผลบางอย่างการเขียนไฟล์ JPEG ช้าลงอย่างน่ากลัวจาก raspistill ถอนหายใจ


ขอบคุณสำหรับการแบ่งปันความรู้
user566245

10

ตั้งแต่ปี 2560 (หรือก่อนหน้านี้) raspividไม่ใช่วิธีที่ต้องการอีกต่อไปโดย Pi devs แนะนำให้ผู้ใช้ V4L2 แทน

ดังนั้นวิธีการนี้จะช่วยให้คุณสามารถสตรีมผ่านทาง H264 RTP ใช้ V4L2 raspividแทน ฉันสังเกตเห็นวิธีการนี้ส่งผลให้ dropouts น้อยลงและช่วยให้บิตเรตที่สูงขึ้น:

#!/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มีไฟร์วอลล์อยู่ในเครื่องของคุณมิฉะนั้นเมื่อเราเตอร์ถามเครื่องคอมพิวเตอร์ของคุณว่าต้องการรับส่งข้อมูลแบบหลายผู้รับที่พีซีจะไม่ตอบสนองหรือไม่ วิดีโอใด ๆ )

การบันทึกลงดิสก์

ตามที่ฉันพูดถึงการบันทึกในความคิดเห็นด้านล่างฉันจะขยายที่นี่ คุณสามารถใช้คำสั่งเช่นนี้เพื่อบันทึกสตรีมเครือข่ายไปยังดิสก์:

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 เอง) แม้ว่ามันอาจจะทำงานบน Pi เช่นกัน (ยังไม่ทดลอง)

เนื่องจากคุณได้รับไฟล์ใหม่ทุก ๆ 15 นาทีโดยมีวันและเวลาในชื่อไฟล์หมายความว่าหลังจากหนึ่งสัปดาห์คุณจะเริ่มสร้างชื่อไฟล์ที่ใช้ไปแล้วซึ่งทำให้ไฟล์เก่าแก่ที่สุดถูกเขียนทับ กล่าวอีกนัยหนึ่งคุณจะจบลงด้วยการวนรอบของมูลค่าของสัปดาห์ก่อนหน้า เหมาะสำหรับกล้องรักษาความปลอดภัยซึ่งคุณไม่จำเป็นต้องกลับไปนานกว่าหนึ่งสัปดาห์

ตามหมายเหตุด้านนี้จะสร้างไฟล์มูลค่าประมาณ 500GB ดังนั้นคุณอาจต้องการปรับบิตเรตความละเอียดหรือเขียนทับไฟล์เร็วกว่า (พูดทุก ๆ 24 ชั่วโมง) หากคุณไม่ต้องการให้มีพื้นที่มาก


เยี่ยม - ขอบคุณที่แบ่งปันสิ่งนี้ คุณช่วยอธิบายได้ไหมว่าทำไมการใช้มัลติคาสต์จึงจำเป็นที่นี่ จากสิ่งที่ฉันได้เรียนรู้คือ multicast นั้นไม่ค่อยได้ใช้ดังนั้นฉันจึงสงสัยว่ามันจะนำอะไรมาที่โต๊ะตรงนี้? ยัง - สคริปต์ดูดีและฉันแน่ใจว่ามันจะช่วยให้คนจำนวนมาก ขอบคุณ +1
Piotr Kula

1
Multicast เป็นทางเลือก - คุณสามารถแทนที่ที่อยู่ IP ปกติได้หากต้องการ - แต่คุณจะต้องเปลี่ยนคำสั่งเพื่อใช้งานffserverหรือระบบเซิร์ฟเวอร์อื่น ๆ หากคุณต้องการให้เครื่องมากกว่าหนึ่งเครื่องแสดงฟีด หลังจากนั้นอาจมีลูกค้า 2-3 คน (ขึ้นอยู่กับอัตราบิตของวิดีโอ) อะแดปเตอร์อีเธอร์เน็ต USB ของ Pi จะแบนด์วิดธ์ไม่เพียงพอ ด้วยมัลติคาสต์ไม่จำเป็นต้องเรียกใช้เซิร์ฟเวอร์ (เครื่องไคลเอนต์เพียงแค่เลือกว่าจะรับฟังทราฟฟิกหรือไม่สนใจ) เพื่อให้คุณสามารถมีหลายพันเครื่องที่แสดงวิดีโอโดยไม่มีผลกระทบต่อ Pi ซึ่งส่งกระแสวิดีโอเพียงครั้งเดียว .
Malvineous

ขอบคุณที่อธิบาย - แต่มัลติคาสต์ใช้ได้กับเครือข่ายภายในเท่านั้นหรือ หาก ISP ได้รับแพ็คเก็ตมัลติคาสต์พวกเขามักจะดึงมัน - ดังนั้นจึงไม่เหมือนกับที่คุณสามารถถ่ายทอดให้ทุกคนในอินเทอร์เน็ตได้ ฉันคิดว่าถ้าคุณมีเครือข่ายภายในขนาดใหญ่ mulit การส่งกระแสข้อมูลขนาดใหญ่อาจส่งผลกระทบต่อเครือข่ายของคุณหรือไม่ แต่ใช่ .. เพียงแค่ฉันจะดูกระแสฉันจะเพียงแค่ UDP กับ IP ที่เลือก .. แต่ฉันชอบตัวเลือกหลายผู้รับต่อไป: D จะลองและทำมันในสุดสัปดาห์นี้เพราะฉันไม่เคยทำมาก่อน :) ขอบคุณ
Piotr Kula

1
มีมัลติคาสต์เป็นหลักสำหรับเครือข่ายภายใน มันควรจะทำงานได้ดีขึ้นกับ IPv6 แต่ฉันคิดว่ามันจะยังคงต้องการความร่วมมือจาก ISP ฉันใช้มันเพราะมันหมายความว่าฉันไม่จำเป็นต้องเรียกใช้เซิร์ฟเวอร์บน Pi และฉันสามารถดูสตรีมจากเครื่องสองเครื่องที่แตกต่างกันรวมทั้งบันทึกลงดิสก์โดยไม่เปลี่ยนการกำหนดค่าของ Pi หรือโหลดแบนด์วิดท์เครือข่ายของ Pi มากเกินไป หากเครือข่ายภายในของคุณมีขนาดใหญ่คุณอาจต้องใช้สวิตช์ที่ใช้ความสามารถ IGMP ซึ่งออกแบบมาเพื่อส่งข้อมูลแบบมัลติคาสต์เท่านั้นที่จำเป็นต้องใช้เพื่อให้ได้ผลกระทบไม่ต่างจากปกติ
Malvineous

1
ขอบคุณที่อธิบาย .. ตอนนี้ฉันสามารถเห็นประโยชน์มากมายของการใช้มัลติคาสต์กับคำเตือนเล็ก ๆ น้อย ๆ ที่จะไม่ส่งผลกระทบต่อผู้ใช้ที่บ้านจริงๆ ฉันจะลองทำสิ่งนี้อย่างแน่นอน มันเป็นสิ่งที่เรียบง่ายและชัดเจนในบางครั้งที่จำเป็นต้องชี้ให้เห็น และดูที่การอัพเดทของคุณ .. บิตการบันทึกนั้นยอดเยี่ยมจริง ๆ !
Piotr Kula

4

ฉันจัดการเพื่อสตรีมจากราสเบอร์รี่ Pi ของฉันไปยังเว็บเซิร์ฟเวอร์ที่มีการรวบรวมโมดูลNginx-RTMP

หากต้องการบันทึกยุ่งยากกับffmpegผมขอแนะนำให้กระจายกลิ้งเหมือนArch Linux แขน

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

หมายเหตุบางส่วน:

  • สตรีมวิดีโอ H.264 ที่เข้ารหัสด้วยฮาร์ดแวร์จะใช้แบนด์วิดท์ประมาณ300 KB / วินาทีซึ่งถ้าฉันคำนวณถูกต้องจะใช้เวลาอย่างน้อย750 GB ต่อเดือนหากคุณต้องการสตรีมไปยัง nginx-rtmp httpd หรือบริการRTMPเช่นUstream
  • เสียง: ถ้าคุณต้องการที่จะมาพร้อมกับเสียงสตรีม H.264 ของคุณคุณจำเป็นต้องใช้ในAAC โดยทั่วไปRaspberry Pi ช้าเกินไปในการเข้ารหัสไมโครโฟน USB เข้า AAC เกี่ยวกับการบิน

ดังนั้นบนพื้นฐานนี้ฉันคิดว่าการสตรีมสดจาก Raspberry Pi อาจใช้ได้สำหรับการออกอากาศชั่วคราว แต่ไม่ใช่สำหรับเว็บแคมที่เปิดอยู่ตลอดเวลาเนื่องจากมันหิวแบนด์วิดท์เกินไป คุณจะไม่ได้รับเสียงและถ้าคุณทำมันจะเป็นภารกิจที่จะซิงค์

คุณสามารถบันทึกเสียงได้อย่างมีประสิทธิภาพยิ่งขึ้นพร้อมกันเช่นเดียวกับการบันทึกวิดีโอ จากนั้นในภายหลังอาจรวมฟีดเสียงในภายหลังและแปลงเป็นWebMและวางไว้บน httpd ของคุณเป็นไฟล์คงที่ที่มีแท็กวิดีโอ HTML เวิร์กโฟลว์ค่อนข้างน่าอึดอัดใจ แต่มันเป็นสิ่งที่ดีที่สุดที่ฉันสามารถนึกได้สำหรับการถ่ายทอดที่มีประสิทธิภาพซึ่งจะทำงานอย่างไม่เจ็บปวดบนเบราว์เซอร์


1
คุณสามารถควบคุมแบนด์วิดท์และความละเอียดได้ หาก LAN ท้องถิ่นสำหรับสตรีมใช้กล้องวงจรปิดก็ไม่ได้เป็นปัญหา การแพร่ภาพผ่านอินเทอร์เน็ตอาจจำเป็นต้องมีตามต้องการและ / หรือความละเอียดที่ต่ำกว่ามาก แต่เป็นอีกวิธีในการทำ ขอบคุณ +1
Piotr Kula

และมันทำงานอย่างไร? มันไม่ได้สำหรับฉัน ... FFMPEG พูดว่า "RTMP_Connect0, ไม่สามารถเชื่อมต่อซ็อกเก็ต 111 (การเชื่อมต่อถูกปฏิเสธ)"
Flash Thunder

2

UV4Lรองรับการสตรีมเสียงและวิดีโอสดด้วย WebRTC และ HTML5


เพียงแค่อ่านที่ลิงค์ด้านบน ...
Strunz

ทำงานได้ดีจริงๆ!
Piotr Kula

อย่างไร? ลิงก์ไปยังหน้าตัวอย่างนั้นใช้งานไม่ได้ ...
Cerin

ฉันได้ผ่านการสอนเหล่านั้นและฉันสามารถยืนยันได้ว่าพวกเขาไม่ทำงาน
Quintin Balsdon

ฉันสามารถยืนยันได้ว่ามันทำงานได้ตามที่ฉันได้ลองแล้ว .. Instructables.com/id/Raspberry-Pi-Video-Streaming
Tia

2

คำตอบของ Piotr Kulaดูเหมือนจะอยู่ในเส้นทางที่ถูกต้อง แต่ล้าสมัยไปแล้วสำหรับการยืดราสเบอร์รี่

มีคำแนะนำที่อัปเดตสำหรับ uv4l บน Raspberry stretch at

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

คุณสามารถ tweek ตัวเลือก uv4l ผ่าน /etc/uv4l/uv4l-raspicam.conf จากนั้นเริ่มบริการใหม่ด้วย

sudo service uv4l_raspicam restart

ในกรณีของฉันสิ่งต่าง ๆ ไม่ทำงานนอกกรอบ (ถ้าลืมติดตั้ง uv4l-server ... ) ความคิดเห็นต่อไปนี้อาจช่วยให้คุณแก้ปัญหาที่คล้ายกัน

ฉันตรวจสอบว่าเซิร์ฟเวอร์ทำงานด้วย:

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 หรือที่อื่น ๆ ดังนั้นดูเหมือนว่าฉันจะลืมตัวเลือก "- เบื้องหน้า" ซึ่งจำเป็นต้องมี:

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 พบห้องพักผ่านเว็บ ไม่ต้องการการกำหนดค่าพิเศษ มันเป็นเรื่องง่ายเหมือนการกรอกชื่อของคุณห้องพักและคลิกที่เริ่มต้น


คุณใช้เบราว์เซอร์ใด Jitsi รองรับเฉพาะ Chrome, Chromium, Opera และ Firefox เท่านั้นซึ่ง Chromium มีเฉพาะใน Pi เท่านั้น แต่ Chromium ให้webkitRTCPeerConnection is not definedข้อผิดพลาดแก่ฉัน ปกติฉันจะใช้ IceWeasel สำหรับ WebRTC แต่ไม่รองรับ Jitsi
modulitos

1
บน PI ไม่มีเบราว์เซอร์ที่รองรับ WebRTC ยกเว้นการสนับสนุนที่แทบจะขาดใน IceWeasel วิธีที่ฉันใช้คือ: Pi-> Jitsi Server on the Cloud -> พีซีของฉันที่อื่น
prinxis

1
UV4L รองรับการสตรีมสด H264 ที่เข้ารหัสด้วยฮาร์ดแวร์โดยไม่มีความหน่วงแฝง
รินซิส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.