カメラモジュールを搭載したRaspberry Piで24時間のビデオを録画できますか?


12

十分な容量のSDカードがある場合、理論的にはカメラモジュールで24時間のビデオを録画することは可能ですか、それとも録画時間は制限されていますか?誰もこれを試しましたか?

360pの録音品質で64GBで十分だと思いますか?

回答:


20

私は、raspividのストックビルドにおける2Gbの制限を認識していなかったことを認めなければなりません(Linusの回答に記載されています)。別の方法(ユーザーランドを再コンパイルしたくない場合)は、picameraを使用することです(Pythonは、そのまま 64ビットファイルポインターをサポートします)。たとえば、次の例では、ワイドスクリーン360pビデオをH.264で24時間快適に録画する必要があります。

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

問題の次の部分は、それが64Gb SDカードに収まるかどうかです。私の考えは「おそらく」ですが、それを確認しましょう...

PiのH.264エンコーダーにはbitrate、picameraのstart_recordingメソッドの--bitrateパラメーターまたはraspividのパラメーターを使用して、ビットレート制限を指定できます。raspividとpicameraの両方で、デフォルトは17Mbps(メガビット/秒)であるため、理論的には、デフォルト設定で記録された24時間のビデオは次の値を超えることはできません。

  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

うーん...それは私が予想していたよりも大きいですが、大丈夫です。覚えておくべきことの1つは、デフォルトの17Mbpsがデフォルトの記録解像度で有用であることを意味していることです。私がそれを書いたとき、「より親しみやすい」ように見えた)。360pでのみ録音している場合は、はるかに低いビットレート制限で逃げることができます。

留意すべきもう1つのことは、ビットレートの制限はそれだけであるということです。つまり、上限です。エンコーダが1秒間の動きを十分に表現するために1,700万ビットすべてを必要としない場合、その多くは使用しません。エンコーダーの量子化(qualitypicamera のパラメーターであり、--qpraspividのパラメーター)エンコーダーの「十分に良い」という意味の概念を調整することもできます。品質は0〜40の値で表されます。値が低いほど品質が高いことを意味するため、1は非常に良好であり、40はばかげて悪いです。一般的な「十分な」値は20〜25です。値0(これもデフォルトです)は特別なようです。エンコーダにとってそれが何を意味するのか正確にはわかりませんが(ファームウェア開発者にそのことを尋ねる必要があります)、15-20前後の値(つまり非常に良い)に似た品質を生成するようです。

それでは、平均品質(たとえば20)を想定して、ワイドスクリーン360pビデオを録画するにはどのようなビットレートが必要ですか?次のraspividコマンドラインを2回実行して30秒分のビデオを記録し、カメラを振って最初の記録に費やしました(より多くの動きはより多くの帯域幅が必要であり、ここで制限をテストすることを前提としています)。シーンが完全に静的な場合:

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

結果のファイルのサイズはそれぞれ673675バイト(658Kb)と2804555バイト(2.7Mb)であったため、エンコーダーによって生成されるビットレートは次のとおりでした。

  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)

したがって、これらの値を上記の式に代入すると、同様の設定を使用して、サイズが1.8Gb〜7.5Gbのどこかに来る24時間分のビデオが現実的に期待できます。ビットレートを750000のように設定して、エンコーダーに希望の品質(20)でモーションを再現するのに十分な余地を与えるか、低品質(たとえば25 )それらが受け入れられるかどうかを確認し、それに応じてビットレート制限を下げます。そうは言っても、ファイルで2Gbを壊す可能性が高いことを心に留めておく必要があるため、上記のように、Pythonを使用するかユーザーランドを再コンパイルしない限り、64ビットのファイルポインターの問題が発生する可能性があります。

参考までに、上記のPythonスクリプトを修正して、今説明した制限を含めます。

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

最後に、Linusの答えに対するgoldilocksのコメントに答えるだけです。ビデオファイルを複数の部分に分割するのは非常に簡単です(64ビットファイルポインターの懸念を簡単に軽減できます)。raspividを使用すると、--segmentパラメーターを使用して、新しいファイルをnミリ秒ごとに開くように指定できます。たとえば、1時間ごとに1つのファイルを記録します(%02dファイル名の数字は、01、02、03 、. 。):

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

あるいは、picameraでは、record_sequenceメソッドを使用して、時間に基づいて分割できます。

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)

または、ファイルサイズに基づきます。以下の例では、各ファイルが1Mbを超えるとロールオーバーする100個のファイルを生成するように設定し、無限反復子を使用できることを示すために、出力反復子を独自の関数に配置しrecord_sequenceました。

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

または...まあ、あなたがコードについて考えることができるどんな制限でも!


+1シンタックスハイライトを含めるために、そうでなければ壮観な答えを編集しました。
Jacobm001

ああ、ありがとう-私はおそらくいくつかの点で、もう少しSOのMD変異体の学ぶべき...
デイブ・ジョーンズ

3

raspividを使用して「可能」であると記録する場合、サイズが2 GBを超える大きなファイルをサポートするパッチがあります(-D_FILE_OFFSET_BITS=64gccに提供されるフラグで必要です)。ただし、ユーザーランドのソースを自分でコンパイルする必要があります。

ただし、Linuxでシステムパーティションをいっぱいにすると、非常に悪い動作が発生する可能性があるため、注意が必要です。そのため、長いビデオ用に別のパーティションを作成する必要があります。

また、ファイルサイズに問題がある場合は、ビットレートを下げることをお勧めします。


4
許容できる場合は、断続的なスクリプト(経由などcron)を実行して現在のraspividプロセスを停止し、出力ファイルをロールオーバーしてから再起動して、特定の時間を表す一連の小さなファイルを作成することもできます。
goldilocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.