Example #1
0
    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)
Example #2
0
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())
Example #3
0
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()