3151 lines
122 KiB
Python
3151 lines
122 KiB
Python
# -*- coding: utf-8 -*-
|
||
import time
|
||
import vlc
|
||
import cv2
|
||
from PyQt5.QtGui import *
|
||
from PyQt5.QtCore import *
|
||
from PyQt5.QtWidgets import *
|
||
import sys
|
||
from multiprocessing import Process, Manager, freeze_support
|
||
from PyQt5.QtCore import QThread, pyqtSignal
|
||
from PyQt5.QtWidgets import QApplication
|
||
|
||
|
||
def process_frame(info_dict, frame_dict):
|
||
List = []
|
||
import os
|
||
for s, i in enumerate(os.listdir(r'T:\proj\LFC\FIND_MOV\b20')):
|
||
# if s > 3:
|
||
# break
|
||
List.append(os.path.join(r'T:\proj\LFC\FIND_MOV\b20', i))
|
||
f = 0
|
||
frams = 0
|
||
for s, n in enumerate(List):
|
||
if frams != 0:
|
||
print('dsds')
|
||
for j in range(f, frams):
|
||
print(j ,'lllllll')
|
||
frame_dict[j] = None
|
||
cap = cv2.VideoCapture(n)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
frams = frameNum
|
||
info_dict[s] = frameNum
|
||
for i in range(frameNum):
|
||
ret, frame = cap.read()
|
||
if ret:
|
||
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
frame_dict[f] = frame
|
||
f += 1
|
||
|
||
|
||
class Window(QLabel):
|
||
def __init__(self):
|
||
super(Window, self).__init__()
|
||
|
||
self.cacheInfo = {}
|
||
self.setAlignment(Qt.AlignCenter)
|
||
# self.setFixedSize(1280, 720)
|
||
self.cap = cv2.VideoCapture(r"C:\Users\ARTIST\Pictures\f\render_d20_050_V001.mov")
|
||
self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
||
ret, frame = self.cap.read()
|
||
if ret:
|
||
self.capheight, self.capwidth, bytesPerComponent = frame.shape
|
||
self.capbutedperline = 3 * self.capwidth
|
||
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
qimg = QImage(
|
||
frame.data,
|
||
self.capwidth,
|
||
self.capheight,
|
||
self.capbutedperline,
|
||
QImage.Format.Format_RGB888,
|
||
)
|
||
pixmap = QPixmap.fromImage(qimg).scaled(1280, 720)
|
||
self.setPixmap(pixmap)
|
||
self.get()
|
||
self.cacheThread = CacheThread()
|
||
# self.cacheThread.cachedone.connect(self.cache_done)
|
||
# self.cacheThread.start()
|
||
# self.cacheFrames = {}
|
||
self.timer = QTimer()
|
||
self.timer.setInterval(1000 // 24) # 设置定时器间隔,以确保每秒触发24次
|
||
self.timer.timeout.connect(self.generate_number) # 连接定时器的timeout信号到生成数字的槽函数
|
||
self.counter = 0
|
||
# time.sleep(3)
|
||
manager = Manager()
|
||
self.cacheFrames = manager.dict()
|
||
p = Process(target=process_frame, args=(self.cacheInfo, self.cacheFrames,))
|
||
p.start()
|
||
self.timer.start()
|
||
self.sss = Get(self.cacheFrames, self.counter)
|
||
self.sss.start()
|
||
|
||
# @pyqtSlot()
|
||
# def generate_number(self):
|
||
# # print(self.cacheFrames)
|
||
# if self.counter in self.cacheFrames:
|
||
# qimg = QImage(
|
||
# cv2.imdecode(np.frombuffer(self.cacheFrames.get(self.counter), np.uint8), cv2.IMREAD_COLOR),
|
||
# self.capwidth,
|
||
# self.capheight,
|
||
# self.capbutedperline,
|
||
# QImage.Format.Format_RGB888,
|
||
# )
|
||
# pixmap = QPixmap.fromImage(qimg).scaled(1280, 720)
|
||
# self.setPixmap(pixmap)
|
||
# self.counter += 1
|
||
|
||
@pyqtSlot()
|
||
def generate_number(self):
|
||
if self.counter in self.cacheFrames:
|
||
frame = self.cacheFrames[self.counter]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
self.setPixmap(pixmap)
|
||
self.counter += 1
|
||
|
||
def cache_done(self, frame, data):
|
||
print('cache done', data.data)
|
||
# self.cacheFrames = self.cacheThread.cacheFrames
|
||
# self.cacheFrames[frame] = data
|
||
# self.capheight = self.cacheThread.capheight
|
||
# self.capwidth = self.cacheThread.capwidth
|
||
# self.capbutedperline = self.cacheThread.capbutedperline
|
||
# self.timer.start()
|
||
|
||
def get(self):
|
||
List = []
|
||
import os
|
||
for s, i in enumerate(os.listdir(r'T:\proj\LFC\FIND_MOV\b20')):
|
||
# if s > 3:
|
||
# break
|
||
List.append(os.path.join(r'T:\proj\LFC\FIND_MOV\b20', i))
|
||
f = 0
|
||
for s, n in enumerate(List):
|
||
cap = cv2.VideoCapture(n)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
self.cacheInfo[s] = frameNum
|
||
print(self.cacheInfo)
|
||
|
||
def mousePressEvent(self, ev):
|
||
x = ev.pos().x()
|
||
i = int(float(x)/self.width() * sum([self.cacheInfo.get(i) for i in self.cacheInfo.keys()]))
|
||
if i in self.cacheFrames:
|
||
self.counter = i
|
||
|
||
|
||
class Get(QThread):
|
||
num = pyqtSignal(int)
|
||
|
||
def __init__(self, info=None, counter=None):
|
||
super(Get, self).__init__()
|
||
|
||
self.info = info
|
||
self.counter = counter
|
||
|
||
def run(self) -> None:
|
||
i = 0
|
||
while True:
|
||
# try:
|
||
for s in range(self.counter-10):
|
||
print('y', s)
|
||
if s < self.counter-20:
|
||
continue
|
||
# try:
|
||
self.info[s] = None
|
||
# except Exception as e:
|
||
# print('e', e)
|
||
# except Exception as a:
|
||
# print('a', a)
|
||
|
||
if i in self.info:
|
||
print(len(self.info))
|
||
self.num.emit(len(self.info))
|
||
|
||
|
||
class CacheThread(QThread):
|
||
cachedone = pyqtSignal(int, object)
|
||
|
||
def __init__(self):
|
||
super(CacheThread, self).__init__()
|
||
|
||
self.cacheFrames = {}
|
||
|
||
def run(self) -> None:
|
||
List = []
|
||
|
||
import os
|
||
for s, i in enumerate(os.listdir(r'T:\proj\LFC\FIND_MOV\b20')):
|
||
if s > 3:
|
||
break
|
||
List.append(os.path.join(r'T:\proj\LFC\FIND_MOV\b20', i))
|
||
|
||
f = 0
|
||
for n in List:
|
||
self.cap = cv2.VideoCapture(n)
|
||
self.frameNum = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
for i in range(self.frameNum):
|
||
ret, frame = self.cap.read()
|
||
if ret:
|
||
frame = cv2.resize(frame, (1280, 720))
|
||
self.capheight, self.capwidth, bytesPerComponent = frame.shape
|
||
self.capbutedperline = 3 * self.capwidth
|
||
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# self.cacheFrames[f+1] = frame
|
||
self.cachedone.emit(f+1, frame)
|
||
f += 1
|
||
print(f)
|
||
# self.cachedone.emit()
|
||
self.cap.release()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
freeze_support()
|
||
app = QApplication(sys.argv)
|
||
widget = Window()
|
||
widget.show()
|
||
app.exec_()
|
||
|
||
|
||
|
||
# ++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
import random
|
||
import threading
|
||
import time
|
||
import cv2
|
||
from PyQt5.QtGui import *
|
||
from PyQt5.QtCore import *
|
||
from PyQt5.QtWidgets import *
|
||
import sys
|
||
from multiprocessing import Process, Manager, Value, freeze_support
|
||
from PyQt5.QtCore import QThread, pyqtSignal
|
||
from PyQt5.QtWidgets import QApplication
|
||
import pyaudio
|
||
from moviepy.editor import VideoFileClip
|
||
|
||
|
||
def get(frame, data):
|
||
for key, value in data.items():
|
||
if frame in value[1]:
|
||
return key, value[0]
|
||
|
||
def play_audioss(path=None, frame=None, event=None, time_=None, au_if=None, start_time=0):
|
||
while True:
|
||
if path:
|
||
video = VideoFileClip(path)
|
||
cap = cv2.VideoCapture(path)
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
else:
|
||
video = VideoFileClip("[J2] 銀魂 002.rmvb")
|
||
cap = cv2.VideoCapture("[J2] 銀魂 002.rmvb")
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
audio = video.audio
|
||
if not audio:
|
||
au_if.value = 0
|
||
continue
|
||
p = pyaudio.PyAudio()
|
||
rat = audio.fps
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=rat,
|
||
output=True)
|
||
# 计算开始位置的帧数
|
||
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
# 逐帧播放音频
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if i >= start_frame:
|
||
fr = int(rat/fps)
|
||
if (i % fr) == 0:
|
||
if i == 0:
|
||
print('event', i)
|
||
event.value = 1
|
||
time.sleep(1.5)
|
||
else:
|
||
time_.value = i
|
||
frame.value += 1
|
||
if (i % rat) == 0:
|
||
print('miao', s)
|
||
s += 1
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
class T(QThread):
|
||
frame = pyqtSignal()
|
||
def __init__(self, n_playframe=None, frames1=None, playframe=None, time=None, cache=None):
|
||
super().__init__()
|
||
|
||
self.cache = cache
|
||
self.n_playframe = n_playframe
|
||
self.frames1 = frames1
|
||
self.playframe = playframe
|
||
self.time = time
|
||
|
||
def run(self):
|
||
while True:
|
||
# print('bububuubub')
|
||
if self.playframe.value in self.cache.keys():
|
||
if self.playframe.value < self.frames1.value - 1:
|
||
self.playframe.value += 1
|
||
elif self.playframe.value > self.frames1.value:
|
||
self.playframe.value -= 1
|
||
else:
|
||
if self.playframe.value < self.frames1.value - 1:
|
||
self.playframe.value += 1
|
||
elif self.playframe.value > self.frames1.value:
|
||
self.playframe.value -= 1
|
||
# self.time.value = self.playframe.value
|
||
# for i in range(2):
|
||
# pass
|
||
# # print(1111, self.n_playframe.value, self.frames1.value)
|
||
# # self.frame.emit()
|
||
# self.n_playframe.value = self.frames1.value
|
||
|
||
|
||
class PlayAudio(QThread):
|
||
frame = pyqtSignal()
|
||
|
||
def __init__(self, playlist, playframe, select, test, n_playframe, time, cache, start_time=0):
|
||
super().__init__()
|
||
|
||
self.cache = cache
|
||
self.playlist = playlist
|
||
self.playframe = playframe
|
||
self.n_playframe = n_playframe
|
||
self.time = time
|
||
self.select = select
|
||
self.test = test
|
||
self.start_time = start_time
|
||
self.timer = QTimer()
|
||
cap = cv2.VideoCapture(self.playlist[self.select.value])
|
||
self.fps = cap.get(cv2.CAP_PROP_FPS)
|
||
print(self.fps)
|
||
self.timer.setInterval(1000 // self.fps)
|
||
self.timer.timeout.connect(self.Es)
|
||
# self.timer.start()
|
||
self.audio = None
|
||
self.stream = None
|
||
self.buffer = []
|
||
self.sss = False
|
||
self.au_event = Manager().Value("i", 0)
|
||
self.frames = Manager().Value("i", 0)
|
||
self.frames1 = Manager().Value("i", 0)
|
||
self.frames2 = 0
|
||
self.au_time = Manager().Value("i", 0)
|
||
self.if_au = Manager().Value("i", 1)
|
||
self.p = Process(target=play_audioss, args=(self.playlist[self.select.value], self.frames, self.au_event, self.au_time, self.if_au))
|
||
self.p.start()
|
||
self.t = T(self.n_playframe, self.frames1, self.playframe, self.time, self.cache)
|
||
self.t.frame.connect(self.Es)
|
||
while True:
|
||
if self.au_event.value:
|
||
# self.timer.start()
|
||
self.frame.emit()
|
||
self.playframe.value += 1
|
||
self.t.start()
|
||
self.au_event.value = 0
|
||
break
|
||
elif self.if_au.value == 0:
|
||
self.timer.start()
|
||
break
|
||
|
||
def set(self, fps):
|
||
# self.timer.stop()
|
||
self.timer.setInterval(1000 // int(fps))
|
||
# self.timer.start()
|
||
|
||
# def run(self):
|
||
# index = None
|
||
# p = None
|
||
# if self.sss:
|
||
# return
|
||
# # while True:
|
||
# # # print(self.select.value)
|
||
# # # print(self.playlist[self.select.value])
|
||
# # if index != self.select.value:
|
||
# # if self.stream:
|
||
# # self.stream.close()
|
||
# # self.buffer = []
|
||
# # self.audio = None
|
||
# # self.stream = None
|
||
# # # if p:
|
||
# # # print('clor')
|
||
# # # p.terminate()
|
||
# #
|
||
# # index = self.select.value
|
||
# # video = VideoFileClip(self.playlist[self.select.value])
|
||
# # self.audio = video.audio
|
||
# # if self.audio:
|
||
# # rat = self.audio.fps
|
||
# #
|
||
# # p = pyaudio.PyAudio()
|
||
# # # 创建输出流
|
||
# # self.stream = p.open(format=pyaudio.paFloat32,
|
||
# # channels= self.audio.nchannels,
|
||
# # rate=rat,
|
||
# # output=True)
|
||
# # # print(playlist[select.value])
|
||
# # # 计算开始位置的帧数
|
||
# # start_frame = self.start_time
|
||
# #
|
||
# # # print(rat, 'rat')
|
||
# # # 设置缓冲区大小
|
||
# # buffer_size = 1024
|
||
# # else:
|
||
# # # print('play')
|
||
# #
|
||
# # if self.audio:
|
||
# # for i, chunk in enumerate(self.audio.iter_frames(with_times=False)):
|
||
# # # print(i)
|
||
# # fr = int(rat/self.fps)
|
||
# # if (i % fr) == 0:
|
||
# # pass
|
||
# # # print('dddddddddddddd')
|
||
# # # self.frame.emit()
|
||
# # # print(self.cou)
|
||
# # if i >= start_frame:
|
||
# # self.buffer.append(chunk.astype('float32').tostring())
|
||
# # if len(self.buffer) >= buffer_size:
|
||
# # self.stream.write(b''.join(self.buffer))
|
||
# # self.buffer = []
|
||
# # # print(stream.get_time())
|
||
# # # 写入剩余数据
|
||
# # if self.buffer:
|
||
# # self.stream.write(b''.join(self.buffer))
|
||
# # p.terminate()
|
||
|
||
def run(self):
|
||
while True:
|
||
if self.frames1.value != self.frames.value:
|
||
self.frames1.value = self.frames.value
|
||
self.playframe.value += 1
|
||
# print('相差', self.frames.value, self.playframe.value)
|
||
|
||
# print(self.frames1)
|
||
self.frame.emit()
|
||
# print('run')
|
||
# self.playframe.
|
||
|
||
def Es(self):
|
||
pass
|
||
# print('es')
|
||
# self.terminate()
|
||
# while True:
|
||
# if abs(self.frames1 - self.n_playframe.value):
|
||
# for i in range(abs(self.frames1 - self.n_playframe.value)):
|
||
# print(1111)
|
||
self.frame.emit()
|
||
# if not self.if_au.value:
|
||
# self.frame.emit()
|
||
# return
|
||
# self.frames2 += 1
|
||
# if self.frames1 != self.frames2:
|
||
# print(self.frames1, self.frames2, self.frames.value, self.au_time)
|
||
# self.frame.emit()
|
||
# if self.audio:
|
||
# return
|
||
# if self.frames1 != self.frames.value:
|
||
# return
|
||
# self.frame.emit()
|
||
# while True:
|
||
|
||
|
||
def play(playFrame, buff):
|
||
p = pyaudio.PyAudio()
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
while True:
|
||
# # print(playFrame.value, 'bdddd')
|
||
# if playFrame.value%25 == 0:
|
||
stream.write(b''.join(buff[int(playFrame.value)]))
|
||
# # print(self.playFrame.value, dir(self.buff), self.buff.keys())
|
||
|
||
|
||
def play_audios(playlist, select, test, start_time=0):
|
||
|
||
index = None
|
||
p = None
|
||
while True:
|
||
|
||
# print(playlist[select.value])
|
||
if index != select.value:
|
||
if p:
|
||
p.terminate()
|
||
index = select.value
|
||
video = VideoFileClip(playlist[select.value])
|
||
audio = video.audio
|
||
p = pyaudio.PyAudio()
|
||
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
# print(playlist[select.value])
|
||
# 计算开始位置的帧数
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
else:
|
||
# print('play')
|
||
|
||
if audio:
|
||
o = 0
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if (i%1764) == 0:
|
||
test.value = o
|
||
o += 1
|
||
# print(o)
|
||
if i >= start_frame:
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
def play_audio(path=None, start_time=0):
|
||
if path:
|
||
video = VideoFileClip(path)
|
||
else:
|
||
video = VideoFileClip("[J2] 銀魂 002.rmvb")
|
||
audio = video.audio
|
||
p = pyaudio.PyAudio()
|
||
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
# 计算开始位置的帧数
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
# 逐帧播放音频
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if i >= start_frame:
|
||
if i % (44100 / 25) == 0:
|
||
print(s, 'miao')
|
||
s += 1
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
def process_frame(playlist, playFrame, playindex, select, select_status, time, cache, frame_dict, playend, rod, hua):
|
||
# playlist.append('/home/jcen/Videos/[J2] 銀魂 002.rmvb')
|
||
# print(playlist)
|
||
f = 1
|
||
op = time.value
|
||
mov = select.value
|
||
while True:
|
||
if mov == (len(playlist)-0):
|
||
if not playend.value:
|
||
select_status.value = 0
|
||
mov = select.value
|
||
op = time.value
|
||
f = time.value
|
||
cap.release()
|
||
frame_dict.clear()
|
||
continue
|
||
if f in frame_dict.keys():
|
||
f += 1
|
||
continue
|
||
playindex.value = mov
|
||
# print(select.value, mov)
|
||
# if select.value != mov and select_status.value:
|
||
# cap.release()
|
||
# mov = select.value
|
||
# frame_dict.clear()
|
||
# # select_status.value = 0
|
||
# if time.value != op:
|
||
# cap.release()
|
||
# op = time.value
|
||
# f = time.value
|
||
# playFrame.value = time.value
|
||
# frame_dict.clear()
|
||
# print(time.value, op, playFrame.value, len(frame_dict), mov)
|
||
# print(mov, select.value, playlist[mov], frame_dict.keys())
|
||
print('op' ,op, playindex.value)
|
||
# for s, n in enumerate(List[:]):
|
||
# if frams != 0:
|
||
# # print('dsds')
|
||
# for j in range(f, frams):
|
||
# # print(j ,'lllllll')
|
||
# frame_dict[j] = None
|
||
cap = cv2.VideoCapture(playlist[mov])
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
cap.set(cv2.CAP_PROP_POS_FRAMES, op)
|
||
|
||
# print('cap', frameNum)
|
||
while cap.isOpened():
|
||
if rod.value:
|
||
continue
|
||
# # print(playFrame.value, f, len(frame_dict), 'dfdfdfdfdfd')
|
||
if select_status.value and hua.value == 0:
|
||
# print('sssss', select.value, time.value, select_status.value)
|
||
select_status.value = 0
|
||
mov = select.value
|
||
op = time.value
|
||
f = time.value
|
||
cap.release()
|
||
frame_dict.clear()
|
||
break
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# if frameNum < 220:
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# # if abs(f - playFrame.value) == 100:
|
||
# # if playFrame.value > 50:
|
||
# # if abs(f - playFrame.value) == 100:
|
||
# # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# # frame_dict[f] = frame
|
||
# # f += 1
|
||
# # else:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# cache.value = len(frame_dict) + playFrame.value
|
||
# # elif f < 100:
|
||
# # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# # frame_dict[f] = frame
|
||
# # f += 1
|
||
# else:
|
||
# mov += 1
|
||
# op = 0
|
||
# break
|
||
|
||
if len(frame_dict) < 500:
|
||
ret, frame = cap.read()
|
||
if ret:
|
||
|
||
# if abs(f - playFrame.value) == 100:
|
||
# if playFrame.value > 50:
|
||
# if abs(f - playFrame.value) == 100:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# else:
|
||
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
frame_dict[f] = frame
|
||
f += 1
|
||
cache.value = len(frame_dict) + playFrame.value
|
||
# print('duqu')
|
||
# print('ret', ret, f, len(frame_dict))
|
||
# elif f < 100:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
else:
|
||
print('else', op, playindex.value)
|
||
if mov == (len(playlist)-1):
|
||
playend.value = 1
|
||
mov += 1
|
||
op = 0
|
||
break
|
||
else:
|
||
continue
|
||
|
||
|
||
|
||
# frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
# frams = frameNum
|
||
# info_dict[s] = frameNum
|
||
# for i in range(frameNum):
|
||
# while True:
|
||
# if abs(f - playFrame.value) == 100:
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# else:
|
||
# continue
|
||
|
||
|
||
class Window(QLabel):
|
||
def __init__(self):
|
||
super(Window, self).__init__()
|
||
|
||
|
||
self.select_ = None
|
||
# time.sleep(3)
|
||
manager = Manager()
|
||
self.cacheFrames = manager.dict()
|
||
manager = Manager()
|
||
self.cacheInfo = manager.dict()
|
||
manager = Manager()
|
||
self.playFrame = manager.Value('i', 1)
|
||
self.n_playFrame = manager.Value('i', 1)
|
||
self.playindex = manager.Value('i', 0)
|
||
self.playindexing = manager.Value('i', 0)
|
||
self.select = manager.Value('i', 0)
|
||
self.select_status = manager.Value('i', 0)
|
||
self.tiems = manager.Value('i', 0)
|
||
self.cache = manager.Value('i', 0)
|
||
self.playList = manager.list()
|
||
self.playend = manager.Value('i', 0)
|
||
self.rod = manager.Value('i', 0)
|
||
self.test = manager.Value('i', 0)
|
||
self.hua = manager.Value('i', 0)
|
||
self.playInit = manager.dict()
|
||
import os
|
||
for s, i in enumerate(os.listdir('/home/jcen/Videos/新建文件夹')):
|
||
if i.split('.')[-1] in ['rmvb', 'mp4', 'mov']:
|
||
self.playList.append(os.path.join(r'/home/jcen/Videos/新建文件夹', i))
|
||
print(self.playList)
|
||
# self.playList.pop(0)
|
||
# self.playList.append('/home/jcen/Videos/新建文件夹/[J2] 銀魂 002.rmvb')
|
||
# manager = Manager()
|
||
# self.buff = manager.dict()
|
||
# self.generate_number1()
|
||
|
||
# self.cacheInfo = {}
|
||
self.setAlignment(Qt.AlignCenter)
|
||
self.resize(1280, 720)
|
||
self.cap = cv2.VideoCapture(r"/home/jcen/Videos/[J2] 銀魂 002.rmvb")
|
||
self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
||
fps = self.cap.get(cv2.CAP_PROP_FPS)
|
||
self.get()
|
||
# self.timer = QTimer()
|
||
# self.timer1 = QTimer()
|
||
# self.timer.setInterval(1000 // fps) # 设置定时器间隔,以确保每秒触发24次
|
||
# self.timer.timeout.connect(self.generate_number) # 连接定时器的timeout信号到生成数字的槽函数
|
||
|
||
time.sleep(5)
|
||
for i in range(1):
|
||
p = Process(target=process_frame, args=(self.playList, self.playFrame, self.playindex, self.select, self.select_status, self.tiems, self.cache, self.cacheFrames, self.playend, self.rod, self.hua))
|
||
p.start()
|
||
# self.ps = Process(target=play_audios, args=(self.playList, self.playindex, self.test))
|
||
|
||
# time.sleep(2)
|
||
# self.timer.start()
|
||
# self.ps.start()
|
||
# self.timer1.start()
|
||
# self.sss = Get(self.cache)
|
||
# self.sss.start()
|
||
|
||
self.yy = PlayAudio(self.playList, self.playFrame, self.playindex, self.test, self.n_playFrame, self.tiems, self.cacheFrames)
|
||
self.yy.frame.connect(self.generate_number)
|
||
self.yy.start()
|
||
|
||
@pyqtSlot()
|
||
def generate_number(self):
|
||
if self.playend.value and self.playFrame.value == self.cacheFrames.keys()[-1]+1:
|
||
# print('end', self.playFrame.value, self.cacheFrames.keys())
|
||
return
|
||
# if self.test.value:
|
||
# # print(self.playFrame.value, self.test.value)
|
||
# self.playFrame.value += self.test.value - 1
|
||
# # if self.counter/1000 == 0:
|
||
# # # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
# self.h, self.w, ch = frame.shape
|
||
# bytesPerLine = ch * self.w
|
||
# # frame = cv2.resize(frame, (1280, 720))
|
||
# qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
# self.setPixmap(pixmap)
|
||
# # del frame
|
||
# # del pixmap
|
||
# # del qImg
|
||
# if self.playFrame.value-self.tiems.value > 50 and len(self.cacheFrames) >50:
|
||
# # # print(self.playFrame.value-self.tiems.value, self.playFrame.value-300)
|
||
# self.cacheFrames.pop(self.playFrame.value-51)
|
||
# return
|
||
# print(len(self.cacheFrames.keys()), self.playFrame.value , self.playFrame.value in self.cacheFrames, len(self.cacheFrames.keys()),self.cacheFrames.keys() )
|
||
if self.playFrame.value not in self.cacheFrames:
|
||
if len(self.cacheFrames.keys()):
|
||
if self.playFrame.value > self.cacheFrames.keys()[-1]:
|
||
self.playFrame.value = self.cacheFrames.keys()[1]
|
||
elif self.playFrame.value < self.cacheFrames.keys()[0]:
|
||
self.playFrame.value = self.cacheFrames.keys()[1]
|
||
print(self.playFrame.value, 'sssssssssssssss', sum([self.cacheInfo[i] for i in range(self.playindexing.value)]), self.playindexing.value)
|
||
return
|
||
if self.playFrame.value in self.cacheFrames:
|
||
while True:
|
||
try:
|
||
frame = self.cacheFrames[self.playFrame.value]
|
||
break
|
||
except:
|
||
continue
|
||
# if self.counter/1000 == 0:
|
||
# # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
self.setPixmap(pixmap)
|
||
# del frame
|
||
# del pixmap
|
||
# del qImg
|
||
if self.playFrame.value-self.tiems.value > 250 and len(self.cacheFrames) > 250 and self.playFrame.value-251 in self.cacheFrames.keys():
|
||
# print(self.playFrame.value, self.cacheFrames.keys())
|
||
self.cacheFrames.pop(self.cacheFrames.keys()[0])
|
||
if self.playindexing.value == 0:
|
||
if self.playFrame.value > self.cacheInfo[self.playindexing.value]:
|
||
self.playindexing.value += 1
|
||
elif self.playindexing.value == len(self.cacheInfo.keys())-1:
|
||
pass
|
||
else:
|
||
if self.playFrame.value > sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]):
|
||
self.playindexing.value += 1
|
||
# print('z', sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))
|
||
# elif self.playFrame.value > sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]):
|
||
# print('z', sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]))
|
||
# self.playindexing.value += 1
|
||
if self.playindexing.value == 0:
|
||
# print('当前帧0',
|
||
# self.playindexing.value, self.playFrame.value,
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# self.playFrame.value)
|
||
self.n_playFrame.value = self.playFrame.value
|
||
dframe = self.playFrame.value
|
||
zframe = self.playFrame.value
|
||
else:
|
||
if self.playFrame.value < sum([self.cacheInfo[i] for i in range(self.playindexing.value)]):
|
||
pass
|
||
# print('当前帧点击',
|
||
# '\n播放',self.playindexing.value,
|
||
# '\n当前',self.playFrame.value,
|
||
# '\n总',sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# '\n总帧', self.playFrame.value + sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
# )
|
||
self.n_playFrame.value = self.playFrame.value + 1
|
||
dframe = self.playFrame.value + 1
|
||
zframe = self.playFrame.value + sum([self.cacheInfo[i] for i in range(self.playindexing.value)]) + 1
|
||
else:
|
||
# print('当前帧1',
|
||
# '\n播放',self.playindexing.value,
|
||
# '\n帧',self.playFrame.value,
|
||
# '\n总',sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# '\n当前',self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
# )
|
||
self.n_playFrame.value = self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
dframe = self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
zframe = self.playFrame.value
|
||
# if self.playFrame.value != abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))):
|
||
# print('当前帧1', self.playindexing.value, self.playFrame.value, (sum([self.cacheInfo[i] for i in range(self.playindexing.value)])), sum([self.cacheInfo[i] for i in range(self.playindexing.value)]), abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))))
|
||
# else:
|
||
# print('当前帧1', self.playindexing.value, self.playFrame.value,
|
||
# (sum([self.cacheInfo[i] for i in range(self.playindexing.value)])),
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]) - abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))))
|
||
# print(self.playFrame.value)
|
||
print('\n实际播放', self.playFrame.value, '\n播放',self.playindexing.value, '\n当前帧', dframe, '\n总的当前帧', zframe, '\n镜头帧', self.n_playFrame.value)
|
||
self.playFrame.value += 1
|
||
|
||
|
||
def generate_number1(self):
|
||
|
||
s = Process(target=play_audio)
|
||
s.start()
|
||
|
||
def get(self):
|
||
p = 1
|
||
ps = 1
|
||
for s, n in enumerate(self.playList):
|
||
cap = cv2.VideoCapture(n)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
frameNum1 = frameNum + ps
|
||
self.cacheInfo[s] = frameNum
|
||
self.playInit[s] = [[1, frameNum], [ps, frameNum1]]
|
||
ps = frameNum1 + 1
|
||
print(self.playInit.items())
|
||
|
||
def mousePressEvent(self, ev):
|
||
# self.timer.stop()
|
||
# if True:
|
||
# return
|
||
if ev.button() == Qt.LeftButton:
|
||
# print("Left mouse button pressed")
|
||
i = random.randint(0, len(self.playList)-1)
|
||
self.select_ = i
|
||
# s = random.randint(0, self.cacheInfo[i])
|
||
x = ev.pos().x()
|
||
ip = int(float(x) / self.width() * self.cacheInfo[i])
|
||
self.select_status.value = 1
|
||
print('select', i, ip, self.cacheInfo[i])
|
||
# print(len(self.cacheFrames.keys()), self.playFrame.value, self.playFrame.value in self.cacheFrames,
|
||
# self.cacheFrames.keys())
|
||
self.select.value = i
|
||
self.tiems.value = ip
|
||
self.playFrame.value = ip
|
||
self.playend.value = 0
|
||
self.playindexing.value = i
|
||
# if not self.timer.isActive():
|
||
# self.timer.start()
|
||
elif ev.button() == Qt.RightButton:
|
||
# print("Right mouse button pressed")
|
||
if self.yy.timer.isActive():
|
||
self.yy.timer.stop()
|
||
print(self.playInit[3])
|
||
frame = random.randint(0, self.playInit[self.playInit.keys()-1][1][1])
|
||
print(frame)
|
||
# if get()
|
||
if self.playFrame.value in self.cacheFrames:
|
||
# if self.counter/1000 == 0:
|
||
# # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
frame = self.cacheFrames[self.playFrame.value]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# 假设qImg是您的QImage对象
|
||
file_path = "%s.jpg" % self.playFrame.value # 保存图片的文件路径
|
||
|
||
# 保存QImage对象为图片文件
|
||
qImg.save(file_path)
|
||
# print('stop')
|
||
else:
|
||
# print('start')
|
||
self.yy.timer.start()
|
||
|
||
def mouseMoveEvent(self, ev):
|
||
self.yy.timer.stop()
|
||
x = ev.pos().x()
|
||
ip = int(float(x) / self.width() * self.cacheInfo[self.select_])
|
||
# self.select_status.value = 1
|
||
# print('select', self.select_, ip, self.cacheInfo[self.select_])
|
||
self.tiems.value = ip - 1
|
||
self.playFrame.value = ip - 1
|
||
self.hua.value = 1
|
||
print(self.cacheFrames.keys())
|
||
if self.playFrame.value in self.cacheFrames:
|
||
# if self.counter/1000 == 0:
|
||
# # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
frame = self.cacheFrames[self.playFrame.value]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
self.setPixmap(pixmap)
|
||
super().mouseMoveEvent(ev)
|
||
|
||
def mouseReleaseEvent(self, ev):
|
||
self.hua.value = 0
|
||
cap = cv2.VideoCapture(self.playList[self.select.value])
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
self.yy.set(fps)
|
||
# time.sleep(1)
|
||
self.yy.timer.start()
|
||
super().mouseReleaseEvent(ev)
|
||
|
||
def mouseDoubleClickEvent(self, a0):
|
||
if self.rod.value:
|
||
self.rod.value = 0
|
||
else:
|
||
self.rod.value = 1
|
||
super().mouseDoubleClickEvent(a0)
|
||
|
||
def closeEvent(self, a0):
|
||
self.p.kill()
|
||
|
||
|
||
class Get(QThread):
|
||
num = pyqtSignal(int)
|
||
|
||
def __init__(self, cache=None):
|
||
super(Get, self).__init__()
|
||
|
||
self.cache = cache
|
||
|
||
def run(self) -> None:
|
||
while True:
|
||
self.cache.value
|
||
|
||
|
||
if __name__ == '__main__':
|
||
freeze_support()
|
||
app = QApplication([])
|
||
widget = Window()
|
||
widget.show()
|
||
# cap = cv2.VideoCapture('/home/jcen/Videos/[J2] 銀魂 002.rmvb')
|
||
# frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
# print(frameNum)
|
||
app.exec_()
|
||
|
||
|
||
|
||
|
||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
|
||
import random
|
||
import threading
|
||
import time
|
||
import cv2
|
||
from PyQt5.QtGui import *
|
||
from PyQt5.QtCore import *
|
||
from PyQt5.QtWidgets import *
|
||
import sys
|
||
from multiprocessing import Process, Manager, Value, freeze_support
|
||
from PyQt5.QtCore import QThread, pyqtSignal
|
||
from PyQt5.QtWidgets import QApplication
|
||
import pyaudio
|
||
from moviepy.editor import VideoFileClip
|
||
|
||
|
||
def get(frame, data):
|
||
for key, value in data.items():
|
||
if frame in list(range(value[1][0], value[1][1] + 1)):
|
||
if key == 0:
|
||
return key, value[0], frame - value[1][0] + 1
|
||
else:
|
||
return key, value[0], frame - value[1][0]
|
||
|
||
def play_audioss(path=None, frame=None, event=None, time_=None, au_if=None, start_time=0):
|
||
while True:
|
||
if path:
|
||
video = VideoFileClip(path)
|
||
audio = video.audio
|
||
if not audio:
|
||
au_if.value = 0
|
||
continue
|
||
cap = cv2.VideoCapture(path)
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
else:
|
||
video = VideoFileClip("[J2] 銀魂 002.rmvb")
|
||
audio = video.audio
|
||
if not audio:
|
||
au_if.value = 0
|
||
continue
|
||
cap = cv2.VideoCapture("[J2] 銀魂 002.rmvb")
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
|
||
|
||
p = pyaudio.PyAudio()
|
||
rat = audio.fps
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=rat,
|
||
output=True)
|
||
# 计算开始位置的帧数
|
||
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
# 逐帧播放音频
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if i >= start_frame:
|
||
fr = int(rat/fps)
|
||
if (i % fr) == 0:
|
||
if i == 0:
|
||
# print('event', i)
|
||
event.value = 1
|
||
time.sleep(1.5)
|
||
else:
|
||
time_.value = i
|
||
frame.value += 1
|
||
if (i % rat) == 0:
|
||
# print('miao', s)
|
||
s += 1
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
class T(QThread):
|
||
frame = pyqtSignal()
|
||
def __init__(self, n_playframe=None, frames1=None, playframe=None, time=None, cache=None):
|
||
super().__init__()
|
||
|
||
self.cache = cache
|
||
self.n_playframe = n_playframe
|
||
self.frames1 = frames1
|
||
self.playframe = playframe
|
||
self.time = time
|
||
|
||
def run(self):
|
||
while True:
|
||
# print('bububuubub')
|
||
if self.playframe.value in self.cache.keys():
|
||
if self.playframe.value < self.frames1.value - 1:
|
||
self.playframe.value += 1
|
||
elif self.playframe.value > self.frames1.value:
|
||
self.playframe.value -= 1
|
||
else:
|
||
if self.playframe.value < self.frames1.value - 1:
|
||
self.playframe.value += 1
|
||
elif self.playframe.value > self.frames1.value:
|
||
self.playframe.value -= 1
|
||
# self.time.value = self.playframe.value
|
||
# for i in range(2):
|
||
# pass
|
||
# # print(1111, self.n_playframe.value, self.frames1.value)
|
||
# # self.frame.emit()
|
||
# self.n_playframe.value = self.frames1.value
|
||
|
||
|
||
class PlayAudio(QThread):
|
||
frame = pyqtSignal()
|
||
|
||
def __init__(self, playlist, playframe, select, test, n_playframe, time, cache, start_time=0):
|
||
super().__init__()
|
||
|
||
self.cache = cache
|
||
self.playlist = playlist
|
||
self.playframe = playframe
|
||
self.n_playframe = n_playframe
|
||
self.time = time
|
||
self.select = select
|
||
self.test = test
|
||
self.start_time = start_time
|
||
self.timer = QTimer()
|
||
cap = cv2.VideoCapture(self.playlist[self.select.value])
|
||
self.fps = cap.get(cv2.CAP_PROP_FPS)
|
||
print(self.fps)
|
||
self.timer.setInterval(1000 // self.fps)
|
||
self.timer.timeout.connect(self.Es)
|
||
# self.timer.start()
|
||
self.audio = None
|
||
self.stream = None
|
||
self.buffer = []
|
||
self.sss = False
|
||
self.au_event = Manager().Value("i", 0)
|
||
self.frames = Manager().Value("i", 0)
|
||
self.frames1 = Manager().Value("i", 0)
|
||
self.frames2 = 0
|
||
self.au_time = Manager().Value("i", 0)
|
||
self.if_au = Manager().Value("i", 1)
|
||
if not self.sss:
|
||
# self.p = Process(target=play_audioss, args=(self.playlist[self.select.value], self.frames, self.au_event, self.au_time, self.if_au))
|
||
# self.p.start()
|
||
|
||
self.p = threading.Thread(target=play_audioss, args=(self.playlist[self.select.value], self.frames, self.au_event, self.au_time, self.if_au))
|
||
self.p.start()
|
||
|
||
self.t = T(self.n_playframe, self.frames1, self.playframe, self.time, self.cache)
|
||
self.t.frame.connect(self.Es)
|
||
while True:
|
||
if self.sss:
|
||
self.timer.start()
|
||
break
|
||
if self.au_event.value:
|
||
# self.timer.start()
|
||
self.frame.emit()
|
||
self.playframe.value += 1
|
||
self.t.start()
|
||
self.au_event.value = 0
|
||
break
|
||
elif self.if_au.value == 0:
|
||
self.timer.start()
|
||
break
|
||
|
||
def set(self, fps):
|
||
# self.timer.stop()
|
||
self.timer.setInterval(1000 // int(fps))
|
||
# self.timer.start()
|
||
|
||
# def run(self):
|
||
# index = None
|
||
# p = None
|
||
# if self.sss:
|
||
# return
|
||
# # while True:
|
||
# # # print(self.select.value)
|
||
# # # print(self.playlist[self.select.value])
|
||
# # if index != self.select.value:
|
||
# # if self.stream:
|
||
# # self.stream.close()
|
||
# # self.buffer = []
|
||
# # self.audio = None
|
||
# # self.stream = None
|
||
# # # if p:
|
||
# # # print('clor')
|
||
# # # p.terminate()
|
||
# #
|
||
# # index = self.select.value
|
||
# # video = VideoFileClip(self.playlist[self.select.value])
|
||
# # self.audio = video.audio
|
||
# # if self.audio:
|
||
# # rat = self.audio.fps
|
||
# #
|
||
# # p = pyaudio.PyAudio()
|
||
# # # 创建输出流
|
||
# # self.stream = p.open(format=pyaudio.paFloat32,
|
||
# # channels= self.audio.nchannels,
|
||
# # rate=rat,
|
||
# # output=True)
|
||
# # # print(playlist[select.value])
|
||
# # # 计算开始位置的帧数
|
||
# # start_frame = self.start_time
|
||
# #
|
||
# # # print(rat, 'rat')
|
||
# # # 设置缓冲区大小
|
||
# # buffer_size = 1024
|
||
# # else:
|
||
# # # print('play')
|
||
# #
|
||
# # if self.audio:
|
||
# # for i, chunk in enumerate(self.audio.iter_frames(with_times=False)):
|
||
# # # print(i)
|
||
# # fr = int(rat/self.fps)
|
||
# # if (i % fr) == 0:
|
||
# # pass
|
||
# # # print('dddddddddddddd')
|
||
# # # self.frame.emit()
|
||
# # # print(self.cou)
|
||
# # if i >= start_frame:
|
||
# # self.buffer.append(chunk.astype('float32').tostring())
|
||
# # if len(self.buffer) >= buffer_size:
|
||
# # self.stream.write(b''.join(self.buffer))
|
||
# # self.buffer = []
|
||
# # # print(stream.get_time())
|
||
# # # 写入剩余数据
|
||
# # if self.buffer:
|
||
# # self.stream.write(b''.join(self.buffer))
|
||
# # p.terminate()
|
||
|
||
def run(self):
|
||
while True:
|
||
if self.frames1.value != self.frames.value:
|
||
self.frames1.value = self.frames.value
|
||
self.playframe.value += 1
|
||
# print('相差', self.frames.value, self.playframe.value)
|
||
|
||
# print(self.frames1)
|
||
self.frame.emit()
|
||
# print('run')
|
||
# self.playframe.
|
||
|
||
def Es(self):
|
||
pass
|
||
# print('es')
|
||
# self.terminate()
|
||
# while True:
|
||
# if abs(self.frames1 - self.n_playframe.value):
|
||
# for i in range(abs(self.frames1 - self.n_playframe.value)):
|
||
# print(1111)
|
||
self.frame.emit()
|
||
# if not self.if_au.value:
|
||
# self.frame.emit()
|
||
# return
|
||
# self.frames2 += 1
|
||
# if self.frames1 != self.frames2:
|
||
# print(self.frames1, self.frames2, self.frames.value, self.au_time)
|
||
# self.frame.emit()
|
||
# if self.audio:
|
||
# return
|
||
# if self.frames1 != self.frames.value:
|
||
# return
|
||
# self.frame.emit()
|
||
# while True:
|
||
|
||
|
||
def play(playFrame, buff):
|
||
p = pyaudio.PyAudio()
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
while True:
|
||
# # print(playFrame.value, 'bdddd')
|
||
# if playFrame.value%25 == 0:
|
||
stream.write(b''.join(buff[int(playFrame.value)]))
|
||
# # print(self.playFrame.value, dir(self.buff), self.buff.keys())
|
||
|
||
|
||
def play_audios(playlist, select, test, start_time=0):
|
||
|
||
index = None
|
||
p = None
|
||
while True:
|
||
|
||
# print(playlist[select.value])
|
||
if index != select.value:
|
||
if p:
|
||
p.terminate()
|
||
index = select.value
|
||
video = VideoFileClip(playlist[select.value])
|
||
audio = video.audio
|
||
p = pyaudio.PyAudio()
|
||
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
# print(playlist[select.value])
|
||
# 计算开始位置的帧数
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
else:
|
||
# print('play')
|
||
|
||
if audio:
|
||
o = 0
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if (i%1764) == 0:
|
||
test.value = o
|
||
o += 1
|
||
# print(o)
|
||
if i >= start_frame:
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
def play_audio(path=None, start_time=0):
|
||
if path:
|
||
video = VideoFileClip(path)
|
||
else:
|
||
video = VideoFileClip("[J2] 銀魂 002.rmvb")
|
||
audio = video.audio
|
||
p = pyaudio.PyAudio()
|
||
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
# 计算开始位置的帧数
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
# 逐帧播放音频
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if i >= start_frame:
|
||
if i % (44100 / 25) == 0:
|
||
print(s, 'miao')
|
||
s += 1
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
def process_frame(playlist, playFrame, playindex, select, select_status, times, cache, frame_dict, playend, rod, hua):
|
||
# playlist.append('/home/jcen/Videos/[J2] 銀魂 002.rmvb')
|
||
# print(playlist)
|
||
f = 1
|
||
op = times.value
|
||
mov = select.value
|
||
while True:
|
||
if mov == (len(playlist)-0):
|
||
if not playend.value:
|
||
select_status.value = 0
|
||
mov = select.value
|
||
op = times.value
|
||
f = times.value
|
||
cap.release()
|
||
frame_dict.clear()
|
||
continue
|
||
playindex.value = mov
|
||
# print(select.value, mov)
|
||
# if select.value != mov and select_status.value:
|
||
# cap.release()
|
||
# mov = select.value
|
||
# frame_dict.clear()
|
||
# # select_status.value = 0
|
||
# if time.value != op:
|
||
# cap.release()
|
||
# op = time.value
|
||
# f = time.value
|
||
# playFrame.value = time.value
|
||
# frame_dict.clear()
|
||
# print(time.value, op, playFrame.value, len(frame_dict), mov)
|
||
# print(mov, select.value, playlist[mov], frame_dict.keys())
|
||
# print('op' ,op, playindex.value)
|
||
# for s, n in enumerate(List[:]):
|
||
# if frams != 0:
|
||
# # print('dsds')
|
||
# for j in range(f, frams):
|
||
# # print(j ,'lllllll')
|
||
# frame_dict[j] = None
|
||
cap = cv2.VideoCapture(playlist[mov])
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
cap.set(cv2.CAP_PROP_POS_FRAMES, op)
|
||
|
||
# print('cap', frameNum)
|
||
while cap.isOpened():
|
||
if rod.value:
|
||
continue
|
||
# # print(playFrame.value, f, len(frame_dict), 'dfdfdfdfdfd')
|
||
if select_status.value and hua.value == 0:
|
||
# time.sleep(3)
|
||
# print('sssss', select.value, time.value, select_status.value)
|
||
select_status.value = 0
|
||
mov = select.value
|
||
op = times.value
|
||
f = times.value
|
||
cap.release()
|
||
frame_dict.clear()
|
||
break
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# if frameNum < 220:
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# # if abs(f - playFrame.value) == 100:
|
||
# # if playFrame.value > 50:
|
||
# # if abs(f - playFrame.value) == 100:
|
||
# # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# # frame_dict[f] = frame
|
||
# # f += 1
|
||
# # else:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# cache.value = len(frame_dict) + playFrame.value
|
||
# # elif f < 100:
|
||
# # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# # frame_dict[f] = frame
|
||
# # f += 1
|
||
# else:
|
||
# mov += 1
|
||
# op = 0
|
||
# break
|
||
|
||
if len(frame_dict) < 120:
|
||
ret, frame = cap.read()
|
||
if ret:
|
||
|
||
# if abs(f - playFrame.value) == 100:
|
||
# if playFrame.value > 50:
|
||
# if abs(f - playFrame.value) == 100:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# else:
|
||
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
frame_dict[f] = frame
|
||
f += 1
|
||
cache.value = len(frame_dict) + playFrame.value
|
||
# print('duqu')
|
||
# print('ret', ret, f, len(frame_dict))
|
||
# elif f < 100:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
else:
|
||
# print('else', op, playindex.value)
|
||
if mov == (len(playlist)-1):
|
||
playend.value = 1
|
||
mov += 1
|
||
op = 0
|
||
break
|
||
else:
|
||
continue
|
||
|
||
|
||
|
||
# frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
# frams = frameNum
|
||
# info_dict[s] = frameNum
|
||
# for i in range(frameNum):
|
||
# while True:
|
||
# if abs(f - playFrame.value) == 100:
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# else:
|
||
# continue
|
||
|
||
|
||
class Window(QLabel):
|
||
def __init__(self):
|
||
super(Window, self).__init__()
|
||
|
||
|
||
self.select_ = None
|
||
# time.sleep(3)
|
||
manager = Manager()
|
||
self.cacheFrames = manager.dict()
|
||
manager = Manager()
|
||
self.cacheInfo = manager.dict()
|
||
manager = Manager()
|
||
self.playFrame = manager.Value('i', 1)
|
||
self.n_playFrame = manager.Value('i', 1)
|
||
self.playindex = manager.Value('i', 0)
|
||
self.playindexing = manager.Value('i', 0)
|
||
self.select = manager.Value('i', 0)
|
||
self.select_status = manager.Value('i', 0)
|
||
self.tiems = manager.Value('i', 0)
|
||
self.cache = manager.Value('i', 0)
|
||
self.playList = manager.list()
|
||
self.playend = manager.Value('i', 0)
|
||
self.rod = manager.Value('i', 0)
|
||
self.test = manager.Value('i', 0)
|
||
self.hua = manager.Value('i', 0)
|
||
self.playInit = manager.dict()
|
||
import os
|
||
for s, i in enumerate(os.listdir('/home/jcen/Videos/新建文件夹')):
|
||
if i.split('.')[-1] in ['rmvb', 'mp4', 'mov']:
|
||
self.playList.append(os.path.join(r'/home/jcen/Videos/新建文件夹', i))
|
||
print(self.playList)
|
||
# self.playList.pop(0)
|
||
# self.playList.append('/home/jcen/Videos/新建文件夹/[J2] 銀魂 002.rmvb')
|
||
# manager = Manager()
|
||
# self.buff = manager.dict()
|
||
# self.generate_number1()
|
||
|
||
# self.cacheInfo = {}
|
||
self.setAlignment(Qt.AlignCenter)
|
||
self.resize(1280, 720)
|
||
self.cap = cv2.VideoCapture(r"/home/jcen/Videos/[J2] 銀魂 002.rmvb")
|
||
self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
||
fps = self.cap.get(cv2.CAP_PROP_FPS)
|
||
self.get()
|
||
# self.timer = QTimer()
|
||
# self.timer1 = QTimer()
|
||
# self.timer.setInterval(1000 // fps) # 设置定时器间隔,以确保每秒触发24次
|
||
# self.timer.timeout.connect(self.generate_number) # 连接定时器的timeout信号到生成数字的槽函数
|
||
|
||
# time.sleep(5)
|
||
for i in range(1):
|
||
self.p = Process(target=process_frame, args=(self.playList, self.playFrame, self.playindex, self.select, self.select_status, self.tiems, self.cache, self.cacheFrames, self.playend, self.rod, self.hua))
|
||
self.p.start()
|
||
# self.ps = Process(target=play_audios, args=(self.playList, self.playindex, self.test))
|
||
|
||
# time.sleep(2)
|
||
# self.timer.start()
|
||
# self.ps.start()
|
||
# self.timer1.start()
|
||
# self.sss = Get(self.cache)
|
||
# self.sss.start()
|
||
|
||
self.yy = PlayAudio(self.playList, self.playFrame, self.playindex, self.test, self.n_playFrame, self.tiems, self.cacheFrames)
|
||
self.yy.frame.connect(self.generate_number)
|
||
self.yy.start()
|
||
|
||
@pyqtSlot()
|
||
def generate_number(self):
|
||
# print(self.playend.value, self.playFrame.value , self.playInit[self.playInit.keys()[-1]][-1][-1]+1)
|
||
# print(len(self.cacheFrames.keys()), self.playFrame.value , self.playFrame.value in self.cacheFrames, len(self.cacheFrames.keys()),self.cacheFrames.keys() )
|
||
if self.playFrame.value >= self.playInit[self.playInit.keys()[-1]][-1][-1]+1:
|
||
# print('end', self.playFrame.value, self.cacheFrames.keys())
|
||
self.p.terminate()
|
||
self.cacheFrames.clear()
|
||
print('dsdsdsdsdsds')
|
||
return
|
||
# if self.test.value:
|
||
# # print(self.playFrame.value, self.test.value)
|
||
# self.playFrame.value += self.test.value - 1
|
||
# # if self.counter/1000 == 0:
|
||
# # # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
# self.h, self.w, ch = frame.shape
|
||
# bytesPerLine = ch * self.w
|
||
# # frame = cv2.resize(frame, (1280, 720))
|
||
# qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
# self.setPixmap(pixmap)
|
||
# # del frame
|
||
# # del pixmap
|
||
# # del qImg
|
||
# if self.playFrame.value-self.tiems.value > 50 and len(self.cacheFrames) >50:
|
||
# # # print(self.playFrame.value-self.tiems.value, self.playFrame.value-300)
|
||
# self.cacheFrames.pop(self.playFrame.value-51)
|
||
# return
|
||
if self.playFrame.value not in self.cacheFrames:
|
||
if len(self.cacheFrames.keys()) and not self.playend.value:
|
||
try:
|
||
if self.playFrame.value > self.cacheFrames.keys()[-1]:
|
||
self.playFrame.value = self.cacheFrames.keys()[0]
|
||
elif self.playFrame.value < self.cacheFrames.keys()[0]:
|
||
self.playFrame.value = self.cacheFrames.keys()[0]
|
||
except:
|
||
self.playFrame.value = self.tiems.value
|
||
|
||
# print(self.playFrame.value, 'sssssssssssssss', sum([self.cacheInfo[i] for i in range(self.playindexing.value)]), self.playindexing.value)
|
||
return
|
||
if self.playFrame.value in self.cacheFrames:
|
||
try:
|
||
frame = self.cacheFrames[self.playFrame.value]
|
||
except:
|
||
return
|
||
# if self.counter/1000 == 0:
|
||
# # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
self.setPixmap(pixmap)
|
||
# file_path = "%s_%s.jpg" % (self.playList[self.playindexing], self.playFrame.value) # 保存图片的文件路径
|
||
#
|
||
# # 保存QImage对象为图片文件
|
||
# qImg.save(file_path)
|
||
# del frame
|
||
# del pixmap
|
||
# del qImg
|
||
# print('key1')
|
||
if self.playFrame.value-self.tiems.value > 50 and len(self.cacheFrames) > 50 and self.playFrame.value-51 in self.cacheFrames.keys():
|
||
# print(self.playFrame.value, self.cacheFrames.keys())
|
||
self.cacheFrames.pop(self.cacheFrames.keys()[0])
|
||
if self.playindexing.value == 0:
|
||
if self.playFrame.value > self.cacheInfo[self.playindexing.value]:
|
||
self.playindexing.value += 1
|
||
elif self.playindexing.value == len(self.cacheInfo.keys())-1:
|
||
pass
|
||
else:
|
||
if self.playFrame.value > sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]):
|
||
self.playindexing.value += 1
|
||
# print('z', sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))
|
||
# elif self.playFrame.value > sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]):
|
||
# print('z', sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]))
|
||
# self.playindexing.value += 1
|
||
if self.playindexing.value == 0:
|
||
# print('当前帧0',
|
||
# self.playindexing.value, self.playFrame.value,
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# self.playFrame.value)
|
||
self.n_playFrame.value = self.playFrame.value
|
||
dframe = self.playFrame.value
|
||
zframe = self.playFrame.value
|
||
else:
|
||
if self.playFrame.value < sum([self.cacheInfo[i] for i in range(self.playindexing.value)]):
|
||
pass
|
||
# print('当前帧点击',
|
||
# '\n播放',self.playindexing.value,
|
||
# '\n当前',self.playFrame.value,
|
||
# '\n总',sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# '\n总帧', self.playFrame.value + sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
# )
|
||
self.n_playFrame.value = self.playFrame.value + 1
|
||
dframe = self.playFrame.value + 1
|
||
zframe = self.playFrame.value + sum([self.cacheInfo[i] for i in range(self.playindexing.value)]) + 1
|
||
else:
|
||
# print('当前帧1',
|
||
# '\n播放',self.playindexing.value,
|
||
# '\n帧',self.playFrame.value,
|
||
# '\n总',sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# '\n当前',self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
# )
|
||
self.n_playFrame.value = self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
dframe = self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
zframe = self.playFrame.value
|
||
# if self.playFrame.value != abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))):
|
||
# print('当前帧1', self.playindexing.value, self.playFrame.value, (sum([self.cacheInfo[i] for i in range(self.playindexing.value)])), sum([self.cacheInfo[i] for i in range(self.playindexing.value)]), abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))))
|
||
# else:
|
||
# print('当前帧1', self.playindexing.value, self.playFrame.value,
|
||
# (sum([self.cacheInfo[i] for i in range(self.playindexing.value)])),
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]) - abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))))
|
||
# print(self.playFrame.value)
|
||
# print('\n实际播放', self.playFrame.value, '\n播放',self.playindexing.value, '\n当前帧', dframe, '\n总的当前帧', zframe, '\n镜头帧', self.n_playFrame.value)
|
||
self.playFrame.value += 1
|
||
# print(self.playFrame.value)
|
||
|
||
|
||
def generate_number1(self):
|
||
|
||
s = Process(target=play_audio)
|
||
s.start()
|
||
|
||
def get(self):
|
||
p = 1
|
||
ps = 1
|
||
for s, n in enumerate(self.playList):
|
||
cap = cv2.VideoCapture(n)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
frameNum1 = frameNum + ps
|
||
self.cacheInfo[s] = frameNum
|
||
self.playInit[s] = [[1, frameNum], [ps, frameNum1]]
|
||
ps = frameNum1 + 1
|
||
print(self.playInit.items())
|
||
|
||
def mousePressEvent(self, ev):
|
||
# self.timer.stop()
|
||
# if True:
|
||
# return
|
||
if ev.button() == Qt.LeftButton:
|
||
# # print("Left mouse button pressed")
|
||
# # i = random.randint(0, len(self.playList)-1)
|
||
# # self.select_ = i
|
||
#
|
||
#
|
||
# # # s = random.randint(0, self.cacheInfo[i])
|
||
x = ev.pos().x()
|
||
frames = int(float(x) / self.width() * self.playInit[self.playInit.keys()[-1]][-1][-1])
|
||
# print(frames)
|
||
# # self.select_status.value = 1
|
||
# # print('select', i, ip, self.cacheInfo[i])
|
||
# # # print(len(self.cacheFrames.keys()), self.playFrame.value, self.playFrame.value in self.cacheFrames,
|
||
# # # self.cacheFrames.keys())
|
||
#
|
||
# # frames = random.randint(0, self.playInit[3][1][1])
|
||
print(frames)
|
||
try:
|
||
print(self.playInit[self.playInit.keys()[-1]][-1][-1])
|
||
except:
|
||
pass
|
||
if get(frames, self.playInit):
|
||
sele = get(frames, self.playInit)
|
||
print(sele)
|
||
# if frames in self.cacheFrames:
|
||
# # if self.counter/1000 == 0:
|
||
# # # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[frames]
|
||
# self.h, self.w, ch = frame.shape
|
||
# bytesPerLine = ch * self.w
|
||
# # frame = cv2.resize(frame, (1280, 720))
|
||
# qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# # 假设qImg是您的QImage对象
|
||
# file_path = "%s_%s.jpg" % (sele[-1], frames) # 保存图片的文件路径
|
||
#
|
||
# # 保存QImage对象为图片文件
|
||
# qImg.save(file_path)
|
||
# # print('stop')
|
||
#
|
||
|
||
self.select_status.value = 1
|
||
self.select_ = sele[0]
|
||
self.select.value = sele[0]
|
||
self.tiems.value = sele[-1] -1
|
||
self.playFrame.value = sele[-1] -1
|
||
self.playend.value = 0
|
||
self.playindexing.value = sele[0]
|
||
# print(self.select.value, self.tiems.value, self.playFrame.value, self.playindexing.value)
|
||
# # if not self.timer.isActive():
|
||
# # self.timer.start()
|
||
time.sleep(2)
|
||
print(frames, sele[-1], self.cacheFrames.keys())
|
||
if sele[-1]-1 in self.cacheFrames:
|
||
# if self.counter/1000 == 0:
|
||
# # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
frame = self.cacheFrames[sele[-1]-1]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# 假设qImg是您的QImage对象
|
||
print('保存',self.playList, self.select.value, self.playList[self.select.value])
|
||
file_path = "%s_%s_%s.jpg" % (self.playList[self.select.value].split('/')[-1], sele[-1], frames) # 保存图片的文件路径
|
||
|
||
# 保存QImage对象为图片文件
|
||
qImg.save(file_path)
|
||
|
||
# # print("Left mouse button pressed")
|
||
# i = random.randint(0, len(self.playList) - 1)
|
||
# self.select_ = i
|
||
# # s = random.randint(0, self.cacheInfo[i])
|
||
# x = ev.pos().x()
|
||
# ip = int(float(x) / self.width() * self.cacheInfo[i])
|
||
# self.select_status.value = 1
|
||
# print('select', i, ip, self.cacheInfo[i])
|
||
# # print(len(self.cacheFrames.keys()), self.playFrame.value, self.playFrame.value in self.cacheFrames,
|
||
# # self.cacheFrames.keys())
|
||
# self.select.value = i
|
||
# self.tiems.value = ip
|
||
# self.playFrame.value = ip
|
||
# self.playend.value = 0
|
||
# self.playindexing.value = i
|
||
# print('select', i, ip, self.cacheInfo[i])
|
||
# print(self.select.value, self.tiems.value, self.playFrame.value, self.playindexing.value)
|
||
# # if not self.timer.isActive():
|
||
# # self.timer.start()
|
||
|
||
elif ev.button() == Qt.RightButton:
|
||
# print("Right mouse button pressed")
|
||
if self.yy.timer.isActive():
|
||
self.yy.timer.stop()
|
||
# print(self.playInit[3])
|
||
|
||
else:
|
||
# print('start')
|
||
self.yy.timer.start()
|
||
|
||
def mouseMoveEvent(self, ev):
|
||
# self.yy.timer.stop()
|
||
# # x = ev.pos().x()
|
||
# # ip = int(float(x) / self.width() * self.cacheInfo[self.select_])
|
||
# # self.select_status.value = 1
|
||
# # print('select', self.select_, ip, self.cacheInfo[self.select_])
|
||
# # self.tiems.value = ip - 1
|
||
# # self.playFrame.value = ip - 1
|
||
# # self.hua.value = 1
|
||
# # print(self.cacheFrames.keys())
|
||
# if self.playFrame.value in self.cacheFrames:
|
||
# # if self.counter/1000 == 0:
|
||
# # # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
# self.h, self.w, ch = frame.shape
|
||
# bytesPerLine = ch * self.w
|
||
# # frame = cv2.resize(frame, (1280, 720))
|
||
# qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
# self.setPixmap(pixmap)
|
||
super().mouseMoveEvent(ev)
|
||
|
||
def mouseReleaseEvent(self, ev):
|
||
# self.hua.value = 0
|
||
print(self.playList[self.select.value])
|
||
cap = cv2.VideoCapture(self.playList[self.select.value])
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
self.yy.set(fps)
|
||
# time.sleep(1)
|
||
self.yy.timer.start()
|
||
super().mouseReleaseEvent(ev)
|
||
|
||
def mouseDoubleClickEvent(self, a0):
|
||
if self.rod.value:
|
||
self.rod.value = 0
|
||
else:
|
||
self.rod.value = 1
|
||
super().mouseDoubleClickEvent(a0)
|
||
|
||
def closeEvent(self, a0):
|
||
# self.yy.terminate()
|
||
# self.yy.deleteLater()
|
||
|
||
# self.p.terminate()
|
||
self.p.join()
|
||
# self.p.close()
|
||
# self.p.kill()
|
||
|
||
# self.yy.p.terminate()
|
||
self.yy.p.join()
|
||
# self.yy.p.close()
|
||
# self.yy.p.kill()
|
||
super().closeEvent(a0)
|
||
# sys.exit()
|
||
|
||
|
||
class Get(QThread):
|
||
num = pyqtSignal(int)
|
||
|
||
def __init__(self, cache=None):
|
||
super(Get, self).__init__()
|
||
|
||
self.cache = cache
|
||
|
||
def run(self) -> None:
|
||
while True:
|
||
self.cache.value
|
||
|
||
|
||
if __name__ == '__main__':
|
||
freeze_support()
|
||
app = QApplication([])
|
||
widget = Window()
|
||
widget.show()
|
||
# cap = cv2.VideoCapture('/home/jcen/Videos/[J2] 銀魂 002.rmvb')
|
||
# frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
# print(frameNum)
|
||
app.exec_()
|
||
|
||
|
||
# +++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
import random
|
||
import threading
|
||
import time
|
||
import cv2
|
||
from PyQt5.QtGui import *
|
||
from PyQt5.QtCore import *
|
||
from PyQt5.QtWidgets import *
|
||
import sys
|
||
from multiprocessing import Process, Manager, Value, freeze_support
|
||
from PyQt5.QtCore import QThread, pyqtSignal
|
||
from PyQt5.QtWidgets import QApplication
|
||
import pyaudio
|
||
from moviepy.editor import VideoFileClip
|
||
|
||
|
||
def get(frame, data):
|
||
for key, value in data.items():
|
||
if frame in list(range(value[1][0], value[1][1] + 1)):
|
||
if key == 0:
|
||
return key, value[0], frame - value[1][0] + 1
|
||
else:
|
||
return key, value[0], frame - value[1][0]
|
||
|
||
def play_audioss(path=None, frame=None, event=None, time_=None, au_if=None, start_time=0):
|
||
while True:
|
||
if path:
|
||
video = VideoFileClip(path)
|
||
audio = video.audio
|
||
if not audio:
|
||
au_if.value = 0
|
||
continue
|
||
cap = cv2.VideoCapture(path)
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
else:
|
||
video = VideoFileClip("[J2] 銀魂 002.rmvb")
|
||
audio = video.audio
|
||
if not audio:
|
||
au_if.value = 0
|
||
continue
|
||
cap = cv2.VideoCapture("[J2] 銀魂 002.rmvb")
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
|
||
|
||
p = pyaudio.PyAudio()
|
||
rat = audio.fps
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=rat,
|
||
output=True)
|
||
# 计算开始位置的帧数
|
||
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
# 逐帧播放音频
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if i >= start_frame:
|
||
fr = int(rat/fps)
|
||
if (i % fr) == 0:
|
||
if i == 0:
|
||
# print('event', i)
|
||
event.value = 1
|
||
time.sleep(1.5)
|
||
else:
|
||
time_.value = i
|
||
frame.value += 1
|
||
if (i % rat) == 0:
|
||
# print('miao', s)
|
||
s += 1
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
class T(QThread):
|
||
frame = pyqtSignal()
|
||
def __init__(self, n_playframe=None, frames1=None, playframe=None, time=None, cache=None):
|
||
super().__init__()
|
||
|
||
self.cache = cache
|
||
self.n_playframe = n_playframe
|
||
self.frames1 = frames1
|
||
self.playframe = playframe
|
||
self.time = time
|
||
|
||
def run(self):
|
||
while True:
|
||
# print('bububuubub')
|
||
if self.playframe.value in self.cache.keys():
|
||
if self.playframe.value < self.frames1.value - 1:
|
||
self.playframe.value += 1
|
||
elif self.playframe.value > self.frames1.value:
|
||
self.playframe.value -= 1
|
||
else:
|
||
if self.playframe.value < self.frames1.value - 1:
|
||
self.playframe.value += 1
|
||
elif self.playframe.value > self.frames1.value:
|
||
self.playframe.value -= 1
|
||
# self.time.value = self.playframe.value
|
||
# for i in range(2):
|
||
# pass
|
||
# # print(1111, self.n_playframe.value, self.frames1.value)
|
||
# # self.frame.emit()
|
||
# self.n_playframe.value = self.frames1.value
|
||
|
||
|
||
class PlayAudio(QThread):
|
||
frame = pyqtSignal()
|
||
|
||
def __init__(self, playlist, playframe, select, test, n_playframe, time, cache, start_time=0):
|
||
super().__init__()
|
||
|
||
self.cache = cache
|
||
self.playlist = playlist
|
||
self.playframe = playframe
|
||
self.n_playframe = n_playframe
|
||
self.time = time
|
||
self.select = select
|
||
self.test = test
|
||
self.start_time = start_time
|
||
self.timer = QTimer()
|
||
cap = cv2.VideoCapture(self.playlist[self.select.value])
|
||
self.fps = cap.get(cv2.CAP_PROP_FPS)
|
||
print(self.fps)
|
||
self.timer.setInterval(1000 // self.fps)
|
||
self.timer.timeout.connect(self.Es)
|
||
# self.timer.start()
|
||
self.audio = None
|
||
self.stream = None
|
||
self.buffer = []
|
||
self.sss = False
|
||
self.au_event = Manager().Value("i", 0)
|
||
self.frames = Manager().Value("i", 0)
|
||
self.frames1 = Manager().Value("i", 0)
|
||
self.frames2 = 0
|
||
self.au_time = Manager().Value("i", 0)
|
||
self.if_au = Manager().Value("i", 1)
|
||
if not self.sss:
|
||
self.p = Process(target=play_audioss, args=(self.playlist[self.select.value], self.frames, self.au_event, self.au_time, self.if_au))
|
||
self.p.start()
|
||
#
|
||
# self.p = threading.Thread(target=play_audioss, args=(self.playlist[self.select.value], self.frames, self.au_event, self.au_time, self.if_au))
|
||
# self.p.start()
|
||
|
||
self.t = T(self.n_playframe, self.frames1, self.playframe, self.time, self.cache)
|
||
self.t.frame.connect(self.Es)
|
||
while True:
|
||
if self.sss:
|
||
self.timer.start()
|
||
break
|
||
if self.au_event.value:
|
||
# self.timer.start()
|
||
self.frame.emit()
|
||
self.playframe.value += 1
|
||
self.t.start()
|
||
self.au_event.value = 0
|
||
break
|
||
elif self.if_au.value == 0:
|
||
self.timer.start()
|
||
break
|
||
|
||
def set(self, fps):
|
||
# self.timer.stop()
|
||
self.timer.setInterval(1000 // int(fps))
|
||
# self.timer.start()
|
||
|
||
# def run(self):
|
||
# index = None
|
||
# p = None
|
||
# if self.sss:
|
||
# return
|
||
# # while True:
|
||
# # # print(self.select.value)
|
||
# # # print(self.playlist[self.select.value])
|
||
# # if index != self.select.value:
|
||
# # if self.stream:
|
||
# # self.stream.close()
|
||
# # self.buffer = []
|
||
# # self.audio = None
|
||
# # self.stream = None
|
||
# # # if p:
|
||
# # # print('clor')
|
||
# # # p.terminate()
|
||
# #
|
||
# # index = self.select.value
|
||
# # video = VideoFileClip(self.playlist[self.select.value])
|
||
# # self.audio = video.audio
|
||
# # if self.audio:
|
||
# # rat = self.audio.fps
|
||
# #
|
||
# # p = pyaudio.PyAudio()
|
||
# # # 创建输出流
|
||
# # self.stream = p.open(format=pyaudio.paFloat32,
|
||
# # channels= self.audio.nchannels,
|
||
# # rate=rat,
|
||
# # output=True)
|
||
# # # print(playlist[select.value])
|
||
# # # 计算开始位置的帧数
|
||
# # start_frame = self.start_time
|
||
# #
|
||
# # # print(rat, 'rat')
|
||
# # # 设置缓冲区大小
|
||
# # buffer_size = 1024
|
||
# # else:
|
||
# # # print('play')
|
||
# #
|
||
# # if self.audio:
|
||
# # for i, chunk in enumerate(self.audio.iter_frames(with_times=False)):
|
||
# # # print(i)
|
||
# # fr = int(rat/self.fps)
|
||
# # if (i % fr) == 0:
|
||
# # pass
|
||
# # # print('dddddddddddddd')
|
||
# # # self.frame.emit()
|
||
# # # print(self.cou)
|
||
# # if i >= start_frame:
|
||
# # self.buffer.append(chunk.astype('float32').tostring())
|
||
# # if len(self.buffer) >= buffer_size:
|
||
# # self.stream.write(b''.join(self.buffer))
|
||
# # self.buffer = []
|
||
# # # print(stream.get_time())
|
||
# # # 写入剩余数据
|
||
# # if self.buffer:
|
||
# # self.stream.write(b''.join(self.buffer))
|
||
# # p.terminate()
|
||
|
||
def run(self):
|
||
while True:
|
||
if self.frames1.value != self.frames.value:
|
||
self.frames1.value = self.frames.value
|
||
self.playframe.value += 1
|
||
# print('相差', self.frames.value, self.playframe.value)
|
||
|
||
# print(self.frames1)
|
||
self.frame.emit()
|
||
# print('run')
|
||
# self.playframe.
|
||
|
||
def Es(self):
|
||
pass
|
||
# print('es')
|
||
# self.terminate()
|
||
# while True:
|
||
# if abs(self.frames1 - self.n_playframe.value):
|
||
# for i in range(abs(self.frames1 - self.n_playframe.value)):
|
||
# print(1111)
|
||
self.frame.emit()
|
||
# if not self.if_au.value:
|
||
# self.frame.emit()
|
||
# return
|
||
# self.frames2 += 1
|
||
# if self.frames1 != self.frames2:
|
||
# print(self.frames1, self.frames2, self.frames.value, self.au_time)
|
||
# self.frame.emit()
|
||
# if self.audio:
|
||
# return
|
||
# if self.frames1 != self.frames.value:
|
||
# return
|
||
# self.frame.emit()
|
||
# while True:
|
||
|
||
|
||
def play(playFrame, buff):
|
||
p = pyaudio.PyAudio()
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
while True:
|
||
# # print(playFrame.value, 'bdddd')
|
||
# if playFrame.value%25 == 0:
|
||
stream.write(b''.join(buff[int(playFrame.value)]))
|
||
# # print(self.playFrame.value, dir(self.buff), self.buff.keys())
|
||
|
||
|
||
def play_audios(playlist, select, test, start_time=0):
|
||
|
||
index = None
|
||
p = None
|
||
while True:
|
||
|
||
# print(playlist[select.value])
|
||
if index != select.value:
|
||
if p:
|
||
p.terminate()
|
||
index = select.value
|
||
video = VideoFileClip(playlist[select.value])
|
||
audio = video.audio
|
||
p = pyaudio.PyAudio()
|
||
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
# print(playlist[select.value])
|
||
# 计算开始位置的帧数
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
else:
|
||
# print('play')
|
||
|
||
if audio:
|
||
o = 0
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if (i%1764) == 0:
|
||
test.value = o
|
||
o += 1
|
||
# print(o)
|
||
if i >= start_frame:
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
def play_audio(path=None, start_time=0):
|
||
if path:
|
||
video = VideoFileClip(path)
|
||
else:
|
||
video = VideoFileClip("[J2] 銀魂 002.rmvb")
|
||
audio = video.audio
|
||
p = pyaudio.PyAudio()
|
||
|
||
# 创建输出流
|
||
stream = p.open(format=pyaudio.paFloat32,
|
||
channels=2,
|
||
rate=44100,
|
||
output=True)
|
||
# 计算开始位置的帧数
|
||
start_frame = start_time
|
||
# 设置缓冲区大小
|
||
buffer_size = 1024
|
||
buffer = []
|
||
s = 0
|
||
# 逐帧播放音频
|
||
for i, chunk in enumerate(audio.iter_frames(with_times=False)):
|
||
# print(i)
|
||
if i >= start_frame:
|
||
if i % (44100 / 25) == 0:
|
||
print(s, 'miao')
|
||
s += 1
|
||
buffer.append(chunk.astype('float32').tostring())
|
||
if len(buffer) >= buffer_size:
|
||
stream.write(b''.join(buffer))
|
||
buffer = []
|
||
# print(stream.get_time())
|
||
# 写入剩余数据
|
||
if buffer:
|
||
stream.write(b''.join(buffer))
|
||
p.terminate()
|
||
|
||
|
||
def process_frame(playlist, playFrame, playindex, select, select_status, times, cache, frame_dict, playend, rod, hua):
|
||
# playlist.append('/home/jcen/Videos/[J2] 銀魂 002.rmvb')
|
||
# print(playlist)
|
||
f = 1
|
||
op = times.value
|
||
mov = select.value
|
||
while True:
|
||
if mov == (len(playlist)-0):
|
||
if not playend.value:
|
||
select_status.value = 0
|
||
mov = select.value
|
||
op = times.value
|
||
f = times.value
|
||
cap.release()
|
||
frame_dict.clear()
|
||
continue
|
||
playindex.value = mov
|
||
# print(select.value, mov)
|
||
# if select.value != mov and select_status.value:
|
||
# cap.release()
|
||
# mov = select.value
|
||
# frame_dict.clear()
|
||
# # select_status.value = 0
|
||
# if time.value != op:
|
||
# cap.release()
|
||
# op = time.value
|
||
# f = time.value
|
||
# playFrame.value = time.value
|
||
# frame_dict.clear()
|
||
# print(time.value, op, playFrame.value, len(frame_dict), mov)
|
||
# print(mov, select.value, playlist[mov], frame_dict.keys())
|
||
# print('op' ,op, playindex.value)
|
||
# for s, n in enumerate(List[:]):
|
||
# if frams != 0:
|
||
# # print('dsds')
|
||
# for j in range(f, frams):
|
||
# # print(j ,'lllllll')
|
||
# frame_dict[j] = None
|
||
cap = cv2.VideoCapture(playlist[mov])
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
cap.set(cv2.CAP_PROP_POS_FRAMES, op)
|
||
|
||
# print('cap', frameNum)
|
||
while cap.isOpened():
|
||
if rod.value:
|
||
continue
|
||
# # print(playFrame.value, f, len(frame_dict), 'dfdfdfdfdfd')
|
||
if select_status.value and hua.value == 0:
|
||
# time.sleep(3)
|
||
# print('sssss', select.value, time.value, select_status.value)
|
||
select_status.value = 0
|
||
mov = select.value
|
||
op = times.value
|
||
f = times.value
|
||
cap.release()
|
||
frame_dict.clear()
|
||
break
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# if frameNum < 220:
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# # if abs(f - playFrame.value) == 100:
|
||
# # if playFrame.value > 50:
|
||
# # if abs(f - playFrame.value) == 100:
|
||
# # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# # frame_dict[f] = frame
|
||
# # f += 1
|
||
# # else:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# cache.value = len(frame_dict) + playFrame.value
|
||
# # elif f < 100:
|
||
# # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# # frame_dict[f] = frame
|
||
# # f += 1
|
||
# else:
|
||
# mov += 1
|
||
# op = 0
|
||
# break
|
||
|
||
if len(frame_dict) < 120:
|
||
ret, frame = cap.read()
|
||
if ret:
|
||
|
||
# if abs(f - playFrame.value) == 100:
|
||
# if playFrame.value > 50:
|
||
# if abs(f - playFrame.value) == 100:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# else:
|
||
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
frame_dict[f] = frame
|
||
f += 1
|
||
cache.value = len(frame_dict) + playFrame.value
|
||
# print('duqu')
|
||
# print('ret', ret, f, len(frame_dict))
|
||
# elif f < 100:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
else:
|
||
# print('else', op, playindex.value)
|
||
if mov == (len(playlist)-1):
|
||
playend.value = 1
|
||
mov += 1
|
||
op = 0
|
||
break
|
||
else:
|
||
continue
|
||
|
||
|
||
|
||
# frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
# frams = frameNum
|
||
# info_dict[s] = frameNum
|
||
# for i in range(frameNum):
|
||
# while True:
|
||
# if abs(f - playFrame.value) == 100:
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
|
||
# frame_dict[f] = frame
|
||
# f += 1
|
||
# else:
|
||
# continue
|
||
|
||
|
||
class Window(QLabel):
|
||
def __init__(self):
|
||
super(Window, self).__init__()
|
||
|
||
|
||
self.select_ = None
|
||
# time.sleep(3)
|
||
manager = Manager()
|
||
self.cacheFrames = manager.dict()
|
||
manager = Manager()
|
||
self.cacheInfo = manager.dict()
|
||
manager = Manager()
|
||
self.playFrame = manager.Value('i', 1)
|
||
self.n_playFrame = manager.Value('i', 1)
|
||
self.playindex = manager.Value('i', 0)
|
||
self.playindexing = manager.Value('i', 0)
|
||
self.select = manager.Value('i', 0)
|
||
self.select_status = manager.Value('i', 0)
|
||
self.tiems = manager.Value('i', 0)
|
||
self.cache = manager.Value('i', 0)
|
||
self.playList = manager.list()
|
||
self.playend = manager.Value('i', 0)
|
||
self.rod = manager.Value('i', 0)
|
||
self.test = manager.Value('i', 0)
|
||
self.hua = manager.Value('i', 0)
|
||
self.playInit = manager.dict()
|
||
import os
|
||
for s, i in enumerate(os.listdir('/home/jcen/Videos/新建文件夹')):
|
||
if i.split('.')[-1] in ['rmvb', 'mp4', 'mov']:
|
||
self.playList.append(os.path.join(r'/home/jcen/Videos/新建文件夹', i))
|
||
print(self.playList)
|
||
# self.playList.pop(0)
|
||
# self.playList.append('/home/jcen/Videos/新建文件夹/[J2] 銀魂 002.rmvb')
|
||
# manager = Manager()
|
||
# self.buff = manager.dict()
|
||
# self.generate_number1()
|
||
|
||
# self.cacheInfo = {}
|
||
self.setAlignment(Qt.AlignCenter)
|
||
self.resize(1280, 720)
|
||
self.cap = cv2.VideoCapture(r"/home/jcen/Videos/[J2] 銀魂 002.rmvb")
|
||
self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
||
fps = self.cap.get(cv2.CAP_PROP_FPS)
|
||
self.get()
|
||
# self.timer = QTimer()
|
||
# self.timer1 = QTimer()
|
||
# self.timer.setInterval(1000 // fps) # 设置定时器间隔,以确保每秒触发24次
|
||
# self.timer.timeout.connect(self.generate_number) # 连接定时器的timeout信号到生成数字的槽函数
|
||
|
||
# time.sleep(5)
|
||
for i in range(1):
|
||
self.p = Process(target=process_frame, args=(self.playList, self.playFrame, self.playindex, self.select, self.select_status, self.tiems, self.cache, self.cacheFrames, self.playend, self.rod, self.hua))
|
||
self.p.start()
|
||
# self.ps = Process(target=play_audios, args=(self.playList, self.playindex, self.test))
|
||
|
||
# time.sleep(2)
|
||
# self.timer.start()
|
||
# self.ps.start()
|
||
# self.timer1.start()
|
||
# self.sss = Get(self.cache)
|
||
# self.sss.start()
|
||
|
||
self.yy = PlayAudio(self.playList, self.playFrame, self.playindex, self.test, self.n_playFrame, self.tiems, self.cacheFrames)
|
||
self.yy.frame.connect(self.generate_number)
|
||
self.yy.start()
|
||
|
||
@pyqtSlot()
|
||
def generate_number(self):
|
||
# print(self.playend.value, self.playFrame.value , self.playInit[self.playInit.keys()[-1]][-1][-1]+1)
|
||
# print(len(self.cacheFrames.keys()), self.playFrame.value , self.playFrame.value in self.cacheFrames, len(self.cacheFrames.keys()),self.cacheFrames.keys() )
|
||
if self.playFrame.value >= self.playInit[self.playInit.keys()[-1]][-1][-1]+1:
|
||
# print('end', self.playFrame.value, self.cacheFrames.keys())
|
||
self.p.terminate()
|
||
self.cacheFrames.clear()
|
||
print('dsdsdsdsdsds')
|
||
return
|
||
# if self.test.value:
|
||
# # print(self.playFrame.value, self.test.value)
|
||
# self.playFrame.value += self.test.value - 1
|
||
# # if self.counter/1000 == 0:
|
||
# # # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
# self.h, self.w, ch = frame.shape
|
||
# bytesPerLine = ch * self.w
|
||
# # frame = cv2.resize(frame, (1280, 720))
|
||
# qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
# self.setPixmap(pixmap)
|
||
# # del frame
|
||
# # del pixmap
|
||
# # del qImg
|
||
# if self.playFrame.value-self.tiems.value > 50 and len(self.cacheFrames) >50:
|
||
# # # print(self.playFrame.value-self.tiems.value, self.playFrame.value-300)
|
||
# self.cacheFrames.pop(self.playFrame.value-51)
|
||
# return
|
||
if self.playFrame.value not in self.cacheFrames:
|
||
if len(self.cacheFrames.keys()) and not self.playend.value:
|
||
try:
|
||
if self.playFrame.value > self.cacheFrames.keys()[-1]:
|
||
self.playFrame.value = self.cacheFrames.keys()[0]
|
||
elif self.playFrame.value < self.cacheFrames.keys()[0]:
|
||
self.playFrame.value = self.cacheFrames.keys()[0]
|
||
except:
|
||
self.playFrame.value = self.tiems.value
|
||
|
||
# print(self.playFrame.value, 'sssssssssssssss', sum([self.cacheInfo[i] for i in range(self.playindexing.value)]), self.playindexing.value)
|
||
return
|
||
if self.playFrame.value in self.cacheFrames:
|
||
try:
|
||
frame = self.cacheFrames[self.playFrame.value]
|
||
except:
|
||
return
|
||
# if self.counter/1000 == 0:
|
||
# # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
self.setPixmap(pixmap)
|
||
# file_path = "%s_%s.jpg" % (self.playList[self.playindexing], self.playFrame.value) # 保存图片的文件路径
|
||
#
|
||
# # 保存QImage对象为图片文件
|
||
# qImg.save(file_path)
|
||
# del frame
|
||
# del pixmap
|
||
# del qImg
|
||
# print('key1')
|
||
if self.playFrame.value-self.tiems.value > 50 and len(self.cacheFrames) > 50 and self.playFrame.value-51 in self.cacheFrames.keys():
|
||
# print(self.playFrame.value, self.cacheFrames.keys())
|
||
self.cacheFrames.pop(self.cacheFrames.keys()[0])
|
||
if self.playindexing.value == 0:
|
||
if self.playFrame.value > self.cacheInfo[self.playindexing.value]:
|
||
self.playindexing.value += 1
|
||
elif self.playindexing.value == len(self.cacheInfo.keys())-1:
|
||
pass
|
||
else:
|
||
if self.playFrame.value > sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]):
|
||
self.playindexing.value += 1
|
||
# print('z', sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))
|
||
# elif self.playFrame.value > sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]):
|
||
# print('z', sum([self.cacheInfo[i] for i in range(self.playindexing.value + 1)]))
|
||
# self.playindexing.value += 1
|
||
if self.playindexing.value == 0:
|
||
# print('当前帧0',
|
||
# self.playindexing.value, self.playFrame.value,
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# self.playFrame.value)
|
||
self.n_playFrame.value = self.playFrame.value
|
||
dframe = self.playFrame.value
|
||
zframe = self.playFrame.value
|
||
else:
|
||
if self.playFrame.value < sum([self.cacheInfo[i] for i in range(self.playindexing.value)]):
|
||
pass
|
||
# print('当前帧点击',
|
||
# '\n播放',self.playindexing.value,
|
||
# '\n当前',self.playFrame.value,
|
||
# '\n总',sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# '\n总帧', self.playFrame.value + sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
# )
|
||
self.n_playFrame.value = self.playFrame.value + 1
|
||
dframe = self.playFrame.value + 1
|
||
zframe = self.playFrame.value + sum([self.cacheInfo[i] for i in range(self.playindexing.value)]) + 1
|
||
else:
|
||
# print('当前帧1',
|
||
# '\n播放',self.playindexing.value,
|
||
# '\n帧',self.playFrame.value,
|
||
# '\n总',sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# '\n当前',self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
# )
|
||
self.n_playFrame.value = self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
dframe = self.playFrame.value - sum([self.cacheInfo[i] for i in range(self.playindexing.value)])
|
||
zframe = self.playFrame.value
|
||
# if self.playFrame.value != abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))):
|
||
# print('当前帧1', self.playindexing.value, self.playFrame.value, (sum([self.cacheInfo[i] for i in range(self.playindexing.value)])), sum([self.cacheInfo[i] for i in range(self.playindexing.value)]), abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))))
|
||
# else:
|
||
# print('当前帧1', self.playindexing.value, self.playFrame.value,
|
||
# (sum([self.cacheInfo[i] for i in range(self.playindexing.value)])),
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]),
|
||
# sum([self.cacheInfo[i] for i in range(self.playindexing.value)]) - abs(self.playFrame.value - (sum([self.cacheInfo[i] for i in range(self.playindexing.value)]))))
|
||
# print(self.playFrame.value)
|
||
# print('\n实际播放', self.playFrame.value, '\n播放',self.playindexing.value, '\n当前帧', dframe, '\n总的当前帧', zframe, '\n镜头帧', self.n_playFrame.value)
|
||
self.playFrame.value += 1
|
||
# print(self.playFrame.value)
|
||
|
||
|
||
def generate_number1(self):
|
||
|
||
s = Process(target=play_audio)
|
||
s.start()
|
||
|
||
def get(self):
|
||
p = 1
|
||
ps = 1
|
||
for s, n in enumerate(self.playList):
|
||
cap = cv2.VideoCapture(n)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
frameNum1 = frameNum + ps
|
||
self.cacheInfo[s] = frameNum
|
||
self.playInit[s] = [[1, frameNum], [ps, frameNum1]]
|
||
ps = frameNum1 + 1
|
||
print(self.playInit.items())
|
||
|
||
def mousePressEvent(self, ev):
|
||
# self.timer.stop()
|
||
# if True:
|
||
# return
|
||
if ev.button() == Qt.LeftButton:
|
||
# # print("Left mouse button pressed")
|
||
# # i = random.randint(0, len(self.playList)-1)
|
||
# # self.select_ = i
|
||
#
|
||
#
|
||
# # # s = random.randint(0, self.cacheInfo[i])
|
||
x = ev.pos().x()
|
||
frames = int(float(x) / self.width() * self.playInit[self.playInit.keys()[-1]][-1][-1])
|
||
# print(frames)
|
||
# # self.select_status.value = 1
|
||
# # print('select', i, ip, self.cacheInfo[i])
|
||
# # # print(len(self.cacheFrames.keys()), self.playFrame.value, self.playFrame.value in self.cacheFrames,
|
||
# # # self.cacheFrames.keys())
|
||
#
|
||
# # frames = random.randint(0, self.playInit[3][1][1])
|
||
print(frames)
|
||
try:
|
||
print(self.playInit[self.playInit.keys()[-1]][-1][-1])
|
||
except:
|
||
pass
|
||
if get(frames, self.playInit):
|
||
sele = get(frames, self.playInit)
|
||
print(sele)
|
||
# if frames in self.cacheFrames:
|
||
# # if self.counter/1000 == 0:
|
||
# # # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[frames]
|
||
# self.h, self.w, ch = frame.shape
|
||
# bytesPerLine = ch * self.w
|
||
# # frame = cv2.resize(frame, (1280, 720))
|
||
# qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# # 假设qImg是您的QImage对象
|
||
# file_path = "%s_%s.jpg" % (sele[-1], frames) # 保存图片的文件路径
|
||
#
|
||
# # 保存QImage对象为图片文件
|
||
# qImg.save(file_path)
|
||
# # print('stop')
|
||
#
|
||
|
||
self.select_status.value = 1
|
||
self.select_ = sele[0]
|
||
self.select.value = sele[0]
|
||
self.tiems.value = sele[-1] -1
|
||
self.playFrame.value = sele[-1] -1
|
||
self.playend.value = 0
|
||
self.playindexing.value = sele[0]
|
||
# print(self.select.value, self.tiems.value, self.playFrame.value, self.playindexing.value)
|
||
# # if not self.timer.isActive():
|
||
# # self.timer.start()
|
||
time.sleep(2)
|
||
print(frames, sele[-1], self.cacheFrames.keys())
|
||
if sele[-1]-1 in self.cacheFrames:
|
||
# if self.counter/1000 == 0:
|
||
# # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
frame = self.cacheFrames[sele[-1]-1]
|
||
self.h, self.w, ch = frame.shape
|
||
bytesPerLine = ch * self.w
|
||
# frame = cv2.resize(frame, (1280, 720))
|
||
qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# 假设qImg是您的QImage对象
|
||
print('保存',self.playList, self.select.value, self.playList[self.select.value])
|
||
file_path = "%s_%s_%s.jpg" % (self.playList[self.select.value].split('/')[-1], sele[-1], frames) # 保存图片的文件路径
|
||
|
||
# 保存QImage对象为图片文件
|
||
qImg.save(file_path)
|
||
|
||
# # print("Left mouse button pressed")
|
||
# i = random.randint(0, len(self.playList) - 1)
|
||
# self.select_ = i
|
||
# # s = random.randint(0, self.cacheInfo[i])
|
||
# x = ev.pos().x()
|
||
# ip = int(float(x) / self.width() * self.cacheInfo[i])
|
||
# self.select_status.value = 1
|
||
# print('select', i, ip, self.cacheInfo[i])
|
||
# # print(len(self.cacheFrames.keys()), self.playFrame.value, self.playFrame.value in self.cacheFrames,
|
||
# # self.cacheFrames.keys())
|
||
# self.select.value = i
|
||
# self.tiems.value = ip
|
||
# self.playFrame.value = ip
|
||
# self.playend.value = 0
|
||
# self.playindexing.value = i
|
||
# print('select', i, ip, self.cacheInfo[i])
|
||
# print(self.select.value, self.tiems.value, self.playFrame.value, self.playindexing.value)
|
||
# # if not self.timer.isActive():
|
||
# # self.timer.start()
|
||
|
||
elif ev.button() == Qt.RightButton:
|
||
# print("Right mouse button pressed")
|
||
if self.yy.timer.isActive():
|
||
self.yy.timer.stop()
|
||
# print(self.playInit[3])
|
||
|
||
else:
|
||
# print('start')
|
||
self.yy.timer.start()
|
||
|
||
def mouseMoveEvent(self, ev):
|
||
# self.yy.timer.stop()
|
||
# # x = ev.pos().x()
|
||
# # ip = int(float(x) / self.width() * self.cacheInfo[self.select_])
|
||
# # self.select_status.value = 1
|
||
# # print('select', self.select_, ip, self.cacheInfo[self.select_])
|
||
# # self.tiems.value = ip - 1
|
||
# # self.playFrame.value = ip - 1
|
||
# # self.hua.value = 1
|
||
# # print(self.cacheFrames.keys())
|
||
# if self.playFrame.value in self.cacheFrames:
|
||
# # if self.counter/1000 == 0:
|
||
# # # print(len(self.cacheFrames), 'len(self.cacheFrames)')
|
||
# frame = self.cacheFrames[self.playFrame.value]
|
||
# self.h, self.w, ch = frame.shape
|
||
# bytesPerLine = ch * self.w
|
||
# # frame = cv2.resize(frame, (1280, 720))
|
||
# qImg = QImage(frame.data, self.w, self.h, bytesPerLine, QImage.Format_RGB888)
|
||
# pixmap = QPixmap.fromImage(qImg).scaled(self.width(), self.height())
|
||
# self.setPixmap(pixmap)
|
||
super().mouseMoveEvent(ev)
|
||
|
||
def mouseReleaseEvent(self, ev):
|
||
# self.hua.value = 0
|
||
print(self.playList[self.select.value])
|
||
cap = cv2.VideoCapture(self.playList[self.select.value])
|
||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||
self.yy.set(fps)
|
||
# time.sleep(1)
|
||
self.yy.timer.start()
|
||
super().mouseReleaseEvent(ev)
|
||
|
||
def mouseDoubleClickEvent(self, a0):
|
||
if self.rod.value:
|
||
self.rod.value = 0
|
||
else:
|
||
self.rod.value = 1
|
||
super().mouseDoubleClickEvent(a0)
|
||
|
||
def closeEvent(self, a0):
|
||
# self.yy.terminate()
|
||
# self.yy.deleteLater()
|
||
|
||
# self.p.terminate()
|
||
self.p.join()
|
||
# self.p.close()
|
||
# self.p.kill()
|
||
|
||
# self.yy.p.terminate()
|
||
self.yy.p.join()
|
||
# self.yy.p.close()
|
||
# self.yy.p.kill()
|
||
super().closeEvent(a0)
|
||
# sys.exit()
|
||
|
||
|
||
class Get(QThread):
|
||
num = pyqtSignal(int)
|
||
|
||
def __init__(self, cache=None):
|
||
super(Get, self).__init__()
|
||
|
||
self.cache = cache
|
||
|
||
def run(self) -> None:
|
||
while True:
|
||
self.cache.value
|
||
|
||
|
||
if __name__ == '__main__':
|
||
freeze_support()
|
||
app = QApplication([])
|
||
widget = Window()
|
||
widget.show()
|
||
# cap = cv2.VideoCapture('/home/jcen/Videos/[J2] 銀魂 002.rmvb')
|
||
# frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
# print(frameNum)
|
||
app.exec_()
|
||
|
||
# +++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
||
|
||
# coding: utf-8
|
||
|
||
from multiprocessing import Manager, Process
|
||
import cv2
|
||
from PyQt5.QtCore import *
|
||
from PyQt5.QtWidgets import QApplication
|
||
|
||
class PlayInit(QThread):
|
||
def __init__(self, ):
|
||
super().__init__()
|
||
|
||
self.play_list_data = Manager().dict()
|
||
self.playInfo = Manager().dict()
|
||
self.play_list = None
|
||
self.update = False
|
||
self.end = False
|
||
|
||
def set(self, play_list):
|
||
self.play_list = play_list
|
||
self.play_list_data.clear()
|
||
self.update = True
|
||
|
||
def run(self):
|
||
while True:
|
||
if self.play_list:
|
||
if self.update:
|
||
for s, i in enumerate(self.play_list):
|
||
# print(i)
|
||
self.p = Process(target=self.init, args=(s, i,))
|
||
self.p.start()
|
||
self.update = False
|
||
while True:
|
||
if len(self.play_list_data.keys()) == len(self.play_list):
|
||
# ps = 1
|
||
# for i in sorted(self.play_list_data.keys()):
|
||
# # print(i, '0000')
|
||
# if i == 0:
|
||
# # print('0', i)
|
||
# self.play_list_data[i] = [[self.play_list_data[i][0][0], self.play_list_data[i][0][1]], [1, self.play_list_data[i][0][1]]]
|
||
# else:
|
||
# # print('dd', i-1, self.play_list_data[i-1])
|
||
# frameNum1 = self.play_list_data[i-1][0][1] + 1
|
||
# self.play_list_data[i] = [[self.play_list_data[i][0][0], self.play_list_data[i][0][1]], [frameNum1, frameNum1+self.play_list_data[i][0][1]]]
|
||
# ps = frameNum1 + 1
|
||
# # print(self.play_list_data[i])
|
||
self.end = True
|
||
# print('ssssssss')
|
||
break
|
||
|
||
def init(self, index, play):
|
||
# print(index)
|
||
cap = cv2.VideoCapture(play)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
self.playInfo[index] = frameNum
|
||
# self.cacheInfo[s] = frameNum
|
||
self.play_list_data[index] = [[1, frameNum]]
|
||
while True:
|
||
try:
|
||
self.play_list_data[0]
|
||
if index == 0:
|
||
# print('0', index)
|
||
self.play_list_data[index] = [[self.play_list_data[index][0][0], self.play_list_data[index][0][1]],
|
||
[1, self.play_list_data[index][0][1]]]
|
||
else:
|
||
if index == 1:
|
||
# print('dd', index-1, self.play_list_data[index-1], self.play_list_data[index] , sum([self.play_list_data[i][0][1] for i in range(index)]))
|
||
frameNum1 = sum([self.play_list_data[i][0][1] for i in range(index)]) + 1
|
||
# print(frameNum1)
|
||
self.play_list_data[index] = [[self.play_list_data[index][0][0], self.play_list_data[index][0][1]],
|
||
[frameNum1, frameNum1 + self.play_list_data[index][0][1]]]
|
||
else:
|
||
# print('dd', index-1, self.play_list_data[index-1], self.play_list_data[index] , sum([self.play_list_data[i][0][1] for i in range(index)]))
|
||
frameNum1 = sum([self.play_list_data[i][0][1] for i in range(index)]) + 1
|
||
# print(frameNum1)
|
||
self.play_list_data[index] = [[self.play_list_data[index][0][0], self.play_list_data[index][0][1]],
|
||
[frameNum1+1, frameNum1 + self.play_list_data[index][0][1]]]
|
||
break
|
||
except:
|
||
# print(index)
|
||
continue
|
||
|
||
|
||
if __name__ == '__main__':
|
||
import sys
|
||
import os
|
||
app = QApplication([])
|
||
playList = []
|
||
for s, i in enumerate(os.listdir('/home/jcen/Videos')):
|
||
if i.split('.')[-1] in ['rmvb', 'mp4', 'mov']:
|
||
playList.append(os.path.join(r'/home/jcen/Videos', i))
|
||
s = PlayInit()
|
||
s.start()
|
||
s.set(playList)
|
||
while True:
|
||
if s.end:
|
||
print(s.play_list_data.items())
|
||
print(s.playInfo.items())
|
||
break
|
||
# print(playList)
|
||
app.exec_()
|
||
# coding: utf-8
|
||
|
||
from multiprocessing import Manager, Process
|
||
import cv2
|
||
from PyQt5.QtCore import *
|
||
from PyQt5.QtWidgets import QApplication
|
||
|
||
class PlayInit(QThread):
|
||
def __init__(self, ):
|
||
super().__init__()
|
||
|
||
self.play_list_data = Manager().dict()
|
||
self.playInfo = Manager().dict()
|
||
self.play_list = None
|
||
self.update = False
|
||
self.end = False
|
||
|
||
def set(self, play_list):
|
||
self.play_list = play_list
|
||
self.play_list_data.clear()
|
||
self.update = True
|
||
|
||
def run(self):
|
||
while True:
|
||
if self.play_list:
|
||
if self.update:
|
||
for s, i in enumerate(self.play_list):
|
||
# print(i)
|
||
self.p = Process(target=self.init, args=(s, i,))
|
||
self.p.start()
|
||
self.update = False
|
||
while True:
|
||
if len(self.play_list_data.keys()) == len(self.play_list):
|
||
# ps = 1
|
||
# for i in sorted(self.play_list_data.keys()):
|
||
# # print(i, '0000')
|
||
# if i == 0:
|
||
# # print('0', i)
|
||
# self.play_list_data[i] = [[self.play_list_data[i][0][0], self.play_list_data[i][0][1]], [1, self.play_list_data[i][0][1]]]
|
||
# else:
|
||
# # print('dd', i-1, self.play_list_data[i-1])
|
||
# frameNum1 = self.play_list_data[i-1][0][1] + 1
|
||
# self.play_list_data[i] = [[self.play_list_data[i][0][0], self.play_list_data[i][0][1]], [frameNum1, frameNum1+self.play_list_data[i][0][1]]]
|
||
# ps = frameNum1 + 1
|
||
# # print(self.play_list_data[i])
|
||
self.end = True
|
||
# print('ssssssss')
|
||
break
|
||
|
||
def init(self, index, play):
|
||
# print(index)
|
||
cap = cv2.VideoCapture(play)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
self.playInfo[index] = frameNum
|
||
# self.cacheInfo[s] = frameNum
|
||
self.play_list_data[index] = [[1, frameNum]]
|
||
while True:
|
||
try:
|
||
self.play_list_data[0]
|
||
if index == 0:
|
||
# print('0', index)
|
||
self.play_list_data[index] = [[self.play_list_data[index][0][0], self.play_list_data[index][0][1]],
|
||
[1, self.play_list_data[index][0][1]]]
|
||
else:
|
||
if index == 1:
|
||
# print('dd', index-1, self.play_list_data[index-1], self.play_list_data[index] , sum([self.play_list_data[i][0][1] for i in range(index)]))
|
||
frameNum1 = sum([self.play_list_data[i][0][1] for i in range(index)]) + 1
|
||
# print(frameNum1)
|
||
self.play_list_data[index] = [[self.play_list_data[index][0][0], self.play_list_data[index][0][1]],
|
||
[frameNum1, frameNum1 + self.play_list_data[index][0][1]]]
|
||
else:
|
||
# print('dd', index-1, self.play_list_data[index-1], self.play_list_data[index] , sum([self.play_list_data[i][0][1] for i in range(index)]))
|
||
frameNum1 = sum([self.play_list_data[i][0][1] for i in range(index)]) + 1
|
||
# print(frameNum1)
|
||
self.play_list_data[index] = [[self.play_list_data[index][0][0], self.play_list_data[index][0][1]],
|
||
[frameNum1+1, frameNum1 + self.play_list_data[index][0][1]]]
|
||
break
|
||
except:
|
||
# print(index)
|
||
continue
|
||
|
||
|
||
if __name__ == '__main__':
|
||
import sys
|
||
import os
|
||
app = QApplication([])
|
||
playList = []
|
||
for s, i in enumerate(os.listdir('/home/jcen/Videos')):
|
||
if i.split('.')[-1] in ['rmvb', 'mp4', 'mov']:
|
||
playList.append(os.path.join(r'/home/jcen/Videos', i))
|
||
s = PlayInit()
|
||
s.start()
|
||
s.set(playList)
|
||
while True:
|
||
if s.end:
|
||
print(s.play_list_data.items())
|
||
print(s.playInfo.items())
|
||
break
|
||
# print(playList)
|
||
app.exec_()
|
||
|
||
|
||
# ++++++++++++++++++++++++++++
|
||
|
||
|
||
|
||
# coding: utf-8
|
||
import time
|
||
from multiprocessing import Manager, Process
|
||
import cv2
|
||
from PyQt5.QtCore import *
|
||
from PyQt5.QtWidgets import QApplication
|
||
|
||
|
||
class PlayInit(QThread):
|
||
frame = pyqtSignal()
|
||
|
||
def __init__(self, ):
|
||
super().__init__()
|
||
|
||
self.update = False
|
||
self.end = False
|
||
|
||
manager = Manager()
|
||
self.playList = manager.list()
|
||
self.playList_data = manager.dict()
|
||
self.playInfo = manager.dict()
|
||
self.playCache = manager.dict()
|
||
|
||
self.playFrame = manager.Value('i', 1)
|
||
self.playIndex = manager.Value('i', 0)
|
||
self.playFps = manager.Value('i', 0)
|
||
self.playListFps = manager.dict()
|
||
|
||
self.count = manager.Value('i', 0)
|
||
self.run_count = manager.Value('i', 0)
|
||
self.run_object = {}
|
||
|
||
def set(self, playList):
|
||
for i in playList:
|
||
self.playList.append(i)
|
||
self.playList_data.clear()
|
||
self.update = True
|
||
|
||
def set_fps(self, fps):
|
||
self.playFps.value = fps
|
||
|
||
def set_run_count(self, i):
|
||
self.run_count.value = i
|
||
|
||
def run(self):
|
||
while True:
|
||
if self.playList:
|
||
if self.update:
|
||
for s, i in enumerate(self.playList):
|
||
self.p = Process(target=self.init, args=(s, i, self.count, self.playListFps))
|
||
self.p.start()
|
||
self.update = False
|
||
while True:
|
||
if len(self.playList_data.keys()) == len(self.playList):
|
||
self.end = True
|
||
break
|
||
if self.end:
|
||
interval = 1 / 24.0
|
||
while True:
|
||
start_time = time.time()
|
||
self.frame.emit()
|
||
elapsed_time = time.time() - start_time
|
||
wait_time = interval - elapsed_time
|
||
if wait_time > 0:
|
||
time.sleep(wait_time)
|
||
|
||
def init(self, index, play, count, fps):
|
||
count.value += 1
|
||
cap = cv2.VideoCapture(play)
|
||
frameNum = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||
Fps = cap.get(cv2.CAP_PROP_FPS)
|
||
fps[index] = Fps
|
||
self.playInfo[index] = frameNum
|
||
self.playList_data[index] = [[1, frameNum]]
|
||
while True:
|
||
try:
|
||
self.playList_data[0]
|
||
if index == 0:
|
||
self.playList_data[index] = [[self.playList_data[index][0][0], self.playList_data[index][0][1]],
|
||
[1, self.playList_data[index][0][1]]]
|
||
else:
|
||
if index == 1:
|
||
frameNum1 = sum([self.playList_data[i][0][1] for i in range(index)]) + 1
|
||
self.playList_data[index] = [[self.playList_data[index][0][0], self.playList_data[index][0][1]],
|
||
[frameNum1, frameNum1 + self.playList_data[index][0][1]]]
|
||
else:
|
||
frameNum1 = sum([self.playList_data[i][0][1] for i in range(index)]) + 1
|
||
self.playList_data[index] = [[self.playList_data[index][0][0], self.playList_data[index][0][1]],
|
||
[frameNum1+1, frameNum1 + self.playList_data[index][0][1]]]
|
||
break
|
||
except:
|
||
continue
|
||
# while True:
|
||
# if count.value - index > count.value - run_count.value:
|
||
# # print(index, '\n')
|
||
# ret, frame = cap.read()
|
||
# if ret:
|
||
# # print(ret, index, '\n')
|
||
# continue
|
||
|
||
def process_frame(self, run_count):
|
||
for i in range(run_count):
|
||
p = Process(target=self.run_, args=(i,))
|
||
self.run_object[i] = p
|
||
p.start()
|
||
|
||
time.sleep(5)
|
||
self.run_object[0].terminate()
|
||
self.run_object[0].join()
|
||
|
||
def run_(self, i):
|
||
while True:
|
||
print( '\n=========', i, '=========\n')
|
||
continue
|
||
|
||
|
||
if __name__ == '__main__':
|
||
|
||
import sys
|
||
import os
|
||
app = QApplication([])
|
||
playList = []
|
||
for s, i in enumerate(os.listdir('/home/jcen/Videos')):
|
||
if i.split('.')[-1] in ['rmvb', 'mp4', 'mov']:
|
||
playList.append(os.path.join(r'/home/jcen/Videos', i))
|
||
s = PlayInit()
|
||
s.start()
|
||
s.set(playList)
|
||
# s.process_frame(1)
|
||
while True:
|
||
if s.end:
|
||
# ret, frame = s.cap[0].read()
|
||
# if ret:
|
||
# print(ret)
|
||
print(s.playList_data.items())
|
||
print(s.playInfo.items(), s.count.value, s.playListFps.items())
|
||
break
|
||
# print(playList)
|
||
app.exec_()
|
||
|
||
|
||
|