मैं वेब सर्वर के माध्यम से रास्पबेरी पाई कैमरा मॉड्यूल से H.264 वीडियो कैसे स्ट्रीम कर सकता हूं?


50

तो मैं आज रास्पबेरी कैमरा मिला है और चित्र ठीक काम कर रहा है।

JPEG प्रारूप में एक छवि कैप्चर करें:

raspistill -o image.jpg

H.264 प्रारूप में 5-सेकंड का वीडियो कैप्चर करें :

raspivid -o video.h264

मैं कोई अतिरिक्त एप्लिकेशन इंस्टॉल नहीं करना चाहता क्योंकि मैं HTML5 का लाभ उठाना चाहता हूं जो आसानी से उपलब्ध है। चूंकि क्रोम / सफारी ने H.264 के लिए अंतर्निहित डिकोडर बनाए हैं, मैं सिर्फ अपने ब्राउज़र को URL पर इंगित करना चाहता हूं और स्ट्रीम देखना चाहता हूं।

इसे कैसे प्राप्त किया जा सकता है?


2
मैं इस पर भी काम कर रहा हूं। मुझे लगता है कि आप nginx या ऐसा कुछ करने के लिए MP4 समर्थन जोड़ने की जरूरत है। आपको बताएंगे कि क्या मुझे कोई सफलता है।
पुनर्विचार

@recantha क्या आपको वीडियो स्ट्रीमिंग के साथ कोई नई सफलता मिली है?
पायोटर कुला

3
सबसे अच्छा समाधान जो मैंने पाया है वह सिल्वान मेलोचिर के रास्पिएमजेपीईजी पर आधारित है। मेरे ब्लॉग पर एक नज़र डालें जिसमें रास्पबेरी पाई फाउंडेशन के फोरम का लिंक है जो सब कुछ समझाता है। ( recantha.co.uk/blog/?p=11176 )
recantha

2
हाँ जो विभिन्न उपकरणों को स्ट्रीम करने में सक्षम होने के लिए भयानक लगता है। एफपीएस और लैग क्या मिलता है ?? मैंने वीएलसी के साथ अच्छी तरह से और ओएसडी के साथ काम करने के लिए uv4l प्राप्त करने का प्रबंधन किया। एक बहुत ही छोटा और खराब डेमो। जल्द ही एक बेहतर कर देगा। घंटों परीक्षण और त्रुटि के बाद देर रात बनाया गया था। youtu.be/LO10Ytlauag
पिओट्र कुला

RppiMJPEG चल रहा है, जबकि @ppumkin मैं एक अजगर स्क्रिप्ट के माध्यम से कैसे रिकॉर्ड कर सकता हूं? यह एक शुरुआत रिकॉर्डिंग वीडियो देता है, लेकिन यह .h264 प्रारूप में रिकॉर्ड करता है कि कैसे start_re रिकॉर्डिंग पर एक पायथन स्क्रिप्ट चला सकते हैं?
कोडरेमोन

जवाबों:


32

एचएलएस के साथ स्ट्रीमिंग

लाइव वीडियो स्ट्रीमिंग के लिए Apple का मालिकाना तरीका। इसे HTTP लाइव स्ट्रीमिंग (HLS) कहा जाता है और यह केवल Apple की तकनीक द्वारा समर्थित है। Google (क्रोमियम / यूट्यूब) अपने स्वयं के कार्यान्वयन का उपयोग करता है जिसे डैश एमपीईजी कहा जाता है और बाकी सभी या तो भ्रमित होते हैं या MP4 में एच .264 का उपयोग करते हैं

पेशेवरों

  • Playlists का समर्थन करने वाले किसी भी डिवाइस पर LAN पर HD 1080p को स्ट्रीम कर सकते हैं.m3u8
  • HTML5 शब्दार्थ का उपयोग करता है (लेकिन यह मानकीकृत प्रारूप नहीं है)
  • थर्ड-पार्टी प्रीमियम सॉफ्टवेयर जैसे jwplayer 6 में कुछ समर्थन का उपयोग किया जा सकता है

