Raspberry Pi Camera捕获循环缓冲区并遵循(x)秒数

时间:2015-12-15 02:05:15

标签: python camera raspberry-pi

我最近拿到了Raspberry Pi的相机模块。通过循环缓冲区示例找到here (code shown below.)

我的目标是保存内置的20秒缓冲区" stream = picamera.PiCameraCircularIO(camera,seconds = 20)"而且还要继续记录30秒。我在他们的例子中添加的主要内容是" time.sleep(30)"跟随引脚17上的GPIO输入。当我运行它时,它有时会生成一个文件,但该文件永远不可播放。我很感激您提供的任何建议或建议。

代码:

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)

2 个答案:

答案 0 :(得分:0)

我认为更好的方法是替换:

time.sleep(30)

通过

camera.wait_recording(30)

答案 1 :(得分:0)

您正在正确启动循环缓冲区,该缓冲区将保留20秒的视频。 最后20秒的视频。然而,等待30秒是徒劳的,因为它只能持有20秒的视频。

如果您在高级食谱中阅读picamera docs(picamera.readthedocs.org),他们会向您展示如何使用split_recording保留循环缓冲区的内容,然后您可以在第二个IO(文件或流)时写入记录当前正在发生的事情。

现在你camera.wait_recording(30)然后split_recording回到另一个IO(在高级配方中它是原始的,截断的,CircularIO)。

在这结束时,您将有两个文件。一个包含缓冲液,即20秒前,另一个包含30秒后。然后你把这两个连在一起,瞧,你现在有50秒的视频。 Mp4Box做得很好。

现在我一直在努力使用io.open动态连接这两个流,但我怀疑当你io.open('等等)时,会有一些标题细节/信息搞砸了。 h264',' ab')这意味着您只能获得最后添加的视频。我不认为读这篇文章的人是h264编码的boffin吗?