일상

Qt 기반 비디오 플레이어 개발 – PyQt6 활용

BBB1004 2025. 2. 3. 16:56
728x90
반응형

Qt 기반 비디오 플레이어 개발 – PyQt6 활용

🎬 개발을 시작한 이유

요즘 나오는 비디오 플레이어들은 광고가 많거나, 사용자가 원하는 기능이 없어서 불편한 경우가 많다. 그래서 광고 없이 내가 직접 사용할 목적으로 비디오 플레이어를 개발하고 있다. 단순히 영상 재생만 되는 것이 아니라, 깔끔한 UI와 편리한 조작을 목표로 만들어 가는 중이다.

현재는 시간이 날 때마다 꾸준히 개발하고 있으며, 최대한 단순하고 심플한 형태로 유지하려고 한다. 기본적인 데모 버전은 이미 내가 직접 사용하고 있으며, 패키징까지 완료된 상태다. 하지만 블로그를 방문하는 분들께 공유하기 위해서는 몇 가지 추가적인 기능이 필요하다고 생각한다.

앞으로 개선해야 할 부분으로는 설치 후 시작 앱 리스트 등록, 드래그앤드롭(Drag & Drop) 지원 등이 있다. 이를 해결하기 위해 조금씩 수정해 나가고 있으며, 완성도가 높아지면 블로그를 통해 공유할 예정이다.

또한, 현재 사용 중인 Nextcloud와의 연동도 계획 중이다. 개인 클라우드에서 직접 영상을 재생할 수 있도록 하고, 추가적으로 FFmpeg 최신 비디오 코덱을 지원할 예정이다. 특히, 삼성 갤럭시에서 사용하는 HEVC(H.265) 코덱과의 호환 문제 해결도 고려하고 있으며, 이를 통해 모바일 기기에서도 원활한 재생이 가능하도록 최적화할 계획이다.

현재 데모 버전은 파일 열기를 통해 정상적으로 사용할 수 있으며, 이 데모판을 사용해보고 싶은 분들은 블로그 댓글을 남겨주시면 개별적으로 제공해드릴 수 있습니다. 😊

 

🛠️ 현재 구현된 주요 기능

  • 광고 없는 동영상 파일 재생 (MP4, MKV, AVI 지원)
  • 전체화면 모드 & 종료 버튼
  • 탐색 바(슬라이더) 직접 클릭 이동
  • 볼륨 조절 가능
  • ESC 키로 전체화면 종료
  • 좌우 방향키로 10초 단위 이동
  • 자동 숨김 UI(전체화면 시 컨트롤 패널 자동 숨김)

🔧 코드 설명

프로젝트는 PyQt6의 QMediaPlayer, QVideoWidget, QAudioOutput을 사용하여 구현 중이다. 주요 코드 구성은 아래와 같다.

📌 1. 기본 UI 구성

from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QSlider, QLabel
from PyQt6.QtMultimedia import QMediaPlayer, QAudioOutput
from PyQt6.QtMultimediaWidgets import QVideoWidget
from PyQt6.QtCore import Qt

class VideoPlayer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt6 비디오 플레이어")
        self.resize(1000, 600)
        
        self.media_player = QMediaPlayer()
        self.audio_output = QAudioOutput()
        self.media_player.setAudioOutput(self.audio_output)

        self.video_widget = QVideoWidget()
        self.media_player.setVideoOutput(self.video_widget)
        
        self.play_button = QPushButton("▶ 재생")
        self.play_button.clicked.connect(self.toggle_play)

        layout = QVBoxLayout()
        layout.addWidget(self.video_widget)
        layout.addWidget(self.play_button)
        
        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)
    
    def toggle_play(self):
        if self.media_player.playbackState() == QMediaPlayer.PlaybackState.PlayingState:
            self.media_player.pause()
        else:
            self.media_player.play()

if __name__ == "__main__":
    app = QApplication([])
    window = VideoPlayer()
    window.show()
    app.exec()

📌 2. 전체화면 모드 & ESC 종료

    def keyPressEvent(self, event):
        if event.key() == Qt.Key.Key_Escape and self.isFullScreen():
            self.showNormal()
        else:
            super().keyPressEvent(event)

📌 3. 탐색 바 (슬라이더 클릭 이동)

class ClickableSlider(QSlider):
    def mousePressEvent(self, event):
        if event.button() == Qt.MouseButton.LeftButton:
            new_value = int(self.minimum() + (self.maximum() - self.minimum()) * event.position().x() / self.width())
            self.setValue(new_value)
            self.sliderReleased.emit()
        super().mousePressEvent(event)

🧐 개발하면서 겪은 문제 & 해결 방법

1️⃣ QMediaPlayer가 일부 동영상 파일을 재생하지 않음

  • 해결: FFmpeg 기반의 외부 코덱 설치로 해결 2️⃣ 슬라이더를 클릭해도 영상이 즉시 이동하지 않음
  • 해결: mousePressEvent를 오버라이딩하여 즉시 위치 이동 처리

🚀 추가 예정 기능

  • 설치 후 시작 앱 리스트 자동 등록
  • 드래그앤드롭(Drag & Drop) 기능 지원
  • 자막 지원 (SRT, ASS 포맷)
  • 플레이리스트 기능
  • 클라우드 파일 연동 (Nextcloud, Google Drive, FTP 지원)
  • FFmpeg 최신 비디오 코덱 지원 (HEVC H.265 포함)

🔗 관련 블로그 페이지

📌 프로젝트 상세 설명 및 다운로드


이 프로젝트는 단순한 개발 연습이 아니라, 내가 직접 사용하고 싶은 비디오 플레이어를 만들기 위한 시도다. 아직 부족한 부분이 많지만, 시간이 날 때마다 하나씩 보완해 나가고 있다. 완성도가 높아지면 블로그 방문자들에게도 공유할 계획이며, 앞으로도 꾸준히 기능을 추가하고 개선해 나갈 예정이다. 😊

728x90
반응형