कान्स

  • कम से कम 5 सेकंड की देरी है (इस एप्लिकेशन में, लेकिन iPhone से AppleTv तक मिररिंग का उपयोग करके वे किसी भी तरह 50 एमएस - 500 एमएस प्राप्त करते हैं)। इसलिए यह रिमोट नियंत्रित अनुप्रयोगों के लिए अच्छा नहीं है, जहां तत्काल प्रतिक्रियाओं की आवश्यकता होती है, अर्थात रोबोट या हेलीकॉप्टर।
  • यदि आप व्यापक ब्राउज़र समर्थन को फ्लैश करना चाहते हैं जो तृतीय-पक्ष सॉफ़्टवेयर के लिए भुगतान करना है।

m3u8

  • .m3u8M3U प्रारूप का केवल UTF-8 संस्करण है। (.m3u फ़ाइलों में विभिन्न एन्कोडिंग हो सकते हैं।) कुछ लोग दावा करते हैं कि .m3u8 से .m3u का नाम बदलना सभी HTML5 ब्राउज़रों पर अपेक्षित रूप से काम करेगा। मैंने यह कोशिश की, और यह मेरे काम नहीं आया।

इस स्ट्रीमिंग के पीछे की अवधारणा यह है कि कम से कम 5 सेकंड लंबी फाइलें (इस उदाहरण में - इसे संभव करने के लिए नए तरीके उपलब्ध हैं) इसे रिकॉर्ड किया गया है और एक उचित फ़ाइल में सहेजा गया है। प्लेलिस्ट फ़ाइल को नए फ़ाइल नाम के साथ अपडेट किया जाता है और क्लाइंट हमेशा इस प्लेलिस्ट को पोल करता है और सबसे हाल की फ़ाइल को डाउनलोड करता है। क्लाइंट पर मूल रूप से वीडियो को मर्ज करने के लिए कुछ मैकेनिक्स शामिल हैं। यही कारण है कि अन्य डेवलपर्स इसे लागू नहीं करना चाहते हैं क्योंकि इसके लिए बहुत अधिक प्रयास की आवश्यकता होती है और यह एचटीएमएल 5 मानकों का अनुपालन नहीं करता है (भले ही लाइव स्ट्रीम के लिए उचित एचटीएमएल 5 मानक नहीं है । एह, आह )।

स्थापित कर रहा है

आपको संकलन करने की आवश्यकता है ffmpeg- FFmpeg के लिए उपयोग न करेंapt-get install

यह 5 घंटे तक लग सकते हैं - यह है संस्करण 1.1 या उच्चतर जो खंड स्ट्रीमिंग का समर्थन करता हो। आप इसे क्लोन करने और इसे संकलित करने के लिए इसका उपयोग कर सकते हैं।

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

cd ffmpeg
./configure
make && make install
  • Nginx (इंजन-एक्स) स्थापित करें - 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 में गिर जाता है । गुणवत्ता वास्तव में अद्भुत है!
  • विंडोज सफारी, ठीक धाराओं।
  • Macintosh या Windows, QuickTime। धाराएँ ठीक हैं।
  • एंड्रॉइड 2.3.5 और काम नहीं किया, लेकिन 2.1.x के बाद से इसका समर्थन किया जाना था
  • विंडोज, क्रोम - कुछ भी नहीं
  • विंडोज, इंटरनेट एक्सप्लोरर 10 --- कुछ भी नहीं (असमर्थित वीडियो प्रकार)
  • विंडोज, वीएलसी मीडिया प्लेयर - कुछ नहीं

संदर्भ: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade##551392

मूल कोड: https://github.com/AndyA/psips/blob/master/examples/hls.sh


Ffmpeg के संकलन को गति देने के संबंध में , RPI की कम कम्प्यूटेशनल क्षमता और ffmpeg के लिए लंबे संकलन समय को दरकिनार करने के लिए, मैंने क्यूमू को व्हीज़ के साथ उपयोग करने का प्रयास किया है, लेकिन लॉग इन करने में कुछ बाधा आई है, और एक आर्क छवि के साथ प्रयास करना पड़ा । यह काम किया। VirtualBo
luboP

2
क्या पुराने सेगमेंट को स्वचालित रूप से हटाने का कोई तरीका है? एसडी कार्ड कुछ समय बाद फुल हो जाता है। मैं यह भी चाहूंगा कि उन्हें डिलीट कर दिया जाए, मैं इसे एक tmpfs पर चला सकता हूं और एसडी कार्ड को बर्बाद नहीं कर सकता।
डिममे

