通过几个小时的痛苦折磨,终于知道了原因,是因为opencv播放的时候太慢了,有一点多出来的时间让ffplay有了破音的可能。
import time
import threading
import cv2
import numpy as np
from ffpyplayer.player import MediaPlayer
#不知道为什么,有下面两行代码就不能正常退出了
#cv2.namedWindow("No Border Window", cv2.WINDOW_NORMAL)
#cv2.setWindowProperty("No Border Window", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
class Video:
def __init__(self,way):
self.url = f'video/{way}.mp4'
self.cap = cv2.VideoCapture(self.url)
#print(self.cap)
self.rate = self.cap.get(5)
self.FrameNumber = self.cap.get(7)
self.frame_width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
self.frame_height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
self.fps = int(250 / self.cap.get(cv2.CAP_PROP_FPS))
#print(self.frame_width,self.frame_height,self.fps)
def video(self):
while(self.cap.isOpened()):
ret,frame = self.cap.read()
#print(ret,frame)
try:
src = cv2.resize(frame,(self.frame_width,self.frame_height),interpolation=cv2.INTER_CUBIC)
cv2.imshow('',src)
except:
break
if cv2.waitKey(self.fps) & 0xFF == ord('q'):
break
self.cap.release()
cv2.destroyAllWindows()
def music(self):
player = MediaPlayer(self.url)
time.sleep(self.FrameNumber/self.rate)
def start(self):
vd = threading.Thread(target=self.video)
mc = threading.Thread(target=self.music)
mc.start()
vd.start()
if __name__ == '__main__':
main = Video('glod_ten')
main.start()
最终靠threading库解决了,反正改着改着,就改成库了………………反正之后会重构,不管惹
然后再花了几分钟的时间,用pandas库制作了比较简易的内容提取:
import pandas as pd
class Data:
def __init__(self,way):
self.url = f'data/{way}.csv'
self.read()
def read(self):
'''读取或者刷新数据至内存'''
self.csv = pd.read_csv(self.url,engine='c')
#print(self.csv)
self.radius = len(self.csv)
#print(self.radius)
self.data = []
count = sorted(list(self.csv.frequency))
count_num = (int(count[-1]) - int(count[0]))/100
#print(count,count_num)
for i in range(len(self.csv)):
number = self.csv.number[i]
name = self.csv.name[i]
rarity = self.csv.rarity[i]
frequency = self.csv.frequency[i]
if frequency >= int(count[-1]) - count_num:
rarity = 5
elif frequency < int(count[0]) + 80 * count_num:
rarity = 3
elif frequency >= int(count[0]) + 80 * count_num and frequency < int(count[-1]) - count_num:
rarity = 4
self.data.append({'number':int(number),'name':name,'rarity':int(rarity),'frequency':int(frequency)})
#print(self.data)
def save(self,datas):
"""保存并刷新在内存中的数据"""
new_datas = 'number,name,rarity,frequency\n'
for i in datas:
for value in i.values():
new_datas += str(value) + ','
new_datas = new_datas.strip(',')
new_datas += '\n'
print(new_datas)
with open(self.url,'w') as fl:
fl.write(new_datas)
self.read()
def change_frequency(self,object_num):
"""记录次数并保存"""
self.data[object_num-1]['frequency'] += 1
print(self.data)
self.save(self.data)
if __name__ == '__main__':
main = Data('test')
main.change_frequency(1)
看着好乱,没事,反正之后会重构的