aboutsummaryrefslogtreecommitdiffstats
path: root/examples/multimedia/camera/videosettings.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/multimedia/camera/videosettings.py')
-rw-r--r--examples/multimedia/camera/videosettings.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/examples/multimedia/camera/videosettings.py b/examples/multimedia/camera/videosettings.py
new file mode 100644
index 000000000..a88cb39ed
--- /dev/null
+++ b/examples/multimedia/camera/videosettings.py
@@ -0,0 +1,167 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import os
+from PySide6.QtMultimedia import (QCameraFormat, QMediaFormat, QMediaRecorder,
+ QVideoFrameFormat)
+from PySide6.QtWidgets import QDialog
+
+is_android = os.environ.get('ANDROID_ARGUMENT')
+
+if is_android:
+ from ui_videosettings_mobile import Ui_VideoSettingsUi
+else:
+ from ui_videosettings import Ui_VideoSettingsUi
+
+
+def box_value(box):
+ idx = box.currentIndex()
+ return None if idx == -1 else box.itemData(idx)
+
+
+def select_combo_box_item(box, value):
+ idx = box.findData(value)
+ if idx != -1:
+ box.setCurrentIndex(idx)
+
+
+def to_formatted_string(cameraFormat):
+ pf = cameraFormat.pixelFormat()
+ format_name = QVideoFrameFormat.pixelFormatToString(pf)
+ w = cameraFormat.resolution().width()
+ h = cameraFormat.resolution().height()
+ min_rate = int(cameraFormat.minFrameRate())
+ max_rate = int(cameraFormat.maxFrameRate())
+ return f"{format_name} {w}x{h} {min_rate}-{max_rate}FPS"
+
+
+class VideoSettings(QDialog):
+
+ def __init__(self, mediaRecorder, parent=None):
+ super().__init__(parent)
+
+ self._media_recorder = mediaRecorder
+
+ self.m_updatingFormats = False
+
+ self._ui = Ui_VideoSettingsUi()
+ self._ui.setupUi(self)
+
+ # sample rate:
+ audio_device = self._media_recorder.captureSession().audioInput().device()
+ self._ui.audioSampleRateBox.setRange(audio_device.minimumSampleRate(),
+ audio_device.maximumSampleRate())
+
+ # camera format
+ self._ui.videoFormatBox.addItem("Default camera format",
+ QCameraFormat())
+
+ camera = self._media_recorder.captureSession().camera()
+ video_formats = camera.cameraDevice().videoFormats()
+
+ for format in video_formats:
+ self._ui.videoFormatBox.addItem(to_formatted_string(format), format)
+
+ self._ui.videoFormatBox.currentIndexChanged.connect(self.video_format_changed)
+ self.set_fps_range(camera.cameraFormat())
+
+ self._ui.fpsSlider.valueChanged.connect(self._ui.fpsSpinBox.setValue)
+ self._ui.fpsSpinBox.valueChanged.connect(self._ui.fpsSlider.setValue)
+
+ self.update_formats_and_codecs()
+ self._ui.audioCodecBox.currentIndexChanged.connect(self.update_formats_and_codecs)
+ self._ui.videoCodecBox.currentIndexChanged.connect(self.update_formats_and_codecs)
+ self._ui.containerFormatBox.currentIndexChanged.connect(self.update_formats_and_codecs)
+
+ self._ui.qualitySlider.setRange(0, QMediaRecorder.VeryHighQuality.value)
+
+ format = self._media_recorder.mediaFormat()
+ select_combo_box_item(self._ui.containerFormatBox, format.fileFormat())
+ select_combo_box_item(self._ui.audioCodecBox, format.audioCodec())
+ select_combo_box_item(self._ui.videoCodecBox, format.videoCodec())
+
+ self._ui.qualitySlider.setValue(self._media_recorder.quality().value)
+ self._ui.audioSampleRateBox.setValue(self._media_recorder.audioSampleRate())
+ select_combo_box_item(self._ui.videoFormatBox, camera.cameraFormat())
+
+ self._ui.fpsSlider.setValue(self._media_recorder.videoFrameRate())
+ self._ui.fpsSpinBox.setValue(self._media_recorder.videoFrameRate())
+
+ def apply_settings(self):
+ format = QMediaFormat()
+ format.setFileFormat(box_value(self._ui.containerFormatBox))
+ format.setAudioCodec(box_value(self._ui.audioCodecBox))
+ format.setVideoCodec(box_value(self._ui.videoCodecBox))
+
+ self._media_recorder.setMediaFormat(format)
+ q = self._ui.qualitySlider.value()
+ self._media_recorder.setQuality(QMediaRecorder.Quality(q))
+ self._media_recorder.setAudioSampleRate(self._ui.audioSampleRateBox.value())
+
+ camera_format = box_value(self._ui.videoFormatBox)
+ self._media_recorder.setVideoResolution(camera_format.resolution())
+ self._media_recorder.setVideoFrameRate(self._ui.fpsSlider.value())
+
+ camera = self._media_recorder.captureSession().camera()
+ camera.setCameraFormat(camera_format)
+
+ def update_formats_and_codecs(self):
+ if self.m_updatingFormats:
+ return
+ self.m_updatingFormats = True
+
+ format = QMediaFormat()
+ if self._ui.containerFormatBox.count():
+ format.setFileFormat(box_value(self._ui.containerFormatBox))
+ if self._ui.audioCodecBox.count():
+ format.setAudioCodec(box_value(self._ui.audioCodecBox))
+ if self._ui.videoCodecBox.count():
+ format.setVideoCodec(box_value(self._ui.videoCodecBox))
+
+ current_index = 0
+ self._ui.audioCodecBox.clear()
+ self._ui.audioCodecBox.addItem("Default audio codec",
+ QMediaFormat.AudioCodec.Unspecified)
+ for codec in format.supportedAudioCodecs(QMediaFormat.Encode):
+ if codec == format.audioCodec():
+ current_index = self._ui.audioCodecBox.count()
+ desc = QMediaFormat.audioCodecDescription(codec)
+ self._ui.audioCodecBox.addItem(desc, codec)
+
+ self._ui.audioCodecBox.setCurrentIndex(current_index)
+
+ current_index = 0
+ self._ui.videoCodecBox.clear()
+ self._ui.videoCodecBox.addItem("Default video codec",
+ QMediaFormat.VideoCodec.Unspecified)
+ for codec in format.supportedVideoCodecs(QMediaFormat.Encode):
+ if codec == format.videoCodec():
+ current_index = self._ui.videoCodecBox.count()
+ desc = QMediaFormat.videoCodecDescription(codec)
+ self._ui.videoCodecBox.addItem(desc, codec)
+
+ self._ui.videoCodecBox.setCurrentIndex(current_index)
+
+ current_index = 0
+ self._ui.containerFormatBox.clear()
+ self._ui.containerFormatBox.addItem("Default file format",
+ QMediaFormat.UnspecifiedFormat)
+ for container in format.supportedFileFormats(QMediaFormat.Encode):
+ if container == format.fileFormat():
+ current_index = self._ui.containerFormatBox.count()
+ desc = QMediaFormat.fileFormatDescription(container)
+ self._ui.containerFormatBox.addItem(desc, container)
+
+ self._ui.containerFormatBox.setCurrentIndex(current_index)
+
+ self.m_updatingFormats = False
+
+ def video_format_changed(self):
+ camera_format = box_value(self._ui.videoFormatBox)
+ self.set_fps_range(camera_format)
+
+ def set_fps_range(self, format):
+ min_fr = format.minFrameRate()
+ max_fr = format.maxFrameRate()
+ self._ui.fpsSlider.setRange(min_fr, max_fr)
+ self._ui.fpsSpinBox.setRange(min_fr, max_fr)