Kysymys:
Voinko tallentaa 24 tunnin videon Raspberry Pi -kameramoduulilla?
Joel
2015-01-11 05:59:51 UTC
view on stackexchange narkive permalink

Ottaen huomioon, että minulla on riittävän suuri SD-kortti, onko teoreettisesti mahdollista tallentaa 24 tunnin video kameramoduulilla vai onko tallennuksen kesto rajoitettu? Onko kukaan kokeillut tätä?

Luuletko, että 64 Gt riittää 360p-tallennuslaadulle?

Kaksi vastused:
Dave Jones
2015-01-12 05:25:15 UTC
view on stackexchange narkive permalink

Minun on myönnettävä, etten ollut tietoinen raspividin 2Gb: n rajoituksesta (mainittu Linuksen vastauksessa). Vaihtoehto (jos et halua kääntää käyttäjämaata uudelleen) olisi käyttää picameraa (Python tukee 64-bittisiä tiedostoviitteitä heti laatikosta). Esimerkiksi seuraavien tulisi nauhoittaa laajakuvanäyttöinen 360p-video H.264: ssä iloisesti 24 tunnin ajan:

  Tuo picamerawith picamera.PiCamera () as camera: camera.resolution = (640, 360) camera.framerate = 24 camera.start_recording ('one_day.h264') camera.wait_recording (24 * 60 * 60) camera.stop_recording ()  

Seuraava kysymyksen osa on, mahtuuko se 64 Gt: n SD-kortille. Minun haaveeni on "luultavasti", mutta tarkistetaan, että ...

Pi: n H.264-kooderille voidaan antaa bittinopeusrajoitus piccode start_recording-parametrin bitrate avulla. -menetelmä tai --bitrate -parametri raspivid-muodossa. Sekä raspividissa että picamerassa tämän oletuksena on 17 Mbps (megabittiä sekunnissa), joten oletusasetuksella nauhoitettu 24 tunnin video ei teoriassa voi olla suurempi kuin:

  24 tuntia * 60 minuuttia tunnissa * 60 sekuntia minuutissa * 17000000 bittiä sekunnissa / 8 bittiä tavua / 1073741824 tavua keikkaa kohden ---------- 170,990825 Gb  

Hmm ... se on suurempi kuin odotin, mutta okei. Yksi asia, joka on pidettävä mielessä, on se, että oletusarvo 17 Mbps on tarkoitettu käyttämään oletusarvoista tallennustarkkuutta, joka on täysi 1080p raspividin tapauksessa (vaikka picamera oletusarvoisesti on näytön resoluutio tai 720p, jos näyttöä ei näy tuntui "ystävällisemmältä", kun kirjoitin sen). Jos nauhoitat vain 360p: n nopeudella, pääset todennäköisesti paljon pienemmällä bittinopeusrajalla.

Toinen asia, joka on pidettävä mielessä, on se, että bittinopeuden raja on juuri tämä: yläraja. Jos kooderi ei tarvitse kaikkia 17 miljoonaa bittiä riittävän hyvän esityksen tuottamiseksi yhden sekunnin arvosta, se ei käytä niin monta. Pystymällä kooderin kvantisointiin (joka on parametri quality picamerassa ja --qp -parametri raspivid-muodossa), voimme myös säätää kooderin ajatusta siitä, mikä "tarpeeksi hyvä" "tarkoittaa. Laatua edustaa arvo välillä 0 ja 40. Pienemmät arvot tarkoittavat parempaa laatua, joten 1 on mielettömän hyvä ja 40 on naurettavan huono. Tyypilliset "riittävän hyvät" arvot ovat noin 20-25. Arvo 0 (joka on myös oletusarvo) näyttää olevan erityinen; En ole varma, mitä se tarkoittaa kooderille (sinun on kysyttävä laiteohjelmiston kehittäjiltä), mutta se näyttää tuottavan samanlaista laatua kuin arvot noin 15-20 (ts. Erittäin hyvä).

Joten, jos oletetaan keskimääräinen laatu (sanotaan 20), minkälainen bittinopeus meidän on tallennettava laajakuvanäytöllä varustetulle 360p-videolle? Suoritin seuraavan raspivid komentorivin kahdesti tallentaakseni 30 sekunnin videon, sitten vietin ensimmäisen tallennuksen heiluttaen kameraa ympäri (olettaen, että enemmän liikettä tarkoittaa enemmän kaistanleveyttä ja haluamme testata rajat täällä), ja toisen näkymän ollessa täysin staattinen:

  raspivid --width 640 --height 360 --framerate 24 --bitrate 17000000 --qp 20 --timeout 30000 --output test.h264  

Tuloksena olevat tiedostot olivat kooltaan 673675 tavua (658 kt) ja 2804555 tavua (2,7 Mt), joten kooderin tuottamat bittinopeudet olivat:

  673675 tavua * 8 bittiä tavua / 30 sekuntia -------- 179646,6 bittiä sekunnissa (staattinen näkymä) 2804555 tavua * 8 bittiä tavua / 30 sekuntia ------- - 747881,3 bittiä sekunnissa (täysi liike)  

