Revision control
Copy as Markdown
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtMultimedia
Window {
id: root
visible: true
title: "Media recorder"
width: Style.screenWidth
height: Style.screenHeigth
color: palette.window
onWidthChanged:{
Style.calculateRatio(root.width, root.height)
}
VideoOutput {
id: videoOutput
anchors.fill: parent
visible: !playback.playing
}
Popup {
id: recorderError
anchors.centerIn: Overlay.overlay
Text { id: recorderErrorText }
}
CaptureSession {
id: captureSession
recorder: recorder
audioInput: controls.audioInput
camera: controls.camera
screenCapture: controls.screenCapture
windowCapture: controls.windowCapture
videoOutput: videoOutput
}
MediaRecorder {
id: recorder
onRecorderStateChanged:
(state) => {
if (state === MediaRecorder.StoppedState) {
root.contentOrientation = Qt.PrimaryOrientation
mediaList.append()
} else if (state === MediaRecorder.RecordingState && captureSession.camera) {
// lock orientation while recording and create a preview image
root.contentOrientation = Screen.orientation;
videoOutput.grabToImage(function(res) { mediaList.mediaThumbnail = res.url })
}
}
onActualLocationChanged: (url) => { mediaList.mediaUrl = url }
onErrorOccurred: { recorderErrorText.text = recorder.errorString; recorderError.open(); }
}
Playback {
id: playback
anchors {
fill: parent
margins: 50
}
active: controls.capturesVisible
}
Frame {
id: mediaListFrame
height: 150
width: parent.width
anchors.bottom: controlsFrame.top
x: controls.capturesVisible ? 0 : parent.width
background: Rectangle {
anchors.fill: parent
color: palette.base
opacity: 0.8
}
Behavior on x { NumberAnimation { duration: 200 } }
MediaList {
id: mediaList
anchors.fill: parent
playback: playback
}
}
Frame {
id: controlsFrame
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
height: controls.height + Style.interSpacing * 2 + (settingsEncoder.visible? settingsEncoder.height : 0) +(settingsMetaData.visible? settingsMetaData.height : 0)
background: Rectangle {
anchors.fill: parent
color: palette.base
opacity: 0.8
}
Behavior on height { NumberAnimation { duration: 100 } }
ColumnLayout {
anchors.fill: parent
Controls {
Layout.alignment: Qt.AlignHCenter
id: controls
recorder: recorder
}
StyleRectangle {
Layout.alignment: Qt.AlignHCenter
Layout.preferredHeight: 1
Layout.preferredWidth: controls.width
visible: controls.settingsVisible
}
SettingsEncoder {
id:settingsEncoder
Layout.alignment: Qt.AlignHCenter
visible: controls.settingsVisible
padding: Style.interSpacing
recorder: recorder
}
SettingsMetaData {
id: settingsMetaData
Layout.alignment: Qt.AlignHCenter
visible: !Style.isMobile() && controls.settingsVisible
recorder: recorder
}
}
}
Pane {
anchors.fill: parent
visible:
PermissionHelper.cameraStatus !== Qt.PermissionStatus.Granted
&& PermissionHelper.microphoneStatus !== Qt.PermissionStatus.Granted
ColumnLayout {
anchors.centerIn: parent
Label {
Layout.alignment: Qt.AlignHCenter
text: "Camera and microphone permissions must be granted to use this example"
}
Button {
Layout.alignment: Qt.AlignHCenter
text: "Press to request permissions"
onClicked: {
if (PermissionHelper.cameraStatus !== Qt.PermissionStatus.Granted)
PermissionHelper.requestCamera()
if (PermissionHelper.microphoneStatus !== Qt.PermissionStatus.Granted)
PermissionHelper.requestMicrophone()
}
}
}
}
}