2
@Dimme यदि आप -segment_wrap 10ffmpeg के तर्क के रूप में जोड़ते हैं तो यह अधिकतम 10 खंड फ़ाइलों का उपयोग करेगा।
ग्रिगर्स

किसी को भी यह काम करने के लिए मिल गया है? फ़ाइलें बनाई जाती हैं, लेकिन SPS / PPS की जानकारी याद आती है, इसलिए वीडियो iOS सफारी और VLC में नहीं चलेगा। segments/सेगमेंट-फाइलों की ओर इशारा करते समय stream.m3u8 भी शामिल नहीं था , इसलिए मैंने सेगमेंट फ़ोल्डर को छोड़ दिया। क्या मुझे कुछ गलत समझ में आया?
gregers

आपको PSIPS फ़िल्टर बाइनरी के माध्यम से स्ट्रीम को पाइप करने की आवश्यकता है। रास्पिकैम का नवीनतम संस्करण ऐसा करने वाला था .. लेकिन किसी कारण से मैं इसे बिना PSIPS के काम नहीं कर पाया
Piotr Kula

23

UV4L MMAL

लिनक्स-प्रोजेक्ट्स V4L2 ड्राइवर पर अपडेट के लिए @mpromonet से टिप्पणी करने के लिए धन्यवाद कि अब MMAL को बहुत कुशलता से लागू करता है - लेकिन यह अभी भी प्रगति पर है।

लिनक्स-प्रोजेक्ट रिपॉजिटरी को स्थापित करने और यूवी 4 एल ड्राइवर को एक्स्ट्रा के साथ स्थापित करने के लिए इन निर्देशों का पालन करें । फिर सर्वर और mjpeg स्थापित करें। आप चाहें तो दूसरों के साथ भी प्रयोग कर सकते हैं।

सब कुछ इंस्टॉल करने के बाद, आप HTTP सर्वर को पोर्ट 8080 पर एक्सेस कर सकते हैं। आपको /etc/uv4l/confफ़ाइल और चेक भी सेट करना चाहिए, यदि आप mjpeg या H.264 चाहते हैं क्योंकि इससे कुछ फर्क पड़ता है, लेकिन आप अंतर्निहित वेब के माध्यम से कुछ सेटिंग्स समायोजित कर सकते हैं सर्वर।

HTML 5

