使用 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)
.
我正在尝试使用 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)
.