QML Media Player Beispiel

Abspielen von Audio- und Videodateien mit dem Typ QML MediaPlayer.

Dieses Beispiel demonstriert einen einfachen Multimedia-Player, der Audio- und Videodateien mit verschiedenen Codecs abspielen kann.

Ausführen des Beispiels

Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel unter Examples aus. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.

Instanziieren des MediaPlayers

Der Einstiegspunkt für den QML-Code in diesem Beispiel ist Main.qml. Hier wird ein ApplicationWindow erstellt und Eigenschaften wie id, title, width und height werden festgelegt.

ApplicationWindow {
    id: root
    title: qsTr("Multimedia Player")
    width: 1280
    height: 720

Als nächstes wird MediaPlayer erstellt und die beiden Eigenschaften, die für die Video- und Audioausgabe verantwortlich sind, werden definiert. Erstens videoOutput, das den Videosucher wiedergibt, und zweitens audioOutput, das die Audioausgabe für den Player bereitstellt.

MediaPlayer {
    id: mediaPlayer
    ...
videoOutput: videoOutput
audioOutput: AudioOutput {
    id: audio
    muted: playbackController.muted
    volume: playbackController.volume
}
    ...
VideoOutput {
    id: videoOutput
    anchors.fill: parent
    visible: mediaPlayer.mediaStatus > 0

    TapHandler {
        onDoubleTapped: {
            root.fullScreen ?  root.showNormal() : root.showFullScreen()
            root.fullScreen = !root.fullScreen
        }
    }
}

Die Eigenschaft visible des Typs VideoOutput wird auf true gesetzt, wenn die Eigenschaft mediaStatus des Typs MediaPlayer größer als 0 ist. mediaStatus ist vom Typ Aufzählung und ist gleich 0, wenn keine Medien eingestellt wurden, und größer als 0, wenn dies nicht der Fall ist. Daher ist VideoOutput sichtbar, wenn Medien eingestellt wurden.

Der Typ MediaPlayer hat eine Signaleigenschaft namens onErrorOccurred, die speziell für die Behandlung von Fehlern außer Kraft gesetzt werden kann. In diesem Fall öffnet das Signal ein MessageDialog mit der Methode open() und setzt dessen text Eigenschaft auf eine MediaPlayer Eigenschaft namens errorString.

onErrorOccurred: {
    mediaError.text = mediaPlayer.errorString
    mediaError.open()
}

Steuerelemente für die Wiedergabe

Um einen brauchbaren Media Player zu haben, muss es eine Schnittstelle zur Steuerung der Wiedergabe geben. Diese wird in einer eigenen Komponentendatei, PlaybackControl.qml, erstellt und in Main.qml instanziiert.

PlaybackControl {
    id: playbackController
    ...
onTracksChanged: {
    audioTracksInfo.read(mediaPlayer.audioTracks)
    videoTracksInfo.read(mediaPlayer.videoTracks)
    subtitleTracksInfo.read(mediaPlayer.subtitleTracks, 6) /* QMediaMetaData::Language = 6 */
    updateMetadata()
    mediaPlayer.play()
}

Bei der Erstellung werden Objekte an diesen Typ weitergeleitet, z. B. Titelinformationen, Metadateninformationen und das Objekt MediaPlayer selbst. In PlaybackControl.qml hat jedes dieser Objekte eine required property, was bedeutet, dass diese Eigenschaften bei der Erstellung des PlaybackControl Objekts festgelegt werden müssen.

Item {
    id: playbackController

    required property MediaPlayer mediaPlayer
    required property MetadataInfo metadataInfo
    required property TracksInfo audioTracksInfo
    required property TracksInfo videoTracksInfo
    required property TracksInfo subtitleTracksInfo

Diese Wiedergabesteuerungen können in Abschnitte unterteilt werden. Oben links im Bedienfeld befindet sich eine Sammlung von Schaltflächen, mit denen eine Datei geöffnet werden kann, entweder durch Auswahl einer Datei aus einem Datei-Explorer oder durch Eingabe einer URL. Die Datei wird in die MediaPlayer geladen, indem die Eigenschaft source gesetzt wird. Beide Schaltflächen werden mit Hilfe einer CustomButton custom component instanziiert.

CustomButton {
    id: fileDialogButton
    icon.source: "../images/open_new.svg"
    flat: false
    onClicked: fileDialog.open()
}

CustomButton {
    id: openUrlButton
    icon.source: "../images/link.svg"
    flat: false
    onClicked: urlPopup.open()
}

Es werden drei Schaltflächen erstellt und auf diesem Feld zentriert, die für die Wiedergabe, die Pause und die Suche nach zehn Sekunden rückwärts oder vorwärts zuständig sind. Die Medien werden mit den Methoden play() und pause() abgespielt bzw. pausiert. Um zu wissen, wann eine Abspiel- oder Pausentaste gezeichnet werden soll, wird die Eigenschaft playbackState abgefragt. Wenn sie z. B. dem Aufzählungswert MediaPlayer.PlayingState entspricht, wird die Pauseschaltfläche gezeichnet.

CustomRoundButton {
    id: playButton
    visible: playbackController.mediaPlayer.playbackState !== MediaPlayer.PlayingState
    icon.source: "../images/play_symbol.svg"
    onClicked: playbackController.mediaPlayer.play()
}

CustomRoundButton {
    id: pauseButton
    visible: playbackController.mediaPlayer.playbackState === MediaPlayer.PlayingState
    icon.source: "../images/pause_symbol.svg"
    onClicked: playbackController.mediaPlayer.pause()
}

Um zehn Sekunden vorwärts oder rückwärts zu navigieren, wird die position des Typs MediaPlayer um 10.000 Millisekunden inkrementiert und mit der Methode setPosition() gesetzt.

CustomRoundButton {
    id: forward10Button
    icon.source: "../images/forward10.svg"
    onClicked: {
        const pos = Math.min(playbackController.mediaPlayer.duration,
                           playbackController.mediaPlayer.position + 10000)
        playbackController.mediaPlayer.setPosition(pos)
    }
}

Wiedergabesuche und Audio

In PlaybackControl.qml werden ein AudioControl und ein PlaybackSeekControl Typ instanziiert. Diese sind beide in einer eigenen Komponentendatei definiert und für die Lautstärkeregelung bzw. die Wiedergabesuche zuständig. Der Typ AudioControl definiert eine Taste zum Stummschalten und eine Slider, von QtQuick Controls, zum Einstellen der Lautstärke des Players. Diese beiden Attribute werden durch die Definition der Eigenschaften mute und volume offengelegt und sind über die Definition AudioOutput in Main.qml zugänglich.

property alias muted: muteButton.checked
property real volume: slider.value

PlaybackSeekControl verwendet ein RowLayout mit einem Slider und einem Text auf beiden Seiten. Die beiden Text Elemente zeigen die aktuelle Zeit und die verbleibende Zeit des abgespielten Mediums an. Beide werden mit Hilfe von zwei Eigenschaften des Typs MediaPlayer berechnet: position, die die aktuelle Wiedergabeposition in Millisekunden angibt, und duration, die die Dauer des Mediums in Millisekunden angibt.

Text {
    id: currentTime
    Layout.preferredWidth: 45
    text: seekController.formatToMinutes(seekController.mediaPlayer.position)
    horizontalAlignment: Text.AlignLeft
    font.pixelSize: 11
}
    ...
Text {
    id: remainingTime
    Layout.preferredWidth: 45
    text: seekController.formatToMinutes(seekController.mediaPlayer.duration - seekController.mediaPlayer.position)
    horizontalAlignment: Text.AlignRight
    font.pixelSize: 11
}

Slider ist nur aktiviert, wenn der Medienplayer durchsuchbar ist und es sich beispielsweise nicht um Live-Medien handelt. Der Typ MediaPlayer hat dafür eine Eigenschaft namens seekable. Die value des Slider wird anhand der Eigenschaften position und duration des MediaPlayer berechnet.

enabled: seekController.mediaPlayer.seekable
value: seekController.mediaPlayer.position / seekController.mediaPlayer.duration

Metadaten und Track-Informationen

Der Typ PlaybackControl instanziiert eine SettingsPopup, die Informationen über die Metadaten des aktuell geladenen Mediums und die Titelauswahl sowie die Möglichkeit zur Aktualisierung der Wiedergaberate enthält. Dieses Popup ist in SettingsPopup.qml definiert.

Die Metadaten sind in einer eigenen Komponentendatei enthalten, MetadataInfo.qml. Sie enthält eine ListModel, eine Funktion zum Löschen der Metadaten, clear(), und eine Funktion zum Auffüllen der Metadaten, read(MediaMetadata metadata). Die Funktion read(MediaMetadata metadata) nimmt als Parameter ein Objekt des Typs MediaMetaData entgegen und navigiert durch dessen Schlüssel-Wert-Struktur, um die Daten in die model der ListView zu extrahieren. Die dazu verwendeten Methoden sind keys(), die alle Schlüssel der MediaMetaData zurückgibt, und {stringValue(Key key)}, der die value für einen bestimmten key zurückgibt.

function read(metadata) {
    if (!metadata)
        return
    for (const key of metadata.keys())
        if (metadata.stringValue(key))
            listModel.append({
                                name: metadata.metaDataKeyToString(key),
                                value: metadata.stringValue(key)
                            })
}

ListModel {
    id: listModel
}

Die Daten werden dann in SettingsPopup.qml in einem ListView Typ angezeigt. Die delegate dieser ListView ist eine Reihe von zwei Text Elementen, die den Schlüssel-Wert-Paaren entsprechen, die von dem MediaMetaData Element abstrahiert wurden.

Auf der anderen Seite des Popup befinden sich Steuerelemente für die Wiedergaberate und die Titelauswahl für Audio, Video und Untertitel. Die Wiedergaberate wird aus einem ComboBox ausgewählt und über die Eigenschaft playbackRate eingestellt.

settingsController.mediaPlayer.playbackRate = (currentIndex + 1) * 0.25

Der Typ TracksInfo, der in TracksInfo.qml definiert ist, enthält die Daten über die Spuren. Genauer gesagt, eine ListModel mit den Titeln der Tracks, oder speziell für Untertitel, die Sprachen. Diese Informationen werden in Main.qml durch den Aufruf der Funktion read(MediaMetadata mediaMetadata) eingegeben, die im Typ TracksInfo definiert ist.

onTracksChanged: {
    audioTracksInfo.read(mediaPlayer.audioTracks)
    videoTracksInfo.read(mediaPlayer.videoTracks)
    subtitleTracksInfo.read(mediaPlayer.subtitleTracks, 6) /* QMediaMetaData::Language = 6 */
    updateMetadata()
    mediaPlayer.play()
}

Die in TracksInfo definierte model wird dann in ComboBoxes in SettingsPopup abgefragt, um den aktuellen Track auszuwählen.

settingsController.mediaPlayer.pause()
tracksInfo.selectedTrack = currentIndex
settingsController.mediaPlayer.play()

Beispielprojekt @ code.qt.io

© 2025 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.