我最近拿到了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)
答案 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吗?