pygame+opencv實(shí)現(xiàn)讀取視頻幀的方法示例
由于pygame.movie.Movie.play() 只支持MPEG格式的視頻,且 pygame版本大于1.9.5好像已經(jīng)不支持這個(gè)模塊了,所以決定使用與opencv讀取視頻幀的畫面,利用pygame的surface刷新窗口。
有基礎(chǔ)的小伙伴,代碼還是很好理解,直接上代碼
pygame.time.Clock()同步時(shí)間
import pygame
from pygame.locals import *
import cv2
import sys
import time
FPS = 30
FramePerSec = pygame.time.Clock()
video_path = './Selected Stimuli/noaudio_c_001_critical_swerve.mp4'
video = cv2.VideoCapture(video_path)
pygame.init()
pygame.display.set_caption('OpenCV Video Player on Pygame')
screen = pygame.display.set_mode((1280, 720), 0, 32)
screen.fill([0,0,0])
num = 0
while True :
T1 = time.time()
ret, frame = video.read()
if ret == False:
print('Total Time:', time.time()-T0)
sys.exit()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.transpose(frame)
frame = pygame.surfarray.make_surface(frame)
screen.blit(frame, (0,0))
if num == 0:
T0 = time.time()
pygame.display.update()
FramePerSec.tick(FPS)
num += 1
print('freq time:{}, frame num: {}'.format(time.time()-T1, num))
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
?但是存在一些問(wèn)題,時(shí)間戳的耗時(shí)比視頻默認(rèn)時(shí)間更長(zhǎng)。
按理說(shuō)FramePerSec = pygame.time.Clock()是能夠很好的控制總的時(shí)長(zhǎng),但是發(fā)現(xiàn)視頻越長(zhǎng)播放器的延遲時(shí)間越長(zhǎng)
換成Ubuntu系統(tǒng)后,發(fā)現(xiàn)以上延遲的問(wèn)題得到緩解,推測(cè)可能與Windows系統(tǒng)中的進(jìn)程管理有關(guān)。但是視頻時(shí)差別很明顯,比如120s視頻,實(shí)際播放時(shí)間只用了118.8s。推測(cè)可能是pygame.time.Clock()是確保單幀的刷新率與預(yù)設(shè)相同,但是由于每一幀都存在相同的時(shí)間誤差,就導(dǎo)致誤差累加的問(wèn)題明顯。
自編時(shí)間控制
由于以上原因無(wú)法解決,增加了一個(gè)簡(jiǎn)單的控制邏輯后可有效控制視頻播放的時(shí)間戳問(wèn)題
import pygame
from pygame.locals import *
import cv2
import sys
import time
video_path = 'out1.avi'
video = cv2.VideoCapture(video_path)
FPS = int(round(video.get(cv2.CAP_PROP_FPS)))
FramePerSec = pygame.time.Clock()
Width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
Height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
pygame.init()
pygame.display.set_caption('OpenCV Video Player on Pygame')
screen = pygame.display.set_mode((Width, Height), 0, 32)
screen.fill([0,0,0])
num = 0
while True :
if num == 0:
T0 = time.time()
if time.time()-T0 > num*(1./FPS):
ret, frame = video.read()
TimeStamp = video.get(cv2.CAP_PROP_POS_MSEC)
if ret == False:
print('Total Time:', time.time()-T0)
pygame.quit()
sys.exit()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.transpose(frame)
frame = pygame.surfarray.make_surface(frame)
screen.blit(frame, (0,0))
pygame.display.update()
num += 1
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
到此這篇關(guān)于pygame+opencv實(shí)現(xiàn)讀取視頻幀的方法示例的文章就介紹到這了,更多相關(guān)pygame opencv讀取視頻幀內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)自動(dòng)打開電腦應(yīng)用的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)自動(dòng)打開電腦應(yīng)用的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python應(yīng)用實(shí)現(xiàn)處理excel數(shù)據(jù)過(guò)程解析
這篇文章主要介紹了Python應(yīng)用實(shí)現(xiàn)處理excel數(shù)據(jù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python中日志模塊logging的使用技巧和應(yīng)用詳解
在Python開發(fā)中,日志記錄是一個(gè)非常重要的環(huán)節(jié),它不僅有助于開發(fā)者追蹤程序的執(zhí)行流程,還能在出現(xiàn)問(wèn)題時(shí)提供關(guān)鍵信息,幫助快速定位并解決問(wèn)題,本文將結(jié)合實(shí)際案例,詳細(xì)介紹logging模塊的基礎(chǔ)用法和高級(jí)特性,需要的朋友可以參考下2024-08-08
Python實(shí)現(xiàn)特殊字符判斷并去掉非字母和數(shù)字的特殊字符
在 Python 中,可以通過(guò)多種方法來(lái)判斷字符串中是否包含非字母、數(shù)字的特殊字符,并將這些特殊字符去掉,本文為大家整理了一些常用的,希望對(duì)大家有所幫助2025-04-04

