我有以下代码,它接受用户的输入,并相应地移动屏幕上出现的圆圈。它将信息打印到记录器文件中。但我遇到了一个问题。音频和视频不同步,即使使用 waitkey()
的最低值,音频也比视频快。使用 cv.CAP_PROP_FPS
我知道 cv2 以原始 30fps 的速度“输出”视频,但是 after_read-before_read
值告诉我 OpenCv 打开下一帧需要大约 3 毫秒。
提高速度的一个想法可能是在并行线程中运行音频和视频。但我不知道该怎么做。
任何有关如何解决此问题的帮助将不胜感激。提前致谢。
PS- 我使用的是 Visual Studio 代码,我的 Python 版本是 3.9.6 64 位。 修改后的代码
import cv2 as cv #import the OpenCV library
import numpy as np #Import Numpy Library
from ffpyplayer.player import MediaPlayer #ffpyplayer for playing audio
def send_data(message, output):
output.write('\n'+current_date_time+' '+ message)
def circle(frame, left):
if left:
cv.circle(frame,...)
if not left:
cv.circle(frame,...)
def video():
output=open('out.txt','a')
player = MediaPlayer('1.mp4')
circle_is_left = True
while (val!='eof'):
frame,val= player.get_frame() # capture frame-by-frame audio
if val!='eof' and frame is not None:
key_pressed = cv.waitKey(1)
img, t = frame
w = img.get_size()[0]
h = img.get_size()[1]
arr = np.uint8(np.asarray(list(img.to_bytearray()[0])).reshape(h,w,3)) # h - height of frame, w - width of frame, 3 - number of channels in frame
if key_pressed == ord(' '): #pressing space bar ends the video
break
elif key_pressed == 2: #left key pressed changes circle to left
circle_is_left = True
elif key_pressed == 3: # right key pressed changes circle to right
circle_is_left = False
circle(img, circle_is_left) #display the circle at all times
cv.imshow('player',arr) #display resulting frame
output.close()
cv.destroyAllWindows()
player.get_close()