카메라 모듈이있는 Raspberry Pi에서 24 시간 비디오를 녹화 할 수 있습니까?


12

용량이 충분한 SD 카드가 있다고 가정하면 이론적으로 카메라 모듈로 24 시간 비디오를 녹화 할 수 있습니까? 아니면 녹화 시간이 제한됩니까? 누구든지 이것을 시도 했습니까?

360p 녹화 품질에서 64GB로 충분하다고 생각하십니까?

답변:


20

나는 raspivid의 스톡 빌드에서 Linus의 답변에 언급 된 2Gb 제한을 알지 못했다는 것을 인정해야한다. 대안은 (사용자 영역을 재 컴파일하지 않는 경우) picamera 을 사용하는 것입니다 (Python은 기본적으로 64 비트 파일 포인터를 지원합니다). 예를 들어, 다음은 24 시간 동안 H.264로 와이드 스크린 360p 비디오를 즐겁게 녹화해야합니다.

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 인코더는 bitratepicamera의 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

흠 ... 그것은 내가 예상했던 것보다 크지 만 괜찮습니다. 염두에 두어야 할 것은 기본 17Mbps는 기본 녹화 해상도에서 유용하다는 것입니다. 기본 녹화 해상도는 raspivid의 경우 최대 1080p입니다. 내가 쓸 때 "친절한"것처럼 보였다). 360p로만 녹화하는 경우 훨씬 낮은 비트 전송률 제한으로 벗어날 수 있습니다.

명심해야 할 또 다른 사항은 비트 전송률 제한이 바로 그 상한이라는 것입니다. 1 초에 해당하는 모션을 충분히 표현하기 위해 엔코더에 1,700 만 비트가 모두 필요하지 않은 경우에는 그 수를 많이 사용하지 않습니다. 인코더의 양자화 ( qualitypicamera 의 매개 변수 인--qp"충분히 좋은"의 의미에 대한 인코더의 아이디어를 조정할 수도 있습니다. 품질은 0과 40 사이의 값으로 표시됩니다. 값이 낮을수록 품질이 좋아 지므로 1은 미쳤고 40은 엄청나게 나쁩니다. 일반적인 "충분히 좋은"값은 약 20-25입니다. 값 0 (기본값이기도 함)은 특수한 것으로 보입니다. 인코더에 어떤 의미가 있는지 확실하지 않지만 (펌웨어 개발자에게 요청해야 함) 15-20 정도의 값과 비슷한 품질을 생성하는 것 같습니다 (예 : 아주 좋습니다).

그렇다면 평균 품질 (20이라고 가정)을 가정 할 때 어떤 종류의 비트 전송률이 와이드 스크린 360p 비디오를 녹화해야합니까? 다음 raspivid 명령 줄을 두 번 실행하여 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 밀리 초 마다 새 파일을 열도록 지정할 수 있습니다 ( 예 : 매시간마다 하나의 파일을 기록) ( %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를 사용하여 기록 할 수있는 경우 "가능한"경우, 2GB보다 큰 파일을 지원하는 패치가 있습니다 ( -D_FILE_OFFSET_BITS=64gcc에 제공된 플래그에 필요함). 그러나 당신은 컴파일 할 필요가 유저 랜드의 직접 소스를.

그러나 Linux에서 시스템 파티션을 채우면 매우 나쁜 동작이 발생할 수 있으므로 매우주의해야합니다. 따라서 긴 비디오를위한 별도의 파티션을 만들어야합니다.

파일 크기에 문제가있는 경우 비트 전송률을 낮추는 것이 좋습니다.


4
허용되는 경우 간헐적 인 스크립트 (예 : via cron)를 실행 하여 현재 raspivid프로세스 를 중지 하고 출력 파일을 롤오버 한 후 다시 시작하여 특정 시간 조각을 나타내는 일련의 작은 파일로 끝날 수 있습니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.