Yhdistämällä nämä arvot yllä olevaan yhtälöön voimme siis realistisesti odottaa, että 24 tunnin videoarvo samankaltaisilla asetuksilla tulee kooltaan 1,8 Gt - 7,5 Gt. Voimme varmistaa, että se ei todellakaan ole suurempi kuin asettamalla bittinopeudeksi jotain 750000, joka tiedämme antavan kooderille tarpeeksi tilaa toistaa liikettä haluamallamme laadulla (20), tai voit kokeilla huonompia ominaisuuksia (esim. 25 ) nähdäksesi, olisiko ne hyväksyttäviä, ja laske sitten bittinopeuden rajaa vastaavasti. Tästä huolimatta on syytä pitää mielessä, että todennäköisesti rikkoo 2 Gt tiedostolla, joten kuten yllä mainittiin, törmäät todennäköisesti 64-bittiseen tiedostosoitinongelmaan, ellet käytä Pythonia tai käännä uudelleen käyttäjämaata.

Tässä on yllä oleva Python-komentosarja, jota on muunnettu sisällyttämään juuri käsitellyt rajat:

  Tuo picamerawith picamera.PiCamera () kamerana : camera.resolution = (640, 360) camera.framerate = 24 camera.start_recording ('one_day.h264', laatu = 20, bitrate = 750000) camera.wait_recording (24 * 60 * 60) camera.stop_recording ()  

Lopuksi vastauksena kultamelojen kommenttiin Linuksen vastauksesta: videotiedoston jakaminen useaan osaan on melko helppoa (ja se helpottaisi helposti kaikkia 64-bittisiä tiedostosoitinongelmia). Raspividin avulla voit määrittää parametrin --segment avulla, että uusi tiedosto tulisi avata joka n millisekunnin välein, esim. tallentaa yksi tiedosto joka tunti (tiedostonimessä % 02d korvataan numero, esim. 01, 02, 03, ...):

  raspivid - leveys 640 - korkeus 360 - kehystys 24 - bittinopeus 750000 --qp 20 --timeout $ ((24 * 60 * 60 * 1000)) - segmentti $ ((1 * 60 * 60 * 1000) ) --output hour% 02d.h264  

Vaihtoehtoisesti picamera-kameralla voit käyttää record_sequence -menetelmää jakaaksesi ajan perusteella:

  Tuo picamera
PiCamera () kamerana: camera.resolution = (640, 360) camera.framerate = 24 tiedostonimelle camera.record_sequence (['tunti% 02d.h264'% (h + 1) h alueella (24) )], laatu = 20, bittinopeus = 750000): camera.wait_recording (60 * 60)  

Tai tiedostokoon perusteella. Alla olevassa esimerkissä olen asettanut sen tuottamaan 100 tiedostoa, jotka kaatuvat, kun jokainen saavuttaa> 1 Mt, ja asettanut lähtö iteraattorin omaan toimintoonsa vain osoittaakseen, että on mahdollista käyttää loputtomia iteraattoreita myös record_sequence -koodilla :

  import ioimport itertoolsimport picameradef outputs (): for i in itertools.count (1): tuottaa io.open ('tiedosto% 02d.h264 '% i,' wb ') picameralla. PiCamera () kamerana: camera.resolution = (640, 360) camera.framerate = 24 kameran ulostulolle. record_sequence (lähdöt (), laatu = 20, bittinopeus = 750000) : while output.tell () < 1048576: camera.wait_recording (0.1) if output.name == 'file99.h264': break  

Tai ... no, mikä tahansa raja mitä voit ajattele koodia!

+1 Olen muokannut muuten näyttävää vastaustasi sisältämään syntaksikorostuksen.
Ah, kiitos - minun pitäisi luultavasti oppia hieman enemmän SO: n MD-variantista jossain vaiheessa ...
Linus
2015-01-11 21:01:10 UTC
view on stackexchange narkive permalink

Jos tallennukseen käytetään raspividia, se on "mahdollista", suurten tiedostojen tueksi on ollut korjaustiedosto, jonka koko> 2 Gt ( -D_FILE_OFFSET_BITS = 64 vaaditaan lippuihin, jotka toimitetaan gcc). Sinun täytyy kuitenkin kääntää userland -lähde itse.

On kuitenkin huomattava, että sinun on oltava hyvin varovainen, koska jos täytät järjestelmän osion Linuxissa, on erittäin huono käyttäytymistä. Joten sinun pitäisi luoda erillinen osio pitkille videoillesi.

Voi olla myös hyvä idea pienentää bittinopeutta, jos sinulla on ongelmia tiedostokoon kanssa.

Jos se on hyväksyttävää, voit myös suorittaa ajoitetun komentosarjan (esim. `Cron`: n kautta) pysäyttääksesi nykyisen` raspivid`-prosessin, siirtämällä ulostulotiedoston ja käynnistämällä sen uudelleen siten, että päädyt sarjaan pienempiä tiedostoja, jotka edustavat tiettyjä viipaletta aikaa.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...