ฉันสามารถบันทึกวิดีโอ 24 ชั่วโมงใน Raspberry Pi พร้อมโมดูลกล้องได้หรือไม่?


12

เนื่องจากฉันมีการ์ด SD ที่มีความจุเพียงพอจึงเป็นไปได้หรือไม่ที่จะบันทึกวิดีโอ 24 ชั่วโมงด้วยโมดูลกล้องหรือระยะเวลาในการบันทึก จำกัด หรือไม่ มีใครลองบ้างไหม

คุณคิดว่า 64GB เพียงพอกับคุณภาพการบันทึก 360p หรือไม่

คำตอบ:


20

ฉันต้องยอมรับว่าฉันไม่ได้ตระหนักถึงข้อ จำกัด 2Gb ในการสร้างหุ้นของ raspivid (กล่าวถึงในคำตอบของ 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()

ส่วนต่อไปของคำถามคือจะเหมาะกับการ์ด SD 64Gb หรือไม่ ลางสังหรณ์ของฉันคือ "อาจ" แต่ให้ตรวจสอบว่า ...

ตัวเข้ารหัส H.264 ของ Pi สามารถกำหนดขีด จำกัด บิตเรตกับbitrateพารามิเตอร์ในเมธอด start_recording ของpicameraหรือ--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 นั้นมีประโยชน์ในการบันทึกความละเอียดเริ่มต้นซึ่งเต็ม 1080p ในกรณีของ raspivid (แม้ว่า picamera จะใช้ค่าเริ่มต้นเป็นความละเอียดการแสดงผลหรือ 720p ในกรณีที่ไม่มีการแสดงผล ดูเหมือนว่า "มิตรกว่า" เมื่อฉันเขียนมัน) หากคุณบันทึกที่ 360p คุณสามารถหนีออกมาได้ด้วยขีด จำกัด บิตเรตที่ต่ำกว่ามาก

สิ่งอื่นที่ควรคำนึงถึงก็คือขีด จำกัด บิตเรตนั้นก็คือขีด จำกัด บน หากตัวเข้ารหัสไม่ต้องการ 17 ล้านบิตทั้งหมดในการสร้างภาพเคลื่อนไหวที่ดีพอสำหรับการเคลื่อนที่หนึ่งวินาที โดยการเล่นซอกับการหาปริมาณของเครื่องเข้ารหัส (ซึ่งเป็นqualityพารามิเตอร์ใน picamera และ--qpพารามิเตอร์ใน raspivid) เรายังสามารถปรับความคิดของตัวเข้ารหัสว่า "ดีพอ" หมายถึงอะไร คุณภาพจะถูกแทนด้วยค่าระหว่าง 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)

ดังนั้นการเสียบค่าเหล่านั้นเข้ากับสมการข้างต้นเราสามารถคาดหวังวิดีโอ 24 ชั่วโมงที่มีค่าจริงโดยใช้การตั้งค่าที่คล้ายกันเพื่อมาในบางที่ระหว่าง 1.8Gb และ 7.5Gb ในขนาด เราสามารถตรวจสอบให้แน่ใจว่ามันจะไม่ใหญ่ไปกว่านี้อย่างแน่นอนโดยการตั้งค่าบิตเรตเป็นบางอย่างเช่น 750000 ซึ่งเรารู้ว่าจะให้พื้นที่ตัวเข้ารหัสเพียงพอที่จะสร้างการเคลื่อนไหวตามคุณภาพที่เราต้องการ (20) หรือคุณสามารถทดลอง ) เพื่อดูว่าพวกเขาจะยอมรับได้หรือไม่จากนั้นลดขีด จำกัด บิตเรตตามลำดับ ดังที่กล่าวไว้เป็นสิ่งสำคัญที่ควรคำนึงว่าคุณมีแนวโน้มที่จะแบ่งไฟล์ 2Gb ออกไปดังนั้นดังที่ได้กล่าวมาแล้วข้างต้นคุณอาจพบปัญหาตัวชี้ไฟล์ 64- บิตเว้นแต่ว่าคุณใช้ Python หรือผู้ใช้คอมไพล์ซ้ำ

สำหรับการอ้างอิงต่อไปนี้เป็นสคริปต์ 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()

ท้ายที่สุดเพียงตอบสนองความคิดเห็นของโกลด์อีลส์ต่อคำตอบของไลนัส: การแบ่งไฟล์วิดีโอออกเป็นหลายส่วนนั้นค่อนข้างง่าย ด้วย 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)

หรือตามขนาดไฟล์ ในตัวอย่างด้านล่างฉันได้ตั้งค่าให้สร้าง 100 ไฟล์ที่กลิ้งไปมาเมื่อถึงแต่ละครั้ง> 1Mb และวางเอาท์พุท iterator ในฟังก์ชั่นของตัวเองเพื่อแสดงให้เห็นว่าเป็นไปได้ที่จะใช้ตัววนซ้ำไม่สิ้นสุดด้วย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

อ่าขอบคุณ - ฉันน่าจะได้เรียนรู้เพิ่มเติมเกี่ยวกับตัวแปร MD ของ SO ในบางจุด ...
เดฟโจนส์

3

หากคุณใช้ raspivid เพื่อบันทึกว่า "เป็นไปได้" แสดงว่ามีการแก้ไขเพื่อรองรับไฟล์ขนาดใหญ่ที่มีขนาด> 2 GB ( -D_FILE_OFFSET_BITS=64จำเป็นต้องมีในแฟล็กที่จัดหาให้กับ gcc) อย่างไรก็ตามคุณต้องรวบรวมแหล่งuserlandด้วยตัวเอง

จะต้องมีการบันทึกไว้อย่างไรก็ตามคุณควรระวังให้ดีเพราะถ้าคุณเติมพาร์ติชั่นระบบบน Linux, พฤติกรรมที่ไม่ดีอาจเกิดขึ้นได้ ดังนั้นคุณควรสร้างพาร์ติชันแยกต่างหากสำหรับวิดีโอขนาดยาวของคุณ

มันอาจเป็นความคิดที่ดีที่จะลดอัตราบิตถ้าคุณมีปัญหากับขนาดไฟล์


4
หากเป็นที่ยอมรับคุณสามารถเรียกใช้สคริปต์เป็นระยะ ๆ (เช่นผ่านcron) เพื่อหยุดraspividกระบวนการปัจจุบันโรลโอเวอร์ไฟล์เอาท์พุทและเริ่มต้นอีกครั้งเช่นคุณจบลงด้วยชุดของไฟล์ขนาดเล็กที่แสดงเวลาที่แน่นอน
goldilocks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.