python 摄像头录制帧率_基于opencv和python的可变帧速率IP摄像机视频记录
首先,我想對我正在做的事情發(fā)表評論。在
我有一個IP攝像機通過一個帶以太網(wǎng)線的路由器連接到我的網(wǎng)絡(luò)(FOSCAM 9800p),我試圖用RTSP協(xié)議錄制一段視頻。我未來的打算是用opencv在中間添加一個小的視頻處理,但目前我想做一些測試來簡單地記錄下來。在
主要的問題是相機每秒傳送的幀數(shù)是可變的,也就是說,有時它傳送到18幀,其他的傳送到22幀,依此類推。當(dāng)以每秒幀數(shù)的固定速率錄制視頻時,最終發(fā)生的情況是,視頻播放的速度超過了應(yīng)有的速度
奇怪的是,當(dāng)我用opencv get(CAP_PROP_FPS)運行時,它返回了一個很大的值,比如180000.0
為了解決這個問題,我們要做的是讀取幀并將它們放入隊列中。從另一個由定時器事件()為了獲得固定的幀速率,我們閱讀它們并嘗試以固定的時間間隔寫入視頻。在
代碼如下:video_capture = cv2.VideoCapture("rtsp://"+user+":"+password+"@"+ip+":"+str(port)+"/videoMain")
if (video_capture.isOpened() == False):
print("Unable to read camera feed")
sys.exit()
frame_width = int(video_capture.get(3))
frame_height = int(video_capture.get(4))
video_writer =cv2.VideoWriter(output_filename,cv2.VideoWriter_fourcc(*'MP4V'), fps_to_save, (frame_width,frame_height))
input_buffer = queue.Queue(20)
finished = False
read_frames = 0
def readFile():
global finished
global read_frames
while not finished:
ret, frame = video_capture.read()
if not ret:
finished = True
while not finished:
try:
input_buffer.put_nowait(frame)
read_frames+=1
break
except queue.Full:
print("queue.Full")
pass
def processingFile():
global finished
written_frames = 0
repeated_frames = 0
time_per_frame_elapsed = 0.0
start_time=time.time()
ticker = threading.Event()
while True:
ticker.wait(time_per_frame-time_per_frame_elapsed)
time_per_frame_start=time.time()
try:
frame = input_buffer.get_nowait()
video_writer.write(frame)
writing_time = time.time()
if written_frames is 0:
start_time = writing_time
written_frames += 1
except queue.Empty:
if written_frames is not 0:
video_writer.write(frame)
writing_time = time.time()
written_frames += 1
repeated_frames += 1
except:
pass
total_elapsed_time = time.time() - start_time
print("total_elapsed_time:{:f}".format(total_elapsed_time))
if total_elapsed_time>time_to_save_seconds:
finished = True
ticker.clear()
print ("Playback terminated.")
break
time_per_frame_elapsed=time.time()-time_per_frame_start
print("Total readed frames:{:f}".format(read_frames))
print("Total frames repated:{:f}".format(repeated_frames))
print("Total frames writed:{:f}".format(written_frames))
tReadFile = threading.Thread(target=readFile)
tProcessingFile = threading.Thread(target=processingFile)
tReadFile.start()
tProcessingFile.start()
tProcessingFile.join()
tReadFile.join()
結(jié)果是接近我們想要的,但有時我們在時間上有顯著的差異。我們用大約10秒的短視頻進行測試,得到9.8秒的錄制時間。在
一開始這似乎不是一個嚴重的問題,但錯誤是累積的,也就是說,如果我們增加時間的增加,以便錄制更長時間的視頻,我們會有更嚴重的問題。在
我們想知道如何解決這種類型的視頻錄制問題的相機傳送幀可變率。這樣做是個好主意嗎?在
什么會產(chǎn)生《泰晤士報》的累積誤差?在
從已經(jīng)非常感謝你!在
大家好!在
總結(jié)
以上是生活随笔為你收集整理的python 摄像头录制帧率_基于opencv和python的可变帧速率IP摄像机视频记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 退市富控什么意思
- 下一篇: python 标准差内数据概率怎么求_P