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 ComboBox
es in SettingsPopup
abgefragt, um den aktuellen Track auszuwählen.
settingsController.mediaPlayer.pause() tracksInfo.selectedTrack = currentIndex settingsController.mediaPlayer.play()
© 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.