Raspberry Pi'ye kamera modülü ile 24 saatlik bir video kaydedebilir miyim?


12

Yeterli kapasiteye sahip bir SD kartım olduğu düşünüldüğünde, teorik olarak bir kamera modülü ile 24 saatlik bir video kaydetmek mümkün mü yoksa kayıt süresi sınırlı mı? Bunu deneyen var mı?

Sizce 360p kayıt kalitesinde 64GB yeterli mi?

Yanıtlar:


20

Raspivid'in stok yapısındaki 2Gb sınırlamasının farkında olmadığımı itiraf etmeliyim (Linus'un cevabında belirtilmiştir). Bir alternatif (kullanıcı alanını yeniden derlemekten hoşlanmıyorsanız) picamera (Python kutudan 64 bit dosya işaretleyicilerini destekler) kullanmak olacaktır. Örneğin, aşağıdakiler 24 saat boyunca H.264'te geniş ekran 360p videoyu mutlu bir şekilde kaydetmelidir:

import picamera

with 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()

Sorunun bir sonraki bölümü, bunun 64Gb SD karta sığıp uymayacağı. Benim önsezim "muhtemelen", ama şunu doğrulayalım ...

Pi'nin H.264 kodlayıcısına, bitratepicamera'nın start_recording yöntemindeki --bitrateparametre veya raspivid parametresi ile bir bit hızı sınırı verilebilir. Hem raspivid hem de picamera'da bu varsayılan olarak 17Mbps (saniyede megabit) olur, bu nedenle teorik olarak varsayılan ayarla kaydedilen 24 saatlik bir video aşağıdakilerden daha büyük olamaz:

  24         hours
* 60         minutes per hour
* 60         seconds per minute
* 17000000   bits per second
/ 8          bits per byte
/ 1073741824 bytes per gig
  ----------
  170.990825 Gb

Hmm ... beklediğimden daha büyük, ama tamam. Akılda tutulması gereken bir şey, 17Mbps varsayılan değerinin, raspivid durumunda tam 1080p olan varsayılan kayıt çözünürlüğünde yararlı olması anlamına gelir (picamera varsayılan olarak ekran çözünürlüğüne veya herhangi bir ekran olmaması durumunda 720p Ben yazarken "dostça" görünüyordu). Sadece 360p'de kayıt yapıyorsanız, muhtemelen çok daha düşük bir bit hızı sınırıyla kurtulabilirsiniz.

Akılda tutulması gereken diğer bir şey, bit hızı sınırının sadece bir üst sınır olmasıdır. Kodlayıcı, bir saniyelik hareket değerinin yeterince iyi bir temsilini üretmek için 17 milyon bitin hepsine ihtiyaç duymazsa, bu kadarını kullanmaz. Kodlayıcının nicelleştirmesiyle qualityuğraşarak (picamera'daki parametre ve--qpparametresini raspivid olarak da ekleyebiliriz) ayrıca kodlayıcının "yeterince iyi" ne anlama geldiğini de ayarlayabiliriz. Kalite 0 ile 40 arasında bir değerle temsil edilir. Düşük değerler daha iyi kalite anlamına gelir, bu nedenle 1 inanılmaz derecede iyidir ve 40 gülünç derecede kötüdür. Tipik "yeterince iyi" değerler 20-25 civarındadır. 0 değeri (aynı zamanda varsayılan değerdir) özel gibi görünür; Kodlayıcı için tam olarak ne anlama geldiğinden emin değilim (firmware devs'e sormanız gerekir), ancak 15-20 civarında değerlere benzer kalite üretiyor gibi görünüyor (yani çok iyi).

Ortalama kaliteyi varsayalım (diyelim ki 20), geniş ekran 360p video kaydetmek için ne tür bir bit hızına ihtiyacımız var? Aşağıdaki raspivid komut satırını 30 saniye değerinde video kaydetmek için iki kez çalıştırdım, ardından ilk kaydı kamerayı sallayarak geçirdim (daha fazla hareketin daha fazla bant genişliği anlamına geldiği ve burada sınırları test etmek istediğimiz varsayımı altında) ve ikincisi sahne kesinlikle statik olduğunda:

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

Ortaya çıkan dosyalar sırasıyla 673675 bayt (658Kb) ve 2804555 bayt (2,7Mb) boyutundaydı, bu nedenle kodlayıcı tarafından üretilen bit hızları şunlardı:

  673675   bytes
* 8        bits per byte
/ 30       seconds
  --------
  179646.6 bits per second (static scene)

  2804555  bytes
* 8        bits per byte
/ 30       seconds
  --------
  747881.3 bits per second (full motion scene)