यह वही है जिसका हम सभी इंतजार कर रहे थे (जिसे वेबआरटीसी कहा जाता है ) और नए ड्राइवर के लिए धन्यवाद यह बहुत अच्छा काम करता है (रास्पबेरी पाई 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

फिर अपने रास्पबेरी पाई 2 पर इसे स्थापित करें WebRTC (रास्पबेरी पाई 1 के लिए, अन्य विकल्पों के लिए लिंक की गई साइट पढ़ें)

sudo apt-get install uv4l-webrtc

सभी ड्राइवरों को पुनरारंभ करें और जाएं

http://raspberry:8080/

अब आपके पास क्रोम या फ़ायरफ़ॉक्स जैसे आधुनिक ब्राउज़र में कम-विलंबता, उच्च-गुणवत्ता वाली वीडियो स्ट्रीमिंग प्रत्यक्ष है। (शायद सफारी, लेकिन मैं जांच नहीं कर सकता क्योंकि वे Winblows नहीं करते हैं और इंटरनेट एक्सप्लोरर ... एह)

MJPEG

डिफ़ॉल्ट रूप से, यह mjpeg1080p पर उपयोग करता है , और यह बहुत सुस्त है। मैंने इसे 800x600 फ्रेम किया और वीडियो को प्रोसेस करने के लिए iSpy जैसी किसी चीज़ का उपयोग किया। सुरक्षा के लिए, मुझे एक कुरकुरा वीडियो पर लगभग 10 एफपीएस मिलते हैं। यह इस चालक से पहले 640x480 पर 3 एफपीएस से बेहतर है। यह सफारी, एंड्रॉइड क्रोम और लगभग सभी चीजों के साथ iPhone पर काम करता है।

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

इसका मतलब यह भी है कि motionमुझे (अभी भी परीक्षण करने और तुलना करने की आवश्यकता है) बहुत बेहतर काम करना चाहिए। उपयोग करने के लिए कॉन्फ़िगरेशन सेट करना सुनिश्चित करें v4l2_palette 8याv4l2_palette 2

264

यह अब "स्ट्रीमिंग" के लिए तय कर दिया गया है, और हमें वीएलसी मीडिया प्लेयर के माध्यम से एच .264 वीडियो देखने के लिए महान लंबाई तक जाने की आवश्यकता नहीं है । धारा RAW H.264 sill है, इसलिए यदि आपको कहीं और काम करने की आवश्यकता है, तो आपको इसे डीकोड या ट्रांसकोड / इनकैप्सुलेट करना होगा। bitrate=xxxxxxयदि आप वाई-फाई पर स्ट्रीमिंग कर रहे हैं तो आपको कॉन्फ़िगरेशन फ़ाइल में ट्वीक करना चाहिए ।

VLC मीडिया प्लेयर में, आपको यह बताना होगा कि आप H.264 डिमॉक्सर का उपयोग करना चाहते हैं। इसलिए यदि आप GUI का उपयोग कर रहे हैं, तो तर्क जोड़ना सुनिश्चित करें :demux=264। , कमांड लाइन से vlc http.../video.h264 --demux h264। अन्यथा, आपको बस एक खाली स्क्रीन दिखाई देगी, भले ही कैमरा एलईडी चालू हो।

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

देखा! लगभग 500 एमएस लैग (ट्विकिंग के साथ, डाउन डाउन 200 एमएस) के साथ एचडी स्ट्रीमिंग। यह पुराने तरीकों का उपयोग करने की तुलना में निश्चित रूप से बहुत आसान है। गुणवत्ता और FPS शानदार है, लेकिन आप इसे HTML5 में MP4 या WebM को ट्रांसकोड किए बिना एम्बेड नहीं कर सकते । मुझे उम्मीद है कि इसे लागू किया जाएगा क्योंकि यह वास्तव में इसे एक महान स्टैंडअलोन सर्वर बना देगा।

RTSP / RTMP / आरटीपी

समर्थित / कार्यान्वित नहीं

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

HLS

समर्थित / कार्यान्वित नहीं


video4linuxअभी तक कोई चालक उपलब्ध नहीं है। इसका अर्थ यह है कि हम USB वेब कैमरा की तरह डेटा का उपयोग करने या उसे बदलने के लिए ffserver का उपयोग नहीं कर सकते हैं /dev/video0

यही कारण है कि एचटीएमएल 5 ब्राउज़रों के लिए उचित लाइव स्ट्रीमिंग ढूंढना इतना मुश्किल है।


अब video4linuxड्राइवर आधिकारिक V4L2 ड्राइवर bcm2835-v4l2 और यूजरस्पेस V4L2 ड्राइवर है [ linux-projects.org/modules/sections/…
MPromonet

एक असली v4l चालक है या यह सिर्फ raspivid के आसपास रैपर है जो भयानक प्रदर्शन देता है?
पायोटर कुला

1
आधिकारिक चालक MMAL इंटरफ़ेस का उपयोग करते हैं, स्रोत कोड [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… देखें । प्रदर्शन सही लगता है।
एमप्रोमोनेट

मैं अब 3 दिन से इसके साथ खेल रहा हूं। Mjpeg एनकोडिंग अधिक स्थिर है और iPhone, Android या iSpy पर 800x600 @ 10fps को मज़बूती से देख सकता है। h264 1080p 30fps पर बहुत अच्छा है और हम इसे vlc में --demux h264ध्वज का उपयोग करके देख सकते हैं । हमें अभी भी इसे मोबाइल पर उपयोग करने या वेबपेज पर mp4 / webm के रूप में एम्बेड करने की आवश्यकता है। लेकिन यह वास्तव में कुशलतापूर्वक और गुणवत्ता में महान कदम है। "अन्य" UV4L गैर-लाइनक्स-प्रोजेक्ट ड्रायवर चीज़ जो बकवास है, के साथ भ्रमित न करें।
पायोटर कुला

ध्यान दें कि जोड़ने: 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
Jaime M.

10

MJPEG के साथ स्ट्रीमिंग

U4VL

HTTP (S) सर्वर में एक बिल्ड के साथ एक कर्नेल इंटरफ़ेस।

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

रास्पबेरी पाई कैम वेब इंटरफ़ेस

सिल्वेनमेलचेयर द्वारा एक अच्छी परियोजना जो एक वेब सर्वर, डीवीआर जैसे, मल्टी टारगेट स्ट्रीमिंग सर्वर को दर्शाती है। अधिक जानकारी की आवश्यकता है

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

विरासत विधि

Mjpg के साथ स्ट्रीमिंग इंटरनेट एक्सप्लोरर सहित लगभग सभी ब्राउज़रों द्वारा समर्थित है। H.264 से पहले उपयोग किए जाने वाले बहुत सारे कैमरे हार्डवेयर mjpg का उपयोग करते हैं, जो अनिवार्य रूप से JPEG फ़ाइलों को एक फ़ोल्डर में जितनी जल्दी हो सके डंप कर देता है जबकि mjpg फ़ाइल को बफर में हटा देता है और हटा दिया जाता है उन्हें। कुछ डिवाइस 25 एफपीएस तक प्राप्त कर सकते हैं और यहां तक ​​कि अगर आपके पास खराब कनेक्शन था तो आपको कम से कम 1 एफपीएस मिलेगा।

Mjpg के लिए समर्थन HD कैमरों में गिरा दिया गया था क्योंकि JPEG फ़ाइल बस इंटरनेट पर स्ट्रीम करने के लिए बहुत बड़ी हो गई थी और H.264 एक बहुत तेज़ और बेहतर गुणवत्ता वाला प्रोटोकॉल है।

चूँकि हमारे पास H.264 को प्रसारित करने का कोई तरीका नहीं है, इसलिए कैमरा मॉड्यूल का उपयोग करते हुए nativly यह एक व्यवहार्य गिरावट की तरह लगता है ...

यह बहुत ही तात्कालिक है, लेकिन 1.5 एफपीएस से अधिक प्राप्त करने की उम्मीद नहीं है। यह raspistillबेहद कम होने के लिए नीचे है ! 100 एमएस में सेट किए गए टाइम-लैप्स फंक्शन का उपयोग करना, जो हमें 10 एफपीएस देना चाहिए, काम नहीं करता है क्योंकि raspistillसिर्फ चुटकुले हैं और अपने भीतर गंभीर प्रदर्शन के मुद्दे हैं।

  1. /tmpगति के लिए रैम का उपयोग करने के लिए बदलें /etc/default/tmpfs- परिवर्तन RAMTMP=yes(यह एफपीएस बढ़ाने का एक प्रयास है, लेकिन रास्पिस्टिल बस अपने आप को नहीं रख सकता है।)
  2. रीबूट
  3. apt-get install गिट
  4. apt-get libjpeg8-dev स्थापित करें
  5. apt-get install libv4l-dev
  6. apt-get imagemagick इंस्टॉल करें
  7. सीडी /usr/src, mkdir mjpg-streamer, सीडी 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 एफपीएस से अधिक तेज या कोई धीमा नहीं मिलता है। मैंने 720p और 1080p का उपयोग किया है और केवल छवि गुणवत्ता बेहतर हो जाती है, लेकिन एफपीएस लैन पर कोई अंतर नहीं है। मुझे लगता है कि छोटे सेटिंग्स WAN / 3G या अन्य रेडियो प्रसारण के साथ मदद करेंगे।

raspistill छवि को एक फ़ाइल में लिखता है। यह अड़चन हो सकती है। यह फ़ाइल को लिखता है, mjpg स्ट्रैमर इसे पढ़ता है और इसे हटाने के कारण एक अवरुद्ध I / O हो जाता है, इसलिए raspistill फ़ाइल को नहीं लिख सकता है।

केवल एक चीज जिसके बारे में मैं सोच सकता हूं कि FFmpeg में रस्पिविड पाइप का उपयोग किया जा रहा है जो हमारे लिए JPEG फाइलें बनाएगा - मुझे यह प्रयास करने की आवश्यकता है और संभवतः यह usign raspistill की तुलना में बहुत तेज है। मैं एक चौंकाने वाली गुणवत्ता पर 25 एफपीएस प्राप्त करने में कामयाब रहा, और इसमें लगभग 10 सेकंड की देरी हुई ... सेटिंग्स को मोड़ने से मुझे लगभग 3 एफपीएस मिला, लेकिन 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 आउटपुट फ़ाइल नाम में उपयोग कर सकते हैं । मुझे आश्चर्य है कि अगर यह एफपीएस को बढ़ावा देगा। इसके अलावा JPG एन्कोडिंग हार्डवेयर raspistill में त्वरित है, इसलिए मैं वास्तव में यह पता लगाने के लिए संघर्ष कर रहा हूं कि यह इतना धीमा क्यों है ...

मैं %dफ़ाइल नाम का उपयोग कर एक चौंका देने वाला 2 FPS मिला । किसी कारण से, जेपीईजी फ़ाइल को लिखना रास्पिस्टिल से बहुत धीमा है। आह।


ज्ञान साझा करने के लिए धन्यवाद
user566245

10

2017 के रूप में (या शायद पहले) raspividअब पसंदीदा तरीका नहीं है, पाई देवों के साथ लोगों को V4L2 का उपयोग करने की सलाह देते हैं।

इसलिए यह विधि आपको R4 के माध्यम से V4L2 का उपयोग करके R2 के माध्यम से 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जितना संभव हो उतनी तेजी से वीडियो चलाया जा सकता है, इसलिए यह वास्तविक समय में चलेगा, क्योंकि एक निश्चित फ्रैमरेट में इसे चलाने का विरोध किया जाता है और अगर पाई इस से अधिक तेजी से फ्रेम कैप्चर कर रहा है। इस पद्धति के साथ अभी भी कुछ अंतराल है, लेकिन अन्य 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 = सोमवार, आदि) का उपयोग करते हैं Tऔर उसके बाद एक समय। यह हर 15 मिनट में एक नई फ़ाइल शुरू करता है।

बस स्पष्ट होने के लिए, यह रिकॉर्डिंग कमांड एक दूरस्थ पीसी (पीआई पर नहीं) पर चलाने के लिए है, हालांकि यह संभवत: पाई पर भी काम करेगा (अनट्रेडेड)।

चूंकि आपको फ़ाइल नाम में दिन और समय के साथ हर 15 मिनट में एक नई फ़ाइल मिलती है, इसका मतलब है कि एक सप्ताह के बाद आप उन फ़ाइलनामों को उत्पन्न करना शुरू कर देंगे जिनका उपयोग पहले ही किया जा चुका है, जिससे सबसे पुरानी फाइलें अधिलेखित हो जाती हैं। दूसरे शब्दों में, आप पिछले सप्ताह के फुटेज के मूल्य के रोलिंग लूप के साथ समाप्त होंगे। यह एक सुरक्षा कैमरे के लिए आदर्श है जहाँ आपको एक सप्ताह से अधिक समय तक वापस जाने की आवश्यकता नहीं होगी।

एक साइड नोट के रूप में यह लगभग 500GB मूल्य की फाइलों का उत्पादन करता है, इसलिए आप चाहें तो बिटरेट, रिज़ॉल्यूशन को समायोजित कर सकते हैं या फ़ाइलों को जल्द ही अधिलेखित कर सकते हैं (हर 24 घंटे में) यदि आप उन्हें इतना स्थान नहीं लेना चाहते हैं।


कूल - इसे साझा करने के लिए धन्यवाद। क्या आप बता सकते हैं कि मल्टीकास्ट का उपयोग यहाँ क्यों आवश्यक है? मैंने जो सीखा है, वह यह है कि मल्टीकास्ट का उपयोग शायद ही कभी किया जाता है - इसलिए मैं सोच रहा था कि यह यहां टेबल पर क्या लाता है? फिर भी - स्क्रिप्ट बहुत अच्छी लग रही है और मुझे यकीन है कि यह लोगों को आवंटित करने में मदद करेगी। धन्यवाद +1
पिओटर कुल

1
मल्टीकास्ट वैकल्पिक है - यदि आप चाहें तो आप केवल एक सामान्य आईपी पते को स्थानापन्न कर सकते हैं - लेकिन ffserverयदि आप फ़ीड प्रदर्शित करने के लिए एक से अधिक मशीन चाहते हैं, तो आपको उपयोग करने के लिए कमांड या किसी अन्य सर्वर सिस्टम को बदलना होगा । फिर शायद 2-3 क्लाइंट (वीडियो बिटरेट के आधार पर) के बाद पीयू का यूएसबी ईथरनेट एडाप्टर बैंडविड्थ से बाहर हो जाएगा। मल्टीकास्ट के साथ सर्वर चलाने की कोई आवश्यकता नहीं है (क्लाइंट मशीन सिर्फ ट्रैफिक को सुनने या इसे अनदेखा करने के लिए चुनते हैं) ताकि आपके पास पाई पर कोई प्रभाव न दिखाते हुए वीडियो प्रदर्शित करने वाली हजारों मशीनें हो सकती हैं, जो कभी भी केवल एक वीडियो स्ट्रीम भेजती हैं ।
मालविनस

समझाने के लिए धन्यवाद - लेकिन मल्टीकास्ट केवल आंतरिक नेटवर्क पर काम करता है? यदि एक ISP को एक मल्टीकास्ट पैकेट मिलता है, तो वे आमतौर पर इसे छीन लेते हैं- तो ऐसा नहीं है कि आप इंटरनेट में हर किसी को प्रसारित कर सकते हैं। मुझे लगता है कि अगर आपको एक बड़ा आंतरिक नेटवर्क मिला है, तो एक बड़ी धारा को पिघलाने से आपके नेटवर्क पर भी असर पड़ सकता है? लेकिन हाँ .. मेरे लिए एक स्ट्रीम देखने के लिए मैं सिर्फ एक चयनित आईपी के लिए यूडीपी होगा .. लेकिन मुझे वैसे भी मल्टीकास्ट विकल्प पसंद है: डी इस सप्ताह के अंत में कोशिश करेंगे और ऐसा सिर्फ इसलिए करेंगे क्योंकि मैंने पहले कभी ऐसा नहीं किया था। :) धन्यवाद
कुला

1
हां मल्टीकास्ट मुख्य रूप से आंतरिक नेटवर्क के लिए है। यह IPv6 के साथ बेहतर काम करने वाला है, लेकिन मुझे लगता है कि इसे अभी भी ISP से सहयोग की आवश्यकता होगी। मैं इसका उपयोग करता हूं क्योंकि इसका मतलब है कि मुझे Pi पर सर्वर चलाने की आवश्यकता नहीं है, और मैं दो अलग-अलग मशीनों से धाराएं देख सकता हूं और पाई के कॉन्फ़िगरेशन को बदलने के बिना डिस्क पर रिकॉर्ड कर सकता हूं, या Pi के नेटवर्क बैंडविड्थ को ओवरलोड कर सकता हूं। यदि आपका आंतरिक नेटवर्क बड़ा है, तो आप शायद IGMP- सक्षम स्विच का उपयोग कर रहे हैं, जो केवल मल्टीकास्ट ट्रैफ़िक भेजने के लिए डिज़ाइन किए गए हैं, जहां प्रभाव को सामान्य से अलग नहीं बनाने की आवश्यकता है।
माल्विनस

1
समझाने के लिए धन्यवाद .. मैं अब मामूली कैवेट के साथ मल्टीकास्ट का उपयोग करने के कई लाभ देख सकता हूं जो घर उपयोगकर्ताओं को वास्तव में प्रभावित नहीं करेगा। मैं इसे जरूर आजमाऊंगा। यह कभी-कभी सरल और स्पष्ट चीजें हैं जिन्हें समझ में लाने के लिए इंगित करने की आवश्यकता होती है। और आपके अपडेट को देखते हुए .. रिकॉर्डिंग बिट वास्तव में वास्तव में बहुत अच्छा है!
पायोटर कुला

4

मैं अपने रास्पबेरी पाई से एक वेब सर्वर पर संकलित-इन-मॉड्यूल nginx-rtmp के साथ स्ट्रीम करने में कामयाब रहा ।

परेशानियों से बचाने के लिए ffmpeg, मैं आर्क लिनक्स आर्म की तरह एक रोलिंग वितरण की सलाह देता हूं ।

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

कुछ नोट:

तो इस आधार पर, मुझे लगता है कि एक रास्पबेरी पाई से लाइव स्ट्रीमिंग एक अस्थायी प्रसारण के लिए ठीक हो सकती है, लेकिन हमेशा के लिए वेब कैम पर नहीं क्योंकि यह बहुत अधिक भूखा है। आपको ऑडियो नहीं मिलेगा और यदि आप करते हैं, तो यह सिंक करने के लिए एक मिशन होगा।

आप रिकॉर्डिंग वीडियो के रूप में एक ही समय में अलग से अधिक कुशलता से ऑडियो रिकॉर्ड कर सकते हैं। फिर बाद में शायद बाद में ऑडियो फ़ीड को मक्स करें और इसे वेबएम में परिवर्तित करें और इसे HTML वीडियो टैग के साथ एक स्थिर फ़ाइल के रूप में अपने httpd पर रखें। वर्कफ़्लो बहुत अजीब है, हालांकि यह सबसे अच्छा है जो मैं एक कुशल प्रसारण के लिए सोच सकता हूं जो ब्राउज़रों में दर्द रहित रूप से काम करेगा।


1
आप बैंडविड्थ और रिज़ॉल्यूशन को नियंत्रित कर सकते हैं। अगर सीसीटीवी के लिए इसकी स्थानीय लैन स्ट्रीमिंग का उपयोग किया जाता है, तो समस्या भी नहीं है। इंटरनेट पर प्रसारण मांग और / या बहुत कम संकल्प पर होना चाहिए। लेकिन इसका एक और तरीका है। धन्यवाद +1
पिओट्र कुला

और यह कैसे काम करता है? यह मेरे लिए नहीं है ... FFMPEG कहते हैं "RTMP_Connect0, सॉकेट कनेक्ट करने में विफल। 111 (कनेक्शन ने इनकार कर दिया)"
फ्लैश थंडर

2

UV4L अब WebRTC और HTML5 के साथ लाइव ऑडियो और वीडियो स्ट्रीमिंग का समर्थन करता है।


बस ऊपर दिए गए लिंक को पढ़ें ...
Strunz

वास्तव में अच्छी तरह से काम करता है!
पायोटर कुला

कैसे? इसके उदाहरण पृष्ठ का लिंक टूट गया है ...
सेरिन

मैं उन ट्यूटोरियल के माध्यम से गया हूं और मैं पुष्टि कर सकता हूं कि वे काम नहीं करते हैं
क्विंटिन बाल्सडन

मैं पुष्टि कर सकता हूं कि यह काम करता है जैसा कि मैंने इसे करने की कोशिश की है .. अनुदेशक
Tia

2

पायोटर कुला का जवाब सही रास्ते पर है लेकिन रास्पबेरी खिंचाव के लिए पुराना है।

रास्पबेरी खिंचाव पर 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 के विकल्प चुन सकते हैं और उसके बाद सेवा को पुनः आरंभ कर सकते हैं

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 या अन्य पोर्ट पर नहीं चल रहा है। तो ऐसा लगता है कि मैं "- अग्रभूमि" विकल्प भूल गया, जो मैन पेज स्टेट्स आवश्यक है:

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 बदलें)

