이 페이지에서

미디어 플레이어

Qt Quick 를 사용하여 오디오 및 비디오 재생하기.

오디오를 재생하는 멀티미디어 애플리케이션

이 예제는 다양한 코덱을 사용하여 오디오 및 비디오 파일을 재생할 수 있는 QML 애플리케이션을 보여줍니다.

예제 실행

다음 위치에서 예제를 실행할 수 있습니다.

프로젝트 구조

Config, MediaControls 및 MediaPlayer 모듈이 포함된 Qt Creator 프로젝트 구조

이 애플리케이션 아키텍처는 세 개의 사용자 정의 QML 모듈로 구성됩니다:

  • MediaControl
  • MediaPlayer
  • Config

이는 최상위 CMakeLists.txt 파일에도 반영되어 있습니다:

add_subdirectory(MediaPlayer)

target_link_libraries(MediaPlayerApp PRIVATE
    Qt6::Core
    Qt6::Svg
    Qt6::Quick
    Qt6::Multimedia
    MediaControlsplugin
    MediaPlayerplugin
    Configplugin

각 QML 모듈은 qt_add_qml_module 매크로를 사용하여 생성됩니다. 예를 들어, Config 모듈이 어떻게 생성되는지 확인해 보세요.

qt_add_library(Config STATIC)

set_source_files_properties(Config.qml
    PROPERTIES
        QT_QML_SINGLETON_TYPE true
)

qt_add_qml_module(Config
    URI "Config"
    OUTPUT_DIRECTORY Config
    QML_FILES
        "Config.qml"
)

Qt Quick 애플리케이션

본질적으로 이 애플리케이션은 QML 애플리케이션입니다. 이에 대한 구체적인 정보는 『 Qt Quick 프로그래밍 시작하기: 알람 애플리케이션』을 참조하십시오. 이 문서는 이 예제가 Qt Multimedia QML Types.

사용자 정의 Config QML 모듈

이 유형은 대상 운영 체제에 따라 애플리케이션의 테마와 레이아웃을 제어합니다.

먼저 이를 싱글톤으로 선언합니다. 인스턴스화는 한 번만 필요하며, 복사본을 생성하는 것은 자원 낭비가 되기 때문입니다.

이를 위해 다음 코드를 Config.qml

pragma Singleton

그런 다음 Config 디렉터리 내에 qmldir 라는 이름의 qmldir 파일을 생성하고, 그 안에 다음 내용을 포함시킵니다:

module Config
singleton Config 1.0 Config.qml

이제 애플리케이션에서 이를 사용하려면, MediaPlayer 디렉터리의 Main.qml 파일에서 어떻게 참조되는지 확인해 보세요:

    color: Config.mainColor

사용자 정의 MediaControls QML 모듈

이 모듈에는 다음을 포함하여 애플리케이션의 컨트롤을 정의하는 데 사용되는 모든 유형이 포함되어 있습니다:

진행률 슬라이더, 재생 버튼, 볼륨 슬라이더가 포함된 미디어 플레이어 제어 기능

  • AudioControl.qml
  • ControlImages.qml
  • CustomButton.qml
  • CustomRadioButton.qml
  • CustomSlider.qml
  • PlaybackControl.qml
  • 재생 속도 제어.qml
  • PlaybackSeekControl.qml

이러한 컨트롤이 어떻게 구현되었는지에 대한 자세한 내용은 각 유형별 정의 파일을 참조하십시오. 이들은 QML 미디어 플레이어 예제의 컨트롤을 발전시킨 것입니다.

사용자 정의 MediaPlayer QML 모듈

이 모듈에는 애플리케이션의 대부분의 최상위 유형이 사용되는 위치를 선언하는 Main.qml 파일이 포함되어 있으며, 무엇보다도 Qt Multimedia MediaPlayer 및 VideoOutput QML 유형이 선언되어 있습니다.

    MediaPlayer {
        id: mediaPlayer

        playbackRate: playbackControl.playbackRate
        videoOutput: videoOutput
        audioOutput: AudioOutput {
            id: audio
            volume: playbackControl.volume
        }
        source: new URL("https://download.qt.io/learning/videos/media-player-example/Qt_LogoMergeEffect.mp4")

        function updateMetadata() {
            root.metadataInfo.clear()
            root.metadataInfo.read(mediaPlayer.metaData)
        }

        onMetaDataChanged: updateMetadata()
        onActiveTracksChanged: updateMetadata()
        onErrorOccurred: {
            errorPopup.errorMsg = mediaPlayer.errorString
            errorPopup.open()
        }
        onTracksChanged: {
            settingsInfo.tracksInfo.selectedAudioTrack = mediaPlayer.activeAudioTrack
            settingsInfo.tracksInfo.selectedVideoTrack = mediaPlayer.activeVideoTrack
            settingsInfo.tracksInfo.selectedSubtitleTrack = mediaPlayer.activeSubtitleTrack
            updateMetadata()
        }

        onMediaStatusChanged: {
            if ((MediaPlayer.EndOfMedia === mediaStatus && mediaPlayer.loops !== MediaPlayer.Infinite) &&
                    ((root.currentFile < playlistInfo.mediaCount - 1) || playlistInfo.isShuffled)) {
                if (!playlistInfo.isShuffled) {
                    ++root.currentFile
                }
                root.playMedia()
            } else if (MediaPlayer.EndOfMedia === mediaStatus && root.playlistLooped && playlistInfo.mediaCount) {
                root.currentFile = 0
                root.playMedia()
            }
        }
    }

    VideoOutput {
        id: videoOutput

        anchors.top: fullScreen || Config.isMobileTarget ? parent.top : menuBar.bottom
        anchors.bottom: fullScreen ? parent.bottom : playbackControl.top
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.leftMargin: fullScreen ? 0 : 20
        anchors.rightMargin: fullScreen ? 0 : 20
        visible: mediaPlayer.hasVideo

        property bool fullScreen: false

        TapHandler {
            onDoubleTapped: {
                if (parent.fullScreen) {
                    root.showNormal()
                } else {
                    root.showFullScreen()
                }
                parent.fullScreen = !parent.fullScreen
            }
            onTapped: {
                root.closeOverlays()
            }
        }
    }

이 모듈에는 파일 정보를 가져오고 표시하는 데 사용되는 다른 사용자 정의 유형들과 파일 선택기를 호출하는 기능도 포함되어 있습니다.

  • ErrorPopup.qml
  • Images.qml
  • MetadataInfo.qml
  • PlayerMenuBar.qml
  • PlaylistInfo.qml
  • SettingsInfo.qml
  • ThemeInfo.qml
  • TouchMenu.qml
  • TracksInfo.qml
  • TracksOptions.qml
  • UrlPopup.qml

각 특정 유형의 구현 방식에 대한 자세한 내용은 해당 유형의 정의 파일을 참조하십시오. 일부는 QML 미디어 플레이어 예제에서 볼 수 있는 유형을 발전시킨 것입니다.

새로운 기능

이 예제 애플리케이션에는 ` PlaylistInfo ` 및 ` ThemeInfo`과 같이 타입을 통해 구현된 몇 가지 새로운 기능이 있습니다. 이러한 기능이 어떻게 구현되었는지에 대한 자세한 내용은 해당 .qml 파일을 참조하십시오.

소스 파일

code.qt.io의 예제 프로젝트

관련 항목: 모든 Qt 예제, Qt Quick 예제 및 튜토리얼, Qt Multimedia 예제.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.