-
Bug
-
Resolution: Cannot Reproduce
-
P3: Somewhat important
-
None
-
5.7.0
-
None
-
Windows 10 64bit 1605, MSVC2013_64, Sprout by HP
The Camera QML documetation says:
deviceId : string
This property holds the unique identifier for the camera device being used.You can get all available device IDs from QtMultimedia.availableCameras. If no value is provided or if set to an empty string, the system's default camera will be used.
However, unless the (non-default) deviceId is hardcoded (f.ex needs to be determined from QtMultimedia.availableCameras), you'll not be able to actually open the camera.
Example:
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtMultimedia 5.6
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Don't touch my camera")
VideoOutput
{ anchors.fill: parent source: camera } Item {
id: hpcam
property bool ready: false
property string deviceId: ""
property var data: [[]]
Component.onCompleted: {
data = JSON.parse(JSON.stringify(QtMultimedia.availableCameras));
console.log(JSON.stringify(data))
for (var ii=0; ii< data.length; ii++)
ready = true
}
}
Camera
{ id: camera deviceId: hpcam.ready ? hpcam.deviceId : "" Component.onCompleted: console.log("CamStart is " + deviceId) onDeviceIdChanged: console.log("Cam changed to " + deviceId) viewfinder.resolution: "1280x720" onCameraStateChanged: console.log("CamState: " + cameraState) onDisplayNameChanged: console.log("New name: " + displayName) onError: console.log("Orror:" + errorCode + ": " + errorString) }}
On my multi-cam machine, by the time the deviceId is correctly defined, the video preview has irrevocably failed and does not react to changing the deviceId. Output of the above:
Starting C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe...
QML debugging is enabled. Only use this in a safe environment.
failed to find the video proc amp
Invalid viewfinder settings
Failed to configure preview format
qml: CamStart is @device:pnp:\\?\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#
qml: [{"deviceId":"@device:pnp:\\\\?
usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"USB Camera-OV580","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
root#image#0001#
global","displayName":"Forward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
root#image#0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"Downward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
usb#vid_8086&pid_0a66&mi_00#7&1446047e&0&0000#
global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) RGB","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
usb#vid_8086&pid_0a66&mi_02#7&1446047e&0&0002#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) Depth","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
root#image#0002#
global","displayName":"Intel(R) RealSense(TM) 3D Camera Virtual Driver","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
usb#vid_04f2&pid_b454&mi_00#7&305232d3&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"HP High Definition 1MP Webcam","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
usb#vid_03f0&pid_e807&mi_00#8&10675082&0&0000#
global","displayName":"HP Webcam HD 4310","position":0,"orientation":0}]
qml: Cam changed to @device:pnp:\\?\root#image#0001#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
\global
qml: New name: Forward Facing camera
C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe exited with code 0
Second attempt, by having the cam stack unloaded by default also fails:
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtMultimedia 5.6
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
VideoOutput
{ anchors.fill: parent source: camera } Item {
id: hpcam
property bool ready: false
property string deviceId: ""
property var data: [[]]
Component.onCompleted: {
data = JSON.parse(JSON.stringify(QtMultimedia.availableCameras));
console.log(JSON.stringify(data))
for (var ii=0; ii< data.length; ii++)
ready = true
}
}
Camera {
id: camera
cameraState: Camera.UnloadedState
deviceId: hpcam.ready ? hpcam.deviceId : ""
Component.onCompleted: console.log("CamStart is " + deviceId)
onDeviceIdChanged: { console.log("Cam changed to " + deviceId) cameraState = Camera.ActiveState // viewfinder.resolution = "1280x720" }
onCameraStateChanged: console.log("CamState: " + cameraState + (cameraState == Camera.ActiveState))
onCameraStatusChanged: console.log("CamStatUS: " + cameraStatus)
onDisplayNameChanged: console.log("New name: " + displayName)
onError: console.log("Orror:" + errorCode + ": " + errorString)
}
}
...with...
Starting C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe...
QML debugging is enabled. Only use this in a safe environment.
qml: Cam changed to @device:pnp:\\?\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
qml: CamStart is @device:pnp:\\?\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
qml: [{"deviceId":"@device:pnp:\\\\?\\usb#vid_05a9&pid_f580&mi_00#7&28d56638&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"USB Camera-OV580","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
root#image#0001#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"Forward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?\\root#image#0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"Downward Facing camera","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
usb#vid_8086&pid_0a66&mi_00#7&1446047e&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) RGB","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?\\usb#vid_8086&pid_0a66&mi_02#7&1446047e&0&0002#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"Intel(R) RealSense(TM) 3D Camera (Front F200) Depth","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
root#image#0002#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"Intel(R) RealSense(TM) 3D Camera Virtual Driver","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?\\usb#vid_04f2&pid_b454&mi_00#7&305232d3&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}
global","displayName":"HP High Definition 1MP Webcam","position":0,"orientation":0},{"deviceId":"@device:pnp:\\\\?
usb#vid_03f0&pid_e807&mi_00#8&10675082&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global","displayName":"HP Webcam HD 4310","position":0,"orientation":0}]
qml: Cam changed to @device:pnp:\\?\root#image#0001#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
qml: CamStatUS: 2
Failed to get the supported modes of the video control
qml: CamStatUS: 4
qml: CamStatUS: 6
qml: CamStatUS: 8
qml: CamState: 2true
qml: New name: Forward Facing camera
qml: CamStatUS: 7
qml: CamStatUS: 4
qml: CamStatUS: 3
qml: CamStatUS: 1
qml: CamState: 0false
C:\Users\Attila\Documents\build-CamSelectorBug-Desktop_Qt_5_7_0_MSVC2013_64bit-Debug\debug\CamSelectorBug.exe exited with code 0
Oddly enough if the alternate deviceId was hardcoded, and I just alter the state, it does open the camera correctly:
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtMultimedia 5.6
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
VideoOutput { anchors.fill: parent source: camera }
Item {
id: hpcam
property bool ready: false
property string deviceId: ""
property var data: [[]]
Component.onCompleted: {
data = JSON.parse(JSON.stringify(QtMultimedia.availableCameras));
console.log(JSON.stringify(data))
for (var ii=0; ii< data.length; ii++) { // console.log(JSON.stringify(cam.data[ii])) if (data[ii].displayName == "Forward Facing camera") deviceId = data[ii].deviceId }
ready = true
}
}
Timer
{ interval: 3000 onTriggered: camera.cameraState = Camera.ActiveState running: true } Camera {
id: camera
cameraState: Camera.UnloadedState
deviceId: "@device:pnp:\\\\?
root#image#0001#
global"
Component.onCompleted: console.log("CamStart is " + deviceId)
viewfinder.resolution: "1280x720"
onCameraStateChanged: console.log("CamState: " + cameraState + (cameraState == Camera.ActiveState))
onCameraStatusChanged: console.log("CamStatUS: " + cameraStatus)
onDisplayNameChanged: console.log("New name: " + displayName)
onError: console.log("Orror:" + errorCode + ": " + errorString)
}
}
...which leads me to believe that even if you ask the cam stack state to be unloaded by default, something is still getting (wrongly) initialized which prevents later successful changing of the deviceId.
If the deviceId is immutable, it should be noted in the documentation, but it feels that this is a bug given it refers to QtMultimedia.availableCameras as a source of deviceIds.