रिबूट के बाद यह एक और कमांड में प्रवेश करने के साथ काम किया।


1

UV4L अब समर्थन करता है, को लाइव ऑडियो और वीडियो प्रसारण के लिए वेब पर Jitsi मिलिए कमरे। कोई विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं है। अपना नाम, कमरा भरना और स्टार्ट पर क्लिक करना उतना ही आसान है ।


आप किस ब्राउज़र का उपयोग कर रहे हैं? Jitsi केवल क्रोम, क्रोमियम, ओपेरा, और फ़ायरफ़ॉक्स NIghtly का समर्थन करता है, जिनमें से केवल क्रोमियम Pi पर उपलब्ध है। लेकिन क्रोमियम मुझे एक webkitRTCPeerConnection is not definedत्रुटि देता है। मैं आमतौर पर WebRTC के लिए IceWeasel का उपयोग करता हूं, लेकिन यह Jitsi के लिए समर्थित नहीं है।
modulitos

1
PI पर कोई ब्राउज़र नहीं है जो WebRTC का समर्थन कर रहा है, सिवाय IceWeasel में लगभग टूटे हुए समर्थन के। जिस तरह से मैं इसका इस्तेमाल कर रहा हूं वह यह है: Pi-> Jitsi Server ऑन द क्लाउड -> मेरे पीसी कहीं और
prinxis

1
UV4L हार्डवेयर-एन्कोडेड H264 लाइव स्ट्रीमिंग का समर्थन करता है जिसमें कोई विलंबता नहीं है।
प्रिंसीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.