Files
poc-qt/poc004/qml/main.qml

189 lines
5.2 KiB
QML

// file: poc-qt/poc004/qml/main.qml
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtMultimedia
ApplicationWindow {
visible: true
width: 1100
height: 760
title: "POC004 - Webcam + Micro + Capture + Record"
MediaDevices {
id: mediaDevices
}
Camera {
id: camera
cameraDevice: mediaDevices.defaultVideoInput
}
AudioInput {
id: microphone
}
ImageCapture {
id: imageCapture
onImageSaved: function(requestId, filePath) {
statusLabel.text = "Image saved: " + filePath
}
onErrorOccurred: function(requestId, error, errorString) {
statusLabel.text = "Image error: " + errorString
}
}
MediaRecorder {
id: recorder
quality: MediaRecorder.VeryHighQuality
onRecorderStateChanged: {
if (recorder.recorderState === MediaRecorder.RecordingState) {
statusLabel.text = "Recording video..."
} else if (recorder.recorderState === MediaRecorder.StoppedState) {
statusLabel.text = "Recorder stopped"
}
}
onErrorOccurred: function(error, errorString) {
statusLabel.text = "Recorder error: " + errorString
}
}
CaptureSession {
id: captureSession
camera: camera
audioInput: microphone
imageCapture: imageCapture
recorder: recorder
videoOutput: videoOutput
}
ColumnLayout {
anchors.fill: parent
anchors.margins: 12
spacing: 10
Rectangle {
Layout.fillWidth: true
Layout.fillHeight: true
color: "black"
border.width: 1
border.color: "#555"
VideoOutput {
id: videoOutput
anchors.fill: parent
fillMode: VideoOutput.PreserveAspectFit
}
}
RowLayout {
Layout.fillWidth: true
spacing: 8
Button {
text: camera.active ? "Stop camera" : "Start camera"
onClicked: {
camera.active = !camera.active
if (camera.active) {
statusLabel.text = "Camera started"
} else {
statusLabel.text = "Camera stopped"
}
}
}
Button {
text: "Take snapshot"
onClicked: {
imageCapture.captureToFile("/home/sinus/Projects/poc-qt/target/captures_imgs/image_" + Date.now() + ".jpg")
}
}
Button {
text: recorder.recorderState === MediaRecorder.RecordingState ? "Stop recording" : "Start recording"
onClicked: {
if (recorder.recorderState === MediaRecorder.RecordingState) {
recorder.stop()
} else {
recorder.outputLocation = "file:///home/sinus/Projects/poc-qt/target/captures_vids/video_" + Date.now() + ".mp4"
recorder.record()
}
}
}
Button {
text: "Restart camera"
onClicked: {
camera.stop()
camera.start()
}
}
}
RowLayout {
Layout.fillWidth: true
spacing: 8
Label {
text: mediaDevices.videoInputs.length > 0
? ("Camera: " + camera.cameraDevice.description)
: "No camera detected"
Layout.fillWidth: true
wrapMode: Text.WrapAnywhere
}
Label {
text: "Mic active"
}
}
Label {
id: statusLabel
Layout.fillWidth: true
text: "Ready"
wrapMode: Text.WrapAnywhere
}
ListView {
Layout.fillWidth: true
Layout.preferredHeight: 120
clip: true
model: mediaDevices.videoInputs
delegate: Rectangle {
width: ListView.view.width
height: 32
color: camera.cameraDevice.id === modelData.id ? "#334" : "transparent"
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 8
text: modelData.description
color: "white"
}
MouseArea {
anchors.fill: parent
onClicked: {
camera.stop()
camera.cameraDevice = modelData
camera.start()
statusLabel.text = "Switched camera to: " + modelData.description
}
}
}
}
}
Component.onCompleted: {
if (mediaDevices.videoInputs.length > 0) {
camera.start()
statusLabel.text = "Camera started"
} else {
statusLabel.text = "No camera detected"
}
}
}