답변:
나는 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 인코더는 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
흠 ... 그것은 내가 예상했던 것보다 크지 만 괜찮습니다. 염두에 두어야 할 것은 기본 17Mbps는 기본 녹화 해상도에서 유용하다는 것입니다. 기본 녹화 해상도는 raspivid의 경우 최대 1080p입니다. 내가 쓸 때 "친절한"것처럼 보였다). 360p로만 녹화하는 경우 훨씬 낮은 비트 전송률 제한으로 벗어날 수 있습니다.
명심해야 할 또 다른 사항은 비트 전송률 제한이 바로 그 상한이라는 것입니다. 1 초에 해당하는 모션을 충분히 표현하기 위해 엔코더에 1,700 만 비트가 모두 필요하지 않은 경우에는 그 수를 많이 사용하지 않습니다. 인코더의 양자화 ( quality
picamera 의 매개 변수 인--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
또는 ... 글쎄, 당신이 코드를 생각할 수있는 한계가 무엇이든!
raspivid를 사용하여 기록 할 수있는 경우 "가능한"경우, 2GB보다 큰 파일을 지원하는 패치가 있습니다 ( -D_FILE_OFFSET_BITS=64
gcc에 제공된 플래그에 필요함). 그러나 당신은 컴파일 할 필요가 유저 랜드의 직접 소스를.
그러나 Linux에서 시스템 파티션을 채우면 매우 나쁜 동작이 발생할 수 있으므로 매우주의해야합니다. 따라서 긴 비디오를위한 별도의 파티션을 만들어야합니다.
파일 크기에 문제가있는 경우 비트 전송률을 낮추는 것이 좋습니다.
cron
)를 실행 하여 현재 raspivid
프로세스 를 중지 하고 출력 파일을 롤오버 한 후 다시 시작하여 특정 시간 조각을 나타내는 일련의 작은 파일로 끝날 수 있습니다.