QtAV icon indicating copy to clipboard operation
QtAV copied to clipboard

从Retina显示器移动到普通显示器,只能显示部分画面

Open winking324 opened this issue 8 years ago • 22 comments

QtAV, Qt version and platform

QtAV: 1.11 Qt: 5.9.1 platform: OS X

Reproduction steps

Mac下启动进程,默认生成窗口在Retina显示器上,然后移动到普通显示器,播放画面宽高为实际的1/2。

Expected behavior

播放画面宽高不变。

Actual behavior

播放画面宽高变为正常1/2。

winking324 avatar Jan 26 '18 06:01 winking324

看了之前的issues,做了以下修改,已经OK。

#include <QtAVWidgets/global.h>

video_output_ = new QtAV::VideoOutput(QtAV::VideoRendererId_GLWidget2, this);

winking324 avatar Jan 26 '18 06:01 winking324

修改为VideoRendererId_GLWidget2之后,在Retina上显示全图,但是只显示整体的1/4大小。 qq20180126-183119 2x

winking324 avatar Jan 26 '18 10:01 winking324

QtAV 1.11.0(Jan 23 2018, 20:45:18) "Build with Qt-5.9.1" "FFmpeg/Libav configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-vda"

"OpenGL version: 2.1 hasGLSL: 1" "GL_VERSION: 2.1 INTEL-10.30.14" "GL_VENDOR: Intel Inc." "GL_RENDERER: Intel Iris Pro OpenGL Engine" "GL_SHADING_LANGUAGE_VERSION: 1.20" "Is OpenGLES: 0" "Is EGL: 0" "GLSL version: 120" "Has PBO: 1" "16 bit texture depth: 16.\n" "using gl_param_3r16" "Has 16bit texture: 1" "check gl3 rg: 0x822B" "Has RG texture: 1"

winking324 avatar Jan 26 '18 10:01 winking324

之在retina上播放画面大小怎么样?

wang-bin avatar Jan 27 '18 10:01 wang-bin

用默认VideoOutput时,retina显示器效果:

qq20180129-130747 2x

普通显示器(分辨率1920x1080)显示器效果:

qq20180129-130804

winking324 avatar Jan 29 '18 05:01 winking324

用Player试了一下,有问题的如下:

  • OpenGL Widget
  • QGLWidget2

没问题的如下:

  • Widget

之前没有更新代码,用Widget不出图,更新了最新Qt 5.10.0,QtAV最新master代码后,可以正常出图,先用Widget解决。

winking324 avatar Jan 29 '18 06:01 winking324

就是说在第一个显示器上正常,换了就不对了?这个我监听下QGuiApplication::primaryScreenChanged()信号试试,应该可以解决

wang-bin avatar Jan 30 '18 02:01 wang-bin

你试下最新代码

wang-bin avatar Jan 30 '18 02:01 wang-bin

还是有点问题,VideoRendererId_GLWidget2情况下,必须要Resize Window,才能刷新VideoOutput,更新到对应的分辨率上。

winking324 avatar Feb 12 '18 05:02 winking324

默认情况时,还是老问题,不能解决。

winking324 avatar Feb 12 '18 05:02 winking324

主要是能检测到显示器变化就行,你随便写个代码看看qApp-> primaryScreenChanged()这个信号会不会出发,然后再看看OpenGLVideo::updateViewport()会不会再此时被调到,我没设备没法测

wang-bin avatar Feb 12 '18 06:02 wang-bin

试了一下,检测不到primaryScreenChanged这个信号。

只能在MainWindow的moveEvent事件中,检查显示器序号才可行: QDesktopWidget *desktop = QApplication::desktop(); desktop->screenNumber(this);

winking324 avatar Feb 13 '18 03:02 winking324

https://bugreports.qt.io/browse/QTBUG-33048

看来这个接口确实有问题,只能用其他方法绕过去了。

winking324 avatar Feb 13 '18 03:02 winking324

感觉没发信号也是有道理的,因为你的情况只是app一个窗口移动到已经存在的显示器,primaryScreenChanged()感觉应该是显示器拔掉插上另一个的意思。如果app有多个窗口分别在不同的显示器显示,那用primaryScreenChanged肯定不行了。看上去比较符合的接口应该是QWindow.screenChanged(), 可以针对每个窗口的屏幕变化,你可以把这个信号处理下,槽里调用VideoRenderer.opengl()->updateViewport()试试。貌似这些只能在app里处理了

wang-bin avatar Feb 13 '18 03:02 wang-bin

确实可以👍

winking324 avatar Feb 13 '18 03:02 winking324

不知道qwidget内部是怎么实现的,回头看看源码

wang-bin avatar Feb 14 '18 02:02 wang-bin

后来你是怎么获取QWindow对象的?

wang-bin avatar Feb 26 '18 07:02 wang-bin

QDesktopWidget *desktop = QApplication::desktop();
int screen_number = desktop->screenNumber(this);
if (screen_number == current_screen_number_) return;
current_screen_number_ = screen_number;

int screen_ratio = desktop->screen(current_screen_number_)->devicePixelRatio();
if (screen_ratio == current_screen_ratio_) return;
current_screen_ratio_ = screen_ratio;

LOG4CPLUS_WARN_FMT(LOGGER_NAME, "screen changed, current number: %d, "
                                "current ratio: %d, change video output",
                   current_screen_number_, current_screen_ratio_);

我是这么区分屏幕和分辨率变化的,试了其他方式,都判断不准确。

winking324 avatar Mar 09 '18 05:03 winking324

主要是什么时候去判断变化?

wang-bin avatar Mar 10 '18 03:03 wang-bin

我是在moveEvent里面检查的

winking324 avatar Mar 13 '18 05:03 winking324

好吧,这样的话在qtav里判断不好实现,翻了qt的代码监听变化的方法都是内部使用非公开的接口

wang-bin avatar Mar 13 '18 09:03 wang-bin

ScreenChangeInternal 有这个事件触发的 但是 不知道怎么刷新videooutput

toby20130333 avatar Jul 07 '20 11:07 toby20130333