在 Python 中使用线程处理视频和音频

时间:2021-07-15 07:40:42

标签: python python-3.x opencv python-multithreading

我有以下代码,它接受用户的输入,并相应地移动屏幕上出现的圆圈。它将信息打印到记录器文件中。但我遇到了一个问题。音频和视频不同步,即使使用 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()

0 个答案:

没有答案
相关问题