如何在 QML QVideoFilterRunnable 中访问相机?
Posted
技术标签:
【中文标题】如何在 QML QVideoFilterRunnable 中访问相机?【英文标题】:How to access camera in QML QVideoFilterRunnable? 【发布时间】:2016-01-27 19:13:40 【问题描述】:在https://blog.qt.io/blog/2015/03/20/introducing-video-filters-in-qt-multimedia 的博客之后,我设法让我的 C++ 过滤器与 QML 定义的相机一起使用。我遇到的问题是我的过滤器接收到的图像不考虑我的屏幕方向。 Qt 文档http://doc.qt.io/qt-5/cameraoverview.html 展示了如何根据相机和屏幕方向旋转图像。不清楚的是如何从过滤器中获取相机实例。这是我的 QML 文件中的相关 sn-p:
Camera
id: camera
captureMode: Camera.CaptureStillImage
...
MyFilter
id: filter
VideoOutput
id: viewfinder
source: camera
filters: [ filter ]
...
如何从我的 QVideoFilterRunnable 实例访问 QCamera 实例?问候。
【问题讨论】:
你不能直接访问camera对象,因为runnable是在QCamera之外的另一个线程中调用的,并且QCamera不是线程安全的。您需要将所需的信息传递给您的过滤器(作为属性)并让可运行对象从过滤器中获取它们。 (并确保访问是线程安全的。 【参考方案1】:回答您关于旋转的具体问题,我的最佳答案是将方向从 VideoOutput 组件传递到您的自定义组件,即
Camera
id: camera
captureMode: Camera.CaptureStillImage
...
MyFilter
id: filter
orientation: videofinder.orientation
VideoOutput
id: viewfinder
source: camera
autoOrientation: true
filters: [ filter ]
...
这样,您的自定义过滤器将知道最终用户如何看待您的图片。另一个问题是在某些设备上图像也会翻转:
#ifdef Q_OS_android
bool flip = true;
#else
bool flip = surfaceFormat.scanLineDirection() == QVideoSurfaceFormat::BottomToTop;
#endif
【讨论】:
以上是关于如何在 QML QVideoFilterRunnable 中访问相机?的主要内容,如果未能解决你的问题,请参考以下文章
QML-如何在 ui.qml 中向 onClick 添加另一个命令?
如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?
如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?