2015-12-15 90 views
0

我最近得到了Raspberry Pi的攝像頭模塊。通過他們找到的循環緩衝區示例工作here (code shown below.)Raspberry Pi攝像頭捕獲循環緩衝區並跟隨(x)秒數

我的目標是保存內建在「stream = picamera.PiCameraCircularIO(camera,seconds = 20)」中的20秒緩衝區,但也要繼續記錄30秒。我在他們的例子中添加的主要內容是在引腳17上的GPIO輸入之後的「time.sleep(30)」。當我運行它時,它有時產生一個文件,但該文件從不可播放。我很感謝您提供的任何建議或建議。

代碼:

import io 
import time 
import picamera 
import RPi.GPIO as GPIO 

GPIO.setmode(GPIO.BCM) 
GPIO.setup(17, GPIO.IN, GPIO.PUD_UP) 

with picamera.PiCamera() as camera: 
    stream = picamera.PiCameraCircularIO(camera, seconds=20) 
    camera.start_recording(stream, format='h264') 
    GPIO.wait_for_edge(17, GPIO.FALLING) 
    time.sleep(30) 
    camera.stop_recording() 
    for frame in stream.frames: 
     if frame.header: 
      stream.seek(frame.position) 
      break 
    with io.open('/home/pi/Desktop/video.h264', 'wb') as output: 
     while True: 
      data = stream.read1() 
      if not data: 
       break 
      output.write(data) 

回答

0

我認爲,更好的辦法是更換:

time.sleep(30) 

通過

camera.wait_recording(30) 
0

你正常啓動的循環緩衝區將舉行20秒的視頻。 視頻的最後20秒。然而,等待30秒卻是徒勞的,因爲它只能持續20秒的視頻。

如果您在高級配方中閱讀了picamera文檔(picamera.readthedocs.org),它們將向您展示如何使用split_recording保存循環緩衝區的內容,然後您可以在第二個IO(文件或流)記錄了當前正在發生的事情。

NOW you camera.wait_recording(30)然後split_recording回到另一個IO(在高級配方中它是原始的,截斷的,CircularIO)。

在這最後你將有兩個文件。一個包含緩衝液,即20秒之前,另一個包含30秒之後。然後你將這兩個連在一起,瞧,你現在有一個50秒的視頻。 Mp4Box做得很好。

現在我一直在努力使用io.open來動態連接這兩個流,但是我懷疑當你io.open('blah.h264')時會有一些頭部細節/ ,'ab')這意味着你只能得到最後附加的視頻。我不認爲有人讀這是一個h264編碼boffin?