使用 Python 存储 10 秒的未编码视频缓冲区

Store 10 seconds of unencoded video buffer using Python

我正在尝试使用 Python 脚本保存 10 秒的缓冲视频,特别是“.rgb”格式。

为了做到这一点,我一直在使用连接到 Raspberry Pi 的 PiCamera。

根据下面的脚本,如果我选择使用 h264 格式保存视频,我将能够成功实现预期目标,但是如果将格式从 h264 更改为 .rgb(目标格式),则没有输出生成。

有什么想法可能是这里的问题吗?

谢谢

代码快照:

import time
import io
import os 
import picamera
import datetime as dt
from PIL import Image
import cv2 

#obtain current time
def return_currentTime():
    return dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

#trigger event declaration
def motion_detected():
    while True:
        print ("Trigger event(y)?")
        trigger = input ()
        if trigger =="y":
            time = return_currentTime()
            print ("Buffering...")
            camera.wait_recording(5)     
            stream.copy_to(str(time)+'.rgb')            
           
        else: 
           camera.stop_recording()
           
           break
        
#countdown timer 
def countdown (t):
    while t:
        mins, secs = divmod (t,60)
        timer = '{:02d}:{:02d}'.format(mins, secs)
        print(timer, end="\r")
        time.sleep(1)
        t-=1
    print('Buffer available!')
   

camera = picamera.PiCamera()

camera.resolution = (640, 480)

stream = picamera.PiCameraCircularIO(camera, seconds = 5)

#code will work using h264 as format
camera.start_recording (stream, format = 'rgb')
countdown(5)
motion_detected()

这个问题与您的流格式以及 stream.copy_to() 的工作原理有关。

根据函数copy_to(output, size=None, seconds=None, first_frame=2)docs,first_frame是对要复制的第一帧的限制。默认情况下设置为 sps_header,这通常是 H264 流的第一帧。

由于您的流格式是 RGB 而不是 H264,因此 没有 sps_header,因此 copy_to 找不到 sps_header 并且不复制任何内容。

要解决这个问题,您必须允许任何帧成为第一帧,而不仅仅是 sps_header。这可以通过在您的通话中设置 first_frame=None 来完成,例如 copy_to(file, first_frame=None).