เนื่องจากฉันมีการ์ด SD ที่มีความจุเพียงพอจึงเป็นไปได้หรือไม่ที่จะบันทึกวิดีโอ 24 ชั่วโมงด้วยโมดูลกล้องหรือระยะเวลาในการบันทึก จำกัด หรือไม่ มีใครลองบ้างไหม
คุณคิดว่า 64GB เพียงพอกับคุณภาพการบันทึก 360p หรือไม่
เนื่องจากฉันมีการ์ด SD ที่มีความจุเพียงพอจึงเป็นไปได้หรือไม่ที่จะบันทึกวิดีโอ 24 ชั่วโมงด้วยโมดูลกล้องหรือระยะเวลาในการบันทึก จำกัด หรือไม่ มีใครลองบ้างไหม
คุณคิดว่า 64GB เพียงพอกับคุณภาพการบันทึก 360p หรือไม่
คำตอบ:
ฉันต้องยอมรับว่าฉันไม่ได้ตระหนักถึงข้อ จำกัด 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
หรือ ... ก็ไม่ว่าคุณจะคิดรหัสอะไรก็ตาม
หากคุณใช้ raspivid เพื่อบันทึกว่า "เป็นไปได้" แสดงว่ามีการแก้ไขเพื่อรองรับไฟล์ขนาดใหญ่ที่มีขนาด> 2 GB ( -D_FILE_OFFSET_BITS=64
จำเป็นต้องมีในแฟล็กที่จัดหาให้กับ gcc) อย่างไรก็ตามคุณต้องรวบรวมแหล่งuserlandด้วยตัวเอง
จะต้องมีการบันทึกไว้อย่างไรก็ตามคุณควรระวังให้ดีเพราะถ้าคุณเติมพาร์ติชั่นระบบบน Linux, พฤติกรรมที่ไม่ดีอาจเกิดขึ้นได้ ดังนั้นคุณควรสร้างพาร์ติชันแยกต่างหากสำหรับวิดีโอขนาดยาวของคุณ
มันอาจเป็นความคิดที่ดีที่จะลดอัตราบิตถ้าคุณมีปัญหากับขนาดไฟล์
cron
) เพื่อหยุดraspivid
กระบวนการปัจจุบันโรลโอเวอร์ไฟล์เอาท์พุทและเริ่มต้นอีกครั้งเช่นคุณจบลงด้วยชุดของไฟล์ขนาดเล็กที่แสดงเวลาที่แน่นอน