def __init__(self, parent=None): super(VideoWindow, self).__init__(parent) self.setWindowTitle("Video File") self.setGeometry(0,0,1000,1000) self.setFixedHeight(MAX_hight) self.setFixedWidth(MAX_width) self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(os.getcwd()+'/123.mp4'))) self.imgshow(250,500,'lab') self.imgsho(250,300,'lab1') videoWidget = QVideoWidget() videoWidget.setFixedWidth(360) videoWidget.setFixedHeight(360) self.playButton = QPushButton() self.playButton.setEnabled(False) self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.playButton.clicked.connect(self.play) self.positionSlider = QSlider(Qt.Horizontal) self.positionSlider.setRange(0, 0) self.positionSlider.sliderMoved.connect(self.setPosition) self.errorLabel = QLabel() self.errorLabel.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) self.playButton.setEnabled(True) wid = QWidget(self) self.setCentralWidget(wid) # Create layouts to place inside widget controlLayout = QHBoxLayout() controlLayout.setContentsMargins(0, 0, 0, 0) controlLayout.addWidget(self.playButton) controlLayout.addWidget(self.positionSlider) layout = QVBoxLayout() layout.addWidget(videoWidget) layout.addLayout(controlLayout) layout.addWidget(self.errorLabel) # Set widget to contain window contents wid.setLayout(layout) self.mediaPlayer.setVideoOutput(videoWidget) self.mediaPlayer.stateChanged.connect(self.mediaStateChanged) self.mediaPlayer.positionChanged.connect(self.positionChanged) self.mediaPlayer.durationChanged.connect(self.durationChanged) self.mediaPlayer.error.connect(self.handleError)
class MainWindow(QMainWindow): directory_path = "" video_paths = [] video_infos = [] main_width = 1500 main_height = 800 key_frame_dir = "" def __init__(self): super().__init__() self.tabs = [] self.tab_names = [] self.__initUI() def __initUI(self): # Create a widget for window contents self.central_widget = QWidget(self) self.setCentralWidget(self.central_widget) # Create new action open_action = QAction(QIcon('open.png'), '&Open', self) open_action.setShortcut('Ctrl+O') open_action.setStatusTip('Open movie') open_action.triggered.connect(self.__openDownloadDirectory) # Create exit action exit_action = QAction(QIcon('exit.png'), '&Exit', self) exit_action.setShortcut('Ctrl+Q') exit_action.setStatusTip('Exit application') exit_action.triggered.connect(self.close) # Create menu bar and add action menu_bar = self.menuBar() menu = menu_bar.addMenu('&메뉴') menu.addAction(open_action) menu.addAction(exit_action) self.statusBar() self.setFrameViewWidget() self.setVideoWidget() self.setVideoControlWidget() self.setTabWidget() self.setMainLayout() # Set widget to contain window contents self.central_widget.setLayout(self.main_layout) self.setGeometry(300, 300, self.main_width, self.main_height) self.setWindowTitle('Video Previewer') self.show() def setFrameViewWidget(self): self.frame = QLabel(self) self.frame.setFrameShape(QFrame.Panel) self.frame.setFixedHeight(self.main_height / 2) self.frame.setFixedWidth(self.main_width / 3) self.frame.setStyleSheet("background: white; border:1px solid gray;") self.frame.setAlignment(Qt.AlignCenter) def setVideoWidget(self): self.videoWidget = QVideoWidget() self.videoWidget.setStyleSheet("background: white; border:1px solid rgb(0, 0, 0);") self.videoWidget.setFixedWidth(self.main_width / 3) self.videoWidget.setFixedHeight(self.main_height / 2) self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) self.mediaPlayer.setVideoOutput(self.videoWidget) self.mediaPlayer.stateChanged.connect(self.mediaStateChanged) self.mediaPlayer.positionChanged.connect(self.positionChanged) self.mediaPlayer.durationChanged.connect(self.durationChanged) self.mediaPlayer.error.connect(self.handleError) def setVideoControlWidget(self): self.play_button = QPushButton() self.play_button.setEnabled(False) self.play_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.play_button.clicked.connect(self.play) self.play_button.setFixedWidth(50) self.position_slider = QSlider(Qt.Horizontal) self.position_slider.setRange(0, 0) self.position_slider.sliderMoved.connect(self.setPosition) self.position_slider.setFixedWidth(self.main_width / 3 - 55) self.errorLabel = QLabel() self.errorLabel.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) self.controlLayout = QGridLayout() self.controlLayout.setAlignment(Qt.AlignLeft) self.controlLayout.setAlignment(Qt.AlignTop) self.controlLayout.addWidget(self.videoWidget, 0, 0, 1, 2) self.controlLayout.addWidget(self.play_button, 1, 0) self.controlLayout.addWidget(self.position_slider, 1, 1) def setMainLayout(self): self.main_layout = QGridLayout() self.main_layout.setAlignment(Qt.AlignTop) self.main_layout.addLayout(self.controlLayout, 1, 0) self.main_layout.addWidget(self.frame, 2, 0) self.main_layout.addWidget(self.tabWidget, 0, 1, 3, 3) # self.main_layout.addWidget(self.errorLabel) def setVideoTab(self, row_count): column_headers = ['Thumbnail', 'Name', 'Size', 'Created Date', 'Modified Date'] self.tab_videos = QTableWidget() self.tab_videos.resize(290, 290) self.tab_videos.setRowCount(row_count) self.tab_videos.setColumnCount(5) self.tab_videos.setHorizontalHeaderLabels(column_headers) self.tabWidget.addTab(self.tab_videos, "Videos") def setVideoTabItems(self, videos): for video in videos: video_info = os.path.join(self.directory_path, video) self.video_paths.append(video_info) self.video_infos.append([ "", video, "%.2f MB" % (os.path.getsize(video_info) / (1024.0 * 1024.0)), time.ctime(os.path.getctime(video_info)), time.ctime(os.path.getmtime(video_info)) ]) for row, video_infos in enumerate(self.video_infos): for col, video_info in enumerate(video_infos): self.tab_videos.setItem(row, col, QTableWidgetItem(str(video_infos[col]))) self.tab_videos.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tab_videos.cellClicked.connect(self.videoCellClicked) self.tab_videos.cellDoubleClicked.connect(self.videoCellDoubleClicked) header = self.tab_videos.horizontalHeader() for idx in range(len(videos)): header.setSectionResizeMode(idx, QtWidgets.QHeaderView.ResizeToContents) @pyqtSlot(int, int) def videoCellClicked(self, row, col): self.tab_videos.selectRow(row) cell = self.tab_videos.item(row, 1) @pyqtSlot(int, int) def videoCellDoubleClicked(self, row, col): self.openFile(self.video_paths[row]) self.tab_videos.selectRow(row) def setFrameTab(self): self.tab_keyframes = QListWidget() self.tab_keyframes.setViewMode(QListWidget.IconMode) self.tab_keyframes.setIconSize(QSize(225, 225)) self.tab_keyframes.itemDoubleClicked.connect(self.frameCellDoubleClicked) self.tabWidget.addTab(self.tab_keyframes, "Key frames") def frameCellDoubleClicked(self, item=None): self.frame.setStyleSheet("background: black") pixmap = QPixmap(os.path.join(self.key_frame_dir, item.text())) self.frame.setPixmap(pixmap) def setTabWidget(self): self.tabWidget = QTabWidget() def __openDownloadDirectory(self): directory_path = str(QFileDialog.getExistingDirectory(self, "Select Directory")) if directory_path: self.directory_path = directory_path videos = os.listdir(self.directory_path) self.setVideoTab(len(videos)) self.setFrameTab() self.setVideoTabItems(videos) else : print("Info: You didn't select directory. current directory path is \"{}\"".format(self.directory_path)) def openFile(self, fileName): if fileName != '': self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName))) self.play_button.setEnabled(True) ffmpeg = FFmpegWrapper() ffmpeg.setOptions(video_path=fileName) if not os.path.isdir(ffmpeg.getOutputDir()): ffmpeg.runFFmpeg() keyframelist_file = ffmpeg.getKeyframesPathFile() detector = darknetDetectorWrapper() detector.setInputPath(input_paths=keyframelist_file) detector.setOutputPath(ffmpeg.getOutputDir()) detector.runDarknetDetector() frame_names = self.readFrames(keyframelist_file) self.tab_keyframes.clear() self.key_frame_dir = frame_names[0].replace(frame_names[0].split("\\")[-1],"") for frame_name in frame_names: item = QListWidgetItem(QIcon(frame_name), frame_name.split("\\")[-1]) self.tab_keyframes.addItem(item) def readFrames(self, keyframelist_file): frame_names = [] with open(keyframelist_file, 'r') as file: for frame in file: frame_names.append(frame.split("\n")[0]) return frame_names def play(self): if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.mediaPlayer.pause() else: self.mediaPlayer.play() def mediaStateChanged(self, state): if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.play_button.setIcon( self.style().standardIcon(QStyle.SP_MediaPause)) else: self.play_button.setIcon( self.style().standardIcon(QStyle.SP_MediaPlay)) def positionChanged(self, position): self.position_slider.setValue(position) def durationChanged(self, duration): self.position_slider.setRange(0, duration) def setPosition(self, position): self.mediaPlayer.setPosition(position) def handleError(self): self.play_button.setEnabled(False) self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("PyQt5 Media Player") self.setGeometry(0, 0, 700, 600) self.setWindowIcon(QIcon('player.png')) p = self.palette() p.setColor(QPalette.Window, Qt.black) self.setPalette(p) self.init_ui() self.show() self.audio_process = False self.position = 0 self.filename = '.' def init_ui(self): #create media player object self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) #create videowidget object videoHboxLayout = QHBoxLayout() self.videowidget = QVideoWidget() self.videowidget.setFixedHeight(300) self.videowidget.setFixedWidth(352) self.imagewidget = QLabel() self.imagewidget.setFixedWidth(352) self.imagewidget.setFixedHeight(300) videoHboxLayout.addWidget(self.videowidget) videoHboxLayout.addWidget(self.imagewidget) videoHboxLayout.setContentsMargins(0, 0, 0, 0) videoHboxLayout.setSpacing(0) #create open button openBtn = QPushButton('Open Video') openBtn.clicked.connect(self.open_file) #create button for playing self.playBtn = QPushButton() self.playBtn.setEnabled(False) self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.playBtn.clicked.connect(self.play_video) self.stopBtn = QPushButton() self.stopBtn.setEnabled(False) self.stopBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) self.stopBtn.clicked.connect(self.reset_video) #create label self.label = QLabel() self.label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) #create hbox layout hboxLayout = QHBoxLayout() hboxLayout.setContentsMargins(0, 0, 0, 0) #set widgets to the hbox layout hboxLayout.addWidget(openBtn) hboxLayout.addWidget(self.playBtn) hboxLayout.addWidget(self.stopBtn) synopLayout = QVBoxLayout() synopLayout.setContentsMargins(0, 0, 0, 0) synopLayout.setSpacing(0) self.generate_synopsis_video(synopLayout) self.generate_synopsis_image(synopLayout) # image1 = ClickLabel() # pixmap = QPixmap('../test.jpg') # image1.setPixmap(pixmap) # image1.setFixedSize(100, 50) # # image1.clicked.connect(self.synopsis_click_handler) # synopImageLayout.addWidget(image1) #create vbox layout vboxLayout = QVBoxLayout() vboxLayout.addLayout(videoHboxLayout) vboxLayout.addLayout(hboxLayout) vboxLayout.addWidget(self.label) vboxLayout.addLayout(synopLayout) self.setLayout(vboxLayout) self.mediaPlayer.setVideoOutput(self.videowidget) pal = self.palette() pal.setBrush(QPalette.Window, QBrush(QPixmap("../keyimages/1.png"))) self.videowidget.setPalette(pal) #media player signals self.mediaPlayer.stateChanged.connect(self.mediastate_changed) self.mediaPlayer.positionChanged.connect(self.position_changed) self.imagewidget.hide() def generate_synopsis_video(self, synopLayout): frame_folder = os.path.join(parent_dir, 'keyframes') image_dir = os.listdir(frame_folder) image_dir.remove('.gitignore') image_dir.remove('.DS_Store') image_dir.sort(key=lambda img: (int(img.split('_')[0][-1]) * 10000 + int(img.split('_')[1].split('.')[0]))) images = [image for image in image_dir] count = 0 synopImageLayout = QHBoxLayout() synopImageLayout.setContentsMargins(0, 0, 0, 0) synopImageLayout.setSpacing(0) for imageName in images: # frame_time = int(imageName.split('_')[1].split('.')[0]) video_no = int(imageName.split('_')[0][-1]) timestamp = (int(imageName.split('_')[1].split('.')[0])) image_label = ClickLabel() pixmap = QPixmap(os.path.join(parent_dir, 'keyframes', imageName))\ .scaled(44, 36, Qt.KeepAspectRatio, Qt.FastTransformation) image_label.setPixmap(pixmap) image_label.clicked.connect(lambda t=timestamp, n=video_no: self. synopsis_click_handler(t, n)) synopImageLayout.addWidget(image_label) count += 1 if count == 17: synopLayout.addLayout(synopImageLayout) synopImageLayout = QHBoxLayout() synopImageLayout.setContentsMargins(0, 0, 0, 0) synopImageLayout.setSpacing(0) count = 0 def generate_synopsis_image(self, synopLayout): image_folder = os.path.join(parent_dir, 'keyimages') image_dir = os.listdir(image_folder) image_dir.remove('.DS_Store') image_dir.sort(key=lambda img: int(img.split('.')[0])) images = [image for image in image_dir] count = 0 rowcount = 0 synopImageLayout = QHBoxLayout() synopImageLayout.setContentsMargins(0, 0, 0, 0) synopImageLayout.setSpacing(0) for imageName in images: image_no = int(imageName.split('.')[0]) image_label = ClickLabel() pixmap = QPixmap(os.path.join(image_folder, imageName)) \ .scaled(44, 36, Qt.KeepAspectRatio, Qt.FastTransformation) image_label.setPixmap(pixmap) image_label.clicked.connect( lambda filename=os.path.join(image_folder, imageName): self. image_synopsis_click_handler(filename)) synopImageLayout.addWidget(image_label) count += 1 if count == 17: synopLayout.addLayout(synopImageLayout) rowcount += 1 if rowcount > 3: return synopImageLayout = QHBoxLayout() synopImageLayout.setContentsMargins(0, 0, 0, 0) synopImageLayout.setSpacing(0) count = 0 def open_video_file(self, filename): path = os.path.join(parent_dir, 'videos') mp4_path = os.path.join(path, 'mp4') avi_path = os.path.join(path, 'avi') mp4_name = filename + '.mp4' avi_name = filename + '.avi' mp4_dir = os.listdir(mp4_path) for mp4 in mp4_dir: if mp4_name == mp4: self.mediaPlayer.setMedia( QMediaContent( QUrl.fromLocalFile(os.path.join(mp4_path, mp4_name)))) self.stopBtn.setEnabled(True) self.playBtn.setEnabled(True) self.filename = mp4_name return convert_avi_to_mp4(os.path.join(avi_path, avi_name), os.path.join(mp4_path, mp4_name)) self.mediaPlayer.setMedia( QMediaContent(QUrl.fromLocalFile(os.path.join(mp4_path, mp4_name)))) self.playBtn.setEnabled(True) self.stopBtn.setEnabled(True) self.filename = mp4_name def open_file(self): filename, _ = QFileDialog.getOpenFileName(self, "Open Video") if os.path.splitext(filename)[1] == '.avi': output_name = os.path.dirname(filename) + '/output.mp4' convert_avi_to_mp4(filename, output_name) self.mediaPlayer.setMedia( QMediaContent(QUrl.fromLocalFile(output_name))) self.playBtn.setEnabled(True) elif filename != '': self.mediaPlayer.setMedia( QMediaContent(QUrl.fromLocalFile(filename))) self.playBtn.setEnabled(True) def play_video(self): if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.mediaPlayer.pause() if self.audio_process: self.audio_process.kill() self.audio_process = False else: self.mediaPlayer.play() self.create_audio_process( '../videos/{filename}/audio.wav'.format( filename=self.filename.split('.')[0]), self.position / 1000) def reset_video(self): self.mediaPlayer.pause() self.mediaPlayer.setPosition(0) if self.audio_process: self.audio_process.kill() self.audio_process = False def mediastate_changed(self, state): if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.playBtn.setIcon(self.style().standardIcon( QStyle.SP_MediaPause)) else: self.playBtn.setIcon(self.style().standardIcon( QStyle.SP_MediaPlay)) def create_audio_process(self, filename, start_time): if self.audio_process: self.audio_process.kill() cmd = "python3 audio.py {filename} {start}".format(filename=filename, start=start_time) self.audio_process = subprocess.Popen(cmd, shell=True) def position_changed(self, position): self.position = position def duration_changed(self, duration): self.slider.setRange(0, duration) def set_position(self, position): self.play_video() self.mediaPlayer.setPosition(position) def handle_errors(self): self.playBtn.setEnabled(False) self.label.setText("Error: " + self.mediaPlayer.errorString()) def stop_video(self): if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.play_video() def image_synopsis_click_handler(self, filename): self.imagewidget.show() self.videowidget.hide() self.stop_video() self.playBtn.setEnabled(False) self.stopBtn.setEnabled(False) pixmap = QPixmap(filename) self.imagewidget.setPixmap(pixmap) def synopsis_click_handler(self, frame, video_no): self.imagewidget.hide() self.videowidget.show() self.playBtn.setEnabled(True) self.stopBtn.setEnabled(True) new_filename = 'video' + str(video_no) if self.filename.split('.')[0] != new_filename: self.open_video_file(new_filename) time = frame / 30 * 1000 self.mediaPlayer.setPosition(time) self.position = time self.stop_video()