Bu nedenle, bu değerleri yukarıdaki denkleme takarak, benzer ayarları kullanarak 24 saat değerinde videonun 1.8Gb ile 7.5Gb arasında bir yerde olmasını gerçekçi bir şekilde bekleyebiliriz. Bit hızını 750000 gibi bir şeye ayarlayarak kodlayıcıya hareketimizi istenilen kalitede (20) üretecek kadar yer vereceğini bildiğimizden daha büyük olmayacağından emin olabiliriz veya daha düşük niteliklerle deney yapabilirsiniz (örn. ) kabul edilebilir olup olmadıklarını görmek ve daha sonra bit hızı sınırını buna göre düşürmek. Bununla birlikte, yukarıda belirtildiği gibi Python kullanmıyorsanız veya kullanıcı alanını yeniden derlemediğiniz sürece 64 bit dosya işaretçisi sorunuyla karşılaşacağınız anlamına gelir.

Referans olarak, burada yukarıda tartışılan limitleri içerecek şekilde değiştirilmiş Python betiği:

import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (640, 360)
    camera.framerate = 24
    camera.start_recording('one_day.h264', quality=20, bitrate=750000)
    camera.wait_recording(24 * 60 * 60)
    camera.stop_recording()

Son olarak, goldilocks'ın Linus'un cevabı hakkındaki yorumuna cevap vermek için: video dosyasını birden fazla parçaya bölmek oldukça kolaydır (ve 64 bit dosya işaretçisi endişelerini kolayca hafifletir). Raspivid ile --segmentparametreyi, her n milisaniyede bir yeni bir dosyanın açılması gerektiğini belirtmek için kullanabilirsiniz , örn. Her saat için bir dosya kaydetmek için (dosya adındaki %02dbir sayı, örneğin 01, 02, 03, vb. .):

raspivid --width 640 --height 360 --framerate 24 --bitrate 750000 --qp 20 --timeout $((24*60*60*1000)) --segment $((1*60*60*1000)) --output hour%02d.h264

Alternatif olarak, picamera ile zamana göre bölmek için record_sequence yöntemini kullanabilirsiniz:

import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (640, 360)
    camera.framerate = 24
    for filename in camera.record_sequence([
            'hour%02d.h264' % (h + 1)
            for h in range(24)
            ], quality=20, bitrate=750000):
        camera.wait_recording(60 * 60)

Veya dosya boyutuna göre. Aşağıdaki örnekte, her biri> 1Mb'ye ulaştığında 100 dosya üretmek üzere ayarladım ve çıkış yineleyiciyi sadece sonsuz yineleyicilerin record_sequencede kullanılabileceğini göstermek için kendi işlevine yerleştirdim :

import io
import itertools
import picamera

def outputs():
    for i in itertools.count(1):
        yield io.open('file%02d.h264' % i, 'wb')

with picamera.PiCamera() as camera:
    camera.resolution = (640, 360)
    camera.framerate = 24
    for output in camera.record_sequence(
            outputs(), quality=20, bitrate=750000):
        while output.tell() < 1048576:
            camera.wait_recording(0.1)
        if output.name == 'file99.h264':
            break

Ya da ... şey, ne olursa olsun kodu düşünebilirsiniz!


+1 Başka türlü muhteşem cevabınızı sözdizimi vurgulamayı içerecek şekilde düzenledim.
Jacobm001

Ah, teşekkürler - Muhtemelen bir noktada SO'nun MD varyantından biraz daha fazla öğrenmeliyim ...
Dave Jones

3

Kayıt için raspivid kullanıyorsanız, "mümkün" ise,> 2 GB boyutunda ( -D_FILE_OFFSET_BITS=64gcc'ye sağlanan bayraklarda gereklidir) büyük dosyaları desteklemek için bir yama vardır . Ancak kullanıcı alanı kaynağını kendiniz derlemeniz gerekir .

Bununla birlikte, çok dikkatli olmalısınız, çünkü Linux'ta sistem bölümünü doldurursanız çok kötü davranışlar ortaya çıkabilir. Bu yüzden uzun videolarınız için ayrı bir bölüm oluşturmalısınız.

Dosya boyutuyla ilgili sorun yaşarsanız bit hızını azaltmak da iyi bir fikir olabilir.


4
Kabul edilebilir durumdaysa cron, geçerli raspividişlemi durdurmak , çıktı dosyasını üzerine getirmek ve yeniden başlatmak için aralıklı bir komut dosyası da (ör. Yoluyla ) çalıştırabilirsiniz; böylece belirli zaman dilimlerini temsil eden bir dizi küçük dosya elde edersiniz.
goldilocks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.