Esempio n. 1
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        loadUi('open.ui', self)
        self.setWindowTitle('OpenParty Server')
        self.totalFrames = 0
        self.fps = 0
        self.openButton.clicked.connect(self.open_file)

        self.threadVideoGen = QThread()
        self.threadVideoPlay = QThread()
        self.threadAudio = QThread()
        self.threadChat = QThread()

        self.volumeSlider.setMinimum(0)
        self.volumeSlider.setMaximum(100)
        self.volumeSlider.setValue(50)
        self.volumeSlider.sliderReleased.connect(self.set_volume)

        self.process_name = psutil.Process(os.getpid()).name()
        self.volume_set = False

        self.session_active = True
        while not self.session_active:
            pass

        self.is_fullscreen = False

    # full screen UI on double click
    def mouseDoubleClickEvent(self, e):  # double click
        try:
            if not self.is_fullscreen:
                self.showFullScreen()
                self.is_fullscreen = True
            elif self.is_fullscreen:
                self.showNormal()
                self.is_fullscreen = False
        except Exception as e:
            logging.error('double click err: {}'.format(e))

    # initialize threads for each component
    def start_video_gen(self):
        self.threadVideoGen = VideoGen(self.cap, self.q, self.totalFrames)
        self.threadVideoGen.start()

    def start_audio(self):
        self.threadAudio = LocalAudio(self.playButton, self.stopButton,
                                      self.progressBar,
                                      self.audioProgressLabel, self.fps)
        self.threadAudio.start()

    def start_video_play(self):
        self.threadVideoPlay = PlayVideo(self.cap, self.q, self.progresslabel,
                                         self.progressBar, self.frame,
                                         self.totalFrames, self.fps,
                                         self.playButton, self.stopButton,
                                         self.fpsLabel, self.threadVideoGen,
                                         self.threadAudio)
        self.threadVideoPlay.start()

    def start_tcp_chat(self):
        if not self.threadChat.isRunning():
            print('starting chat thread...')
            self.threadChat = TcpChat(self.threadVideoPlay, self.threadAudio,
                                      self.chatBox, self.messageBox)
            self.threadChat.start()
        else:
            self.threadChat.update_threads(self.threadVideoPlay,
                                           self.threadAudio)

    # after opening file start threads for each component
    def open_file(self):
        # self.frame.mouseDoubleClickEvent = mouseDoubleClickEvent
        try:
            self.videoFileName = QFileDialog.getOpenFileName(
                self, 'Select Video File')
            self.file_name = list(self.videoFileName)[0]

            # self.file_name = "C:\\repos\\OpenParty\\app\\server\\vids\\Nigt of the living dead.mp4"
            if not self.file_name == "":
                if self.threadVideoPlay.isRunning():
                    self.threadVideoPlay.stopSignal.emit()
                if self.threadAudio.isRunning():
                    self.threadAudio.stopSignal.emit()

                if self.threadAudio.isRunning():
                    self.threadAudio.destroy()
                if self.threadVideoPlay.isRunning():
                    self.threadVideoPlay.destroy()
                if self.threadVideoGen.isRunning():
                    self.threadVideoGen.destroy()

                self.threadVideoGen = QThread()
                self.threadVideoPlay = QThread()
                self.threadAudio = QThread()

                self.cap = cv2.VideoCapture(self.file_name)
                # if not self.cap:
                #     raise Exception('file not valid')
                self.fps = self.cap.get(cv2.CAP_PROP_FPS)
                self.q = queue.Queue(maxsize=1000)
                self.totalFrames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))

                print('Opening file {} with fps {}'.format(
                    list(self.file_name)[0], self.fps))

                # extract and convert audio from the video file into a temp.wav to be sent
                # set the bitrate, number of channels, sample size and overwrite old file with same name
                command = "ffmpeg.exe -i \"{}\" -ab 160k -ac 2 -ar 44100 -vn {} -y".format(
                    self.file_name, 'temp.wav')
                os.system(command)

                self.start_video_gen()
                self.start_audio()
                self.start_video_play()
                self.start_tcp_chat()

                for session in AudioUtilities.GetAllSessions():
                    if session.Process and session.Process.name(
                    ) == self.process_name:
                        self.volume = session.SimpleAudioVolume
                        self.volume.SetMasterVolume(0.5, None)
                        self.volumeSlider.setValue(50)
                        self.volume_set = True
        except Exception as e:
            logging.error(e)

    def set_volume(self):
        if self.volume_set:
            value = self.volumeSlider.value()
            self.volume.SetMasterVolume(value / 100, None)
        else:
            self.volumeSlider.setValue(50)

    # when exiting the UI make sure the threads are closed
    def closeEvent(self, event):
        try:
            print('Session ended')
            self.threadChat.terminate()
            if self.threadVideoPlay.isRunning():
                self.threadVideoPlay.destroy()
            if self.threadAudio.isRunning():
                self.threadAudio.destroy()
            if self.threadVideoGen.isRunning():
                self.threadVideoGen.destroy()
        finally:
            os._exit(1)