- Disable sound initialization to prevent hanging
- Add missing import re in utils.py
- Fix settings loading for QSettings
- Update file paths to use PROJECT_ROOT
- Revert to working API paths and listener from commit efdc63e
420 lines
12 KiB
QML
420 lines
12 KiB
QML
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
|
|
|
import QtQuick
|
|
import QtMultimedia
|
|
|
|
/*!
|
|
\qmltype Video
|
|
\inherits Item
|
|
\ingroup multimedia_qml
|
|
\ingroup multimedia_video_qml
|
|
\inqmlmodule QtMultimedia
|
|
\brief A convenience type for showing a specified video.
|
|
|
|
\c Video is a convenience type combining the functionality
|
|
of a \l MediaPlayer and a \l VideoOutput into one. It provides
|
|
simple video playback functionality without having to declare multiple
|
|
types.
|
|
|
|
The following is sample code to implement video playback in a scene.
|
|
|
|
\qml
|
|
Video {
|
|
id: video
|
|
width : 800
|
|
height : 600
|
|
source: "video.avi"
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
onClicked: {
|
|
video.play()
|
|
}
|
|
}
|
|
|
|
focus: true
|
|
Keys.onSpacePressed: video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play()
|
|
Keys.onLeftPressed: video.position = video.position - 5000
|
|
Keys.onRightPressed: video.position = video.position + 5000
|
|
}
|
|
\endqml
|
|
|
|
The source file, \c video.avi, plays when you click the parent
|
|
of MouseArea. The video plays in an area of 800 by 600 pixels, and its \c id
|
|
property has the value \b{video}.
|
|
|
|
Notice that because signals for the \l Keys have been defined pressing the:
|
|
\list
|
|
\li \uicontrol Spacebar toggles the pause button.
|
|
\li \uicontrol{Left Arrow} moves the current position in the video to 5 seconds
|
|
previously.
|
|
\li \uicontrol{Right Arrow} advances the current position in the video by 5 seconds.
|
|
\endlist
|
|
|
|
Video supports un-transformed, stretched, and uniformly scaled
|
|
video presentation. For a description of stretched uniformly scaled
|
|
presentation, see the \l fillMode property description.
|
|
|
|
\sa MediaPlayer, VideoOutput
|
|
|
|
\omit
|
|
\section1 Screen Saver
|
|
|
|
If it is likely that an application will be playing video for an extended
|
|
period of time without user interaction, it may be necessary to disable
|
|
the platform's screen saver. The \l ScreenSaver (from \l QtSystemInfo)
|
|
may be used to disable the screensaver in this fashion:
|
|
|
|
\qml
|
|
import QtSystemInfo 5.0
|
|
|
|
ScreenSaver { screenSaverEnabled: false }
|
|
\endqml
|
|
\endomit
|
|
*/
|
|
|
|
// TODO: Restore Qt System Info docs when the module is released
|
|
|
|
Item {
|
|
id: video
|
|
implicitWidth: videoOut.implicitWidth
|
|
implicitHeight: videoOut.implicitHeight
|
|
|
|
/*** Properties of VideoOutput ***/
|
|
/*!
|
|
\qmlproperty enumeration Video::fillMode
|
|
|
|
Set this property to define how the video is scaled to fit the target
|
|
area.
|
|
|
|
\list
|
|
\li VideoOutput.Stretch - the video is scaled to fit
|
|
\li VideoOutput.PreserveAspectFit - the video is scaled uniformly to fit without
|
|
cropping
|
|
\li VideoOutput.PreserveAspectCrop - the video is scaled uniformly to fill, cropping
|
|
if necessary
|
|
\endlist
|
|
|
|
Because this type is for convenience in QML, it does not
|
|
support enumerations directly, so enumerations from \c VideoOutput are
|
|
used to access the available fill modes.
|
|
|
|
The default fill mode is preserveAspectFit.
|
|
*/
|
|
property alias fillMode: videoOut.fillMode
|
|
|
|
/*!
|
|
\qmlproperty enumeration Video::endOfStreamPolicy
|
|
\since 6.9
|
|
|
|
This property specifies the policy to apply when the video stream ends.
|
|
|
|
The \c endOfStreamPolicy can be one of:
|
|
|
|
\value ClearOutput The video output is cleared.
|
|
\value KeepLastFrame The video output continues displaying the last
|
|
frame. Use the method \l clearOutput() to
|
|
clear the output manually.
|
|
|
|
The default value is \c VideoOutput.ClearOutput.
|
|
*/
|
|
property alias endOfStreamPolicy: videoOut.endOfStreamPolicy
|
|
|
|
/*!
|
|
\qmlproperty int Video::orientation
|
|
\since 6.9
|
|
|
|
This property determines the angle, in degrees, at which the displayed video
|
|
is rotated clockwise in video coordinates, where the Y-axis points
|
|
downwards on the display.
|
|
The orientation transformation is applied before \l mirrored.
|
|
|
|
Only multiples of \c 90 degrees are supported, that is 0, 90, -90, 180, 270, etc.,
|
|
otherwise, the specified value is ignored.
|
|
|
|
The default value is \c 0.
|
|
*/
|
|
property alias orientation: videoOut.orientation
|
|
|
|
|
|
/*!
|
|
\qmlproperty int Video::mirrored
|
|
|
|
Determines whether the displayed video is mirrored around its vertical axis.
|
|
The mirroring is applied after \l orientation.
|
|
The default value is \c false.
|
|
*/
|
|
property alias mirrored: videoOut.mirrored
|
|
|
|
|
|
/*** Properties of MediaPlayer ***/
|
|
|
|
/*!
|
|
\qmlproperty enumeration Video::playbackState
|
|
|
|
This read only property indicates the playback state of the media.
|
|
|
|
\list
|
|
\li MediaPlayer.PlayingState - the media is playing
|
|
\li MediaPlayer.PausedState - the media is paused
|
|
\li MediaPlayer.StoppedState - the media is stopped
|
|
\endlist
|
|
|
|
The default state is MediaPlayer.StoppedState.
|
|
*/
|
|
property alias playbackState: player.playbackState
|
|
|
|
/*!
|
|
\qmlproperty real Video::bufferProgress
|
|
|
|
This property holds how much of the data buffer is currently filled,
|
|
from 0.0 (empty) to 1.0
|
|
(full).
|
|
*/
|
|
property alias bufferProgress: player.bufferProgress
|
|
|
|
/*!
|
|
\qmlproperty int Video::duration
|
|
|
|
This property holds the duration of the media in milliseconds.
|
|
|
|
If the media doesn't have a fixed duration (a live stream for example)
|
|
this will be 0.
|
|
*/
|
|
property alias duration: player.duration
|
|
|
|
/*!
|
|
\qmlproperty int Video::loops
|
|
|
|
Determines how often the media is played before stopping.
|
|
Set to MediaPlayer.Infinite to loop the current media file forever.
|
|
|
|
The default value is \c 1. Setting this property to \c 0 has no effect.
|
|
*/
|
|
property alias loops: player.loops
|
|
|
|
/*!
|
|
\qmlproperty enumeration Video::error
|
|
|
|
This property holds the error state of the video. It can be one of:
|
|
|
|
\list
|
|
\li MediaPlayer.NoError - there is no current error.
|
|
\li MediaPlayer.ResourceError - the video cannot be played due to a problem
|
|
allocating resources.
|
|
\li MediaPlayer.FormatError - the video format is not supported.
|
|
\li MediaPlayer.NetworkError - the video cannot be played due to network issues.
|
|
\li MediaPlayer.AccessDenied - the video cannot be played due to insufficient
|
|
permissions.
|
|
\li MediaPlayer.ServiceMissing - the video cannot be played because the media
|
|
service could not be
|
|
instantiated.
|
|
\endlist
|
|
*/
|
|
property alias error: player.error
|
|
|
|
/*!
|
|
\qmlproperty string Video::errorString
|
|
|
|
This property holds a string describing the current error condition in more detail.
|
|
*/
|
|
property alias errorString: player.errorString
|
|
|
|
/*!
|
|
\qmlproperty bool Video::hasAudio
|
|
|
|
This property holds whether the current media has audio content.
|
|
*/
|
|
property alias hasAudio: player.hasAudio
|
|
|
|
/*!
|
|
\qmlproperty bool Video::hasVideo
|
|
|
|
This property holds whether the current media has video content.
|
|
*/
|
|
property alias hasVideo: player.hasVideo
|
|
|
|
/*!
|
|
\qmlproperty mediaMetaData Video::metaData
|
|
|
|
This property holds the meta data for the current media.
|
|
|
|
See \l{MediaPlayer::metaData}{MediaPlayer.metaData} for details about each meta data key.
|
|
|
|
\sa {mediaMetaData}
|
|
*/
|
|
property alias metaData: player.metaData
|
|
|
|
/*!
|
|
\qmlproperty bool Video::muted
|
|
|
|
This property holds whether the audio output is muted.
|
|
*/
|
|
property alias muted: audioOutput.muted
|
|
|
|
/*!
|
|
\qmlproperty real Video::playbackRate
|
|
|
|
This property holds the rate at which video is played at as a multiple
|
|
of the normal rate.
|
|
*/
|
|
property alias playbackRate: player.playbackRate
|
|
|
|
/*!
|
|
\qmlproperty int Video::position
|
|
|
|
This property holds the current playback position in milliseconds.
|
|
*/
|
|
property alias position: player.position
|
|
|
|
/*!
|
|
\qmlproperty bool Video::seekable
|
|
|
|
This property holds whether the playback position of the video can be
|
|
changed.
|
|
|
|
If true, calling the \l seek() method or changing the \l position property
|
|
will cause playback to seek to the new position.
|
|
*/
|
|
property alias seekable: player.seekable
|
|
|
|
/*!
|
|
\qmlproperty url Video::source
|
|
|
|
This property holds the source URL of the media.
|
|
*/
|
|
property alias source: player.source
|
|
|
|
/*!
|
|
\since 6.7
|
|
\qmlproperty bool Video::autoPlay
|
|
|
|
This property controls whether the media begins to play automatically after it gets loaded.
|
|
Defaults to \c false.
|
|
*/
|
|
property alias autoPlay: player.autoPlay
|
|
|
|
/*!
|
|
\qmlproperty real Video::volume
|
|
|
|
This property holds the audio volume.
|
|
|
|
The volume is scaled linearly from \c 0.0 (silence) to \c 1.0
|
|
(full volume). Values outside this range will be clamped.
|
|
|
|
The default volume is \c 1.0.
|
|
|
|
UI volume controls should usually be scaled nonlinearly. For example,
|
|
using a logarithmic scale will produce linear changes in perceived
|
|
loudness, which is what a user would normally expect from a volume
|
|
control. See \l {QtAudio::convertVolume()} for more details.
|
|
*/
|
|
property alias volume: audioOutput.volume
|
|
|
|
/*!
|
|
\qmlsignal Video::paused()
|
|
|
|
This signal is emitted when playback is paused.
|
|
*/
|
|
signal paused
|
|
|
|
/*!
|
|
\qmlsignal Video::stopped()
|
|
|
|
This signal is emitted when playback is stopped.
|
|
*/
|
|
signal stopped
|
|
|
|
/*!
|
|
\qmlsignal Video::playing()
|
|
|
|
This signal is emitted when playback is started or continued.
|
|
*/
|
|
signal playing
|
|
|
|
/*!
|
|
\qmlsignal Video::errorOccurred(error, errorString)
|
|
|
|
This signal is emitted when an \a error has occurred. The \a errorString
|
|
parameter may contain more detailed information about the error.
|
|
*/
|
|
signal errorOccurred(int error, string errorString)
|
|
|
|
VideoOutput {
|
|
id: videoOut
|
|
anchors.fill: video
|
|
}
|
|
|
|
MediaPlayer {
|
|
id: player
|
|
onPlaybackStateChanged: function(newState) {
|
|
if (newState === MediaPlayer.PausedState)
|
|
video.paused();
|
|
else if (newState === MediaPlayer.StoppedState)
|
|
video.stopped();
|
|
else
|
|
video.playing();
|
|
}
|
|
onErrorOccurred: function(error, errorString) {
|
|
video.errorOccurred(error, errorString);
|
|
}
|
|
videoOutput: videoOut
|
|
audioOutput: AudioOutput {
|
|
id: audioOutput
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\qmlmethod Video::play()
|
|
|
|
Starts playback of the media.
|
|
*/
|
|
function play() {
|
|
player.play();
|
|
}
|
|
|
|
/*!
|
|
\qmlmethod Video::pause()
|
|
|
|
Pauses playback of the media.
|
|
*/
|
|
function pause() {
|
|
player.pause();
|
|
}
|
|
|
|
/*!
|
|
\qmlmethod Video::stop()
|
|
|
|
Stops playback of the media.
|
|
*/
|
|
function stop() {
|
|
player.stop();
|
|
}
|
|
|
|
/*!
|
|
\qmlmethod Video::seek(offset)
|
|
|
|
If the \l seekable property is true, seeks the current
|
|
playback position to \a offset.
|
|
|
|
\sa seekable, position
|
|
*/
|
|
function seek(offset) {
|
|
player.position = offset;
|
|
}
|
|
|
|
/*!
|
|
\qmlmethod Video::clearOutput()
|
|
\since 6.9
|
|
|
|
Clears the video output by removing the current video frame.
|
|
This method is recommended when you need to remove the last video frame after
|
|
the video stream ends with the \l endOfStreamPolicy Video property
|
|
set to \c KeepLastFrame.
|
|
*/
|
|
function clearOutput() {
|
|
videoOut.clearOutput();
|
|
}
|
|
}
|