// Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtMultimedia Rectangle { id : cameraUI width: 800 height: 480 color: "black" state: "PhotoCapture" states: [ State { name: "PhotoCapture" StateChangeScript { script: { camera.start() } } }, State { name: "PhotoPreview" }, State { name: "VideoCapture" StateChangeScript { script: { camera.start() } } }, State { name: "VideoPreview" StateChangeScript { script: { camera.stop() } } } ] CaptureSession { id: captureSession camera: Camera { id: camera } imageCapture: ImageCapture { id: imageCapture } recorder: MediaRecorder { id: recorder // resolution: "640x480" // frameRate: 30 } videoOutput: vloader.item } PhotoPreview { id : photoPreview anchors.fill : parent onClosed: cameraUI.state = "PhotoCapture" visible: (cameraUI.state === "PhotoPreview") focus: visible source: imageCapture.preview } VideoPreview { id : videoPreview anchors.fill : parent onClosed: cameraUI.state = "VideoCapture" visible: (cameraUI.state === "VideoPreview") focus: visible //don't load recorded video if preview is invisible source: visible ? recorder.actualLocation : "" } PhotoCaptureControls { id: stillControls state: controlLayout.state anchors.fill: parent buttonsWidth: controlLayout.buttonsWidth buttonsPanelPortraitHeight: cameraUI.buttonsPanelPortraitHeight buttonsPanelWidth: cameraUI.buttonsPanelLandscapeWidth captureSession: captureSession visible: (cameraUI.state === "PhotoCapture") onPreviewSelected: cameraUI.state = "PhotoPreview" onVideoModeSelected: cameraUI.state = "VideoCapture" previewAvailable: true//imageCapture.preview.length !== 0 } VideoCaptureControls { id: videoControls state: controlLayout.state anchors.fill: parent buttonsWidth: controlLayout.buttonsWidth buttonsPanelPortraitHeight: cameraUI.buttonsPanelPortraitHeight buttonsPanelWidth: cameraUI.buttonsPanelLandscapeWidth captureSession: captureSession visible: (cameraUI.state === "VideoCapture") onPreviewSelected: cameraUI.state = "VideoPreview" onPhotoModeSelected: cameraUI.state = "PhotoCapture" } property string platformScreen: "" property int buttonsPanelLandscapeWidth: cameraUI.width/2 property int buttonsPanelPortraitHeight: cameraUI.height/3 Loader { id: vloader asynchronous: true anchors.fill: parent active:true opacity: (status === Loader.Ready) ? 1 : 0 Behavior on opacity { NumberAnimation { duration: 50 } } sourceComponent: VideoOutput { id: viewfinder visible: ((cameraUI.state === "PhotoCapture") || (cameraUI.state === "VideoCapture")) anchors.fill: parent // autoOrientation: true } } Timer { interval: 50 repeat: true running: true onTriggered: { vloader.active = !vloader.active } } Item { id: controlLayout readonly property bool isMobile: Qt.platform.os === "android" || Qt.platform.os === "ios" readonly property bool isLandscape: Screen.desktopAvailableWidth >= Screen.desktopAvailableHeight property int buttonsWidth: state === "MobilePortrait" ? Screen.desktopAvailableWidth / 3.4 : 114 states: [ State { name: "Other" when: !controlLayout.isMobile } ] onStateChanged: { console.log("State: " + controlLayout.state) } } }