如何停止视频撕裂?(Nvidia专有驱动程序,非合成窗口管理器)

我有一个问题,似乎很多人使用专有的Nvidia驱动程序都会遇到:

视频撕裂:当视频中有大量平移或动作时,在我的显示器顶部附近通常会出现细小的水平线。

(注意:切换回默认的nouveau驱动程序不是一个选项,因为它看似不存在的电源管理会让我的电池快速耗尽数倍)

我已经尝试了Totem、Parole和VLC,所有这些播放器都会出现撕裂。在VLC中使用X11输出可以得到最好的结果,但是即使是相对温和的动作仍然会出现撕裂。

硬件:MacBook Air 3,2--搭载了Nvidia GeForce 320M。

有两种常见的解决Nvidia prop驱动程序撕裂的方法:

  1. 关闭合成,因为Nvidia专有驱动在Linux上通常与合成窗口管理器不兼容(我知道Compiz是个例外)。但是我使用的是非常轻量级的窗口管理器(Awesome窗口管理器),它甚至不能进行合成(或任何酷炫的效果)。我在Xfce中也遇到了这个问题,我已经禁用了合成。

  2. 启用垂直同步。要启用此功能,我在nvidia-settings中设置选项,然后将其与其他自启动程序一起自动启动为nvidia-settings -l。这似乎有效,因为当我运行glxgears时,输出如下:

    $ glxgears
     Running synchronized to the vertical refresh.  The framerate should be
    approximately the same as the monitor refresh rate.
    303 frames in 5.0 seconds = 60.500 FPS
    300 frames in 5.0 seconds = 59.992 FPS
    

    而当我使用nvidia-settings检查刷新率时:

    $ nvidia-settings -q RefreshRate
    Attribute 'RefreshRate' (wampum:0.0; display device: DFP-2): 60.00 Hz.
    

    所有这些都表明垂直同步已启用。据我所知,这正是为了防止撕裂,而很多人的问题甚至是无法获得像glxgears这样的正确信息输出。我不明白为什么对我来说它不起作用。

xorg.conf: http://paste.ubuntu.com/992056/

观察到的撕裂示例:: 视频撕裂


请问你能将你的xorg.conf文件上传到pastebin.com吗?你在xorg.conf文件中尝试过使用Option "TripleBuffer" "1"吗? - fossfreedom
我尝试了TripleBuffer,似乎有一点帮助,但效果不太明显。我会将我的xorg.conf上传到pastebin。 - Chan-Ho Suh
你使用双显示器吗? - Alistair Buxton
在12.10版本中,浏览器中的Flash存在相同的问题,尽管我没有在VLC中看到撕裂现象,也没有在拖动窗口时出现。你自那时以来找到解决办法了吗? - Bleep Bloop
17个回答

有一件事可以尝试,可能会起作用。打开nvidia-settings并转到powermizer部分。在下拉菜单中选择“最大性能”,你应该看到你的powermizer级别跳到最快的速度。
完成这个步骤后,再试试视频。
过去我发现当nvidia显卡处于最慢的powermizer设置时,垂直同步无法正常工作。

谢谢!在Arch Linux上使用专有的NVIDIA驱动程序(310.19),这对我起作用了。我一直在努力解决这个问题,而现在终于成功了。真是一个奇怪的问题。 - Reid
可以通过命令行控制此设置吗?这样我就可以在启动视频播放器时启用它(并在关闭播放器后禁用它)。 - panzi
1啊。nvidia-settings -a GPUPowerMizerMode=1 将其设置为性能模式,而 nvidia-settings -a GPUPowerMizerMode=2 则是自动模式。 - panzi

如果您使用双显示器,NVIDIA驱动程序只能与其中一个显示器的垂直空白同步,除非它们具有完全相同的刷新率。我是说完全相同。这几乎是不可能的,除非两个显示器是完全相同的类型。如果NVIDIA驱动程序同步到错误的显示器(例如,在您想在外部电视上观看电影时同步到内置显示器),您可以覆盖其选择。根据NVIDIA驱动程序文档:

在使用TwinView时,当使用__GL_SYNC_TO_VBLANK时,OpenGL只能与一个显示设备同步;这可能会导致OpenGL未同步的显示设备上出现撕裂损坏。您可以使用环境变量__GL_SYNC_DISPLAY_DEVICE来指定OpenGL应该与哪个显示设备同步。您应将此环境变量设置为显示设备的名称;例如“CRT-1”。在X日志文件中查找“Connected display device(s):”一行,以获取显示设备和其名称的列表。

我已经在/etc/environment中永久设置了这个 - 只需在新行上添加类似于以下内容:

__GL_SYNC_DISPLAY_DEVICE="DFP-0"


嗨,艾利斯泰尔。谢谢你的建议,但是我只使用一个显示器。 - Chan-Ho Suh

我也曾经遭受过在我的Intel sandy bridge处理器上出现视频撕裂的问题。这个方法对我有效。我将以下几行代码放入"/etc/environment"文件中 -
CLUTTER_PAINT=disable-clipped-redraws:disable-culling CLUTTER_VBLANK=True 然后问题就解决了。在末尾按下回车并复制粘贴这些代码。可能需要重新启动电脑。试一试吧。

2谢谢你的建议,但这些是Gnome3环境变量(如Gnome Shell所使用的)。我使用一个非常简洁的窗口管理器,所以这对我不适用。另外,我没有Sandy Bridge处理器。 - Chan-Ho Suh
这个解决方案修复了我在Cinnamon桌面(Mutter窗口管理器)和nvidia 313驱动程序上遇到的撕裂问题。很抱歉打扰了一个旧帖子,但是谢谢。 - askuhn

这是我如何解决在我的ASUS K50IN笔记本上使用NVIDIA GeForce G102M时的垂直同步问题。我知道由于显卡不同,你的情况可能会有所不同,但你可以试试看... 对我来说,关键是使用简化版的MPlayer(而不是MPlayer2!)。它与其他播放器不兼容。
  1. 在ccsm中执行常规的compiz操作:
    • 在Composite下,关闭Detect Refresh Rate并手动输入您的显示器当前的刷新率。
    • 我打开了“Copy to Texture”,不确定是否有帮助。
    • 在OpenGL选项下,设置Tex. Filter为Best。
    • 打开Sync to VBlank。
    • Unity插件:(不确定是否有帮助,但据说可以提高速度) Panel Opacity - 1.0000,Launcher Opacity - 1.0000。Dash Blur - Static。
  2. 进行常规的nvidia-settings操作:
    • 在XVideo和OpenGL设置中启用Sync to VBlank。
    • 在OpenGL设置中将Image Settings设置为High Quality。
    • 在Display Configuration中手动设置分辨率,然后将自动刷新率更改为当前的刷新率。
  3. 安装mplayer和vdpau(注意:不是mplayer2!这是新的实验性版本,并且对我来说至少在VDPAU方面存在延迟):
    • 软件包:mplayer libvdpau1 vdpau-va-driver
  4. 设置MPlayer(我也尝试了gnome-mplayer,但效果不如我所期望):
    • 打开文件~/.mplayer/config,如果没有,请创建该文件。您可能还需要创建.mplayer文件夹。文件内容如下:
[default]
ao=pulse
vo=vdpau
如果你移除了pulse audio,将ao更改为alsa。
通过重新登出/登录来重启X。
尽管结果因人而异,但还是试一试。我发现,在非LTS版本或使用测试版驱动程序时,这可能不再适用,具体取决于视频的编解码器。

我使用的是Ubuntu 12.04LTS 64位操作系统,我的显卡是nvidia gtx 660ti。
我曾经遭受了一个多月的视频撕裂问题,直到我找到了解决办法。
打开“nvidia x server settings”--->“PowerMizer”--->“PowerMizer Settings”(在底部附近),将“Preferred Mode”设置从“Adaptive”更改为“Prefer Maximum Performance”。

我也遇到了同样的视频撕裂问题。在我的情况下,我观察到只有在全屏模式下才会发生撕裂。问题似乎出在将视频缩放到全屏时。每当播放的视频的原始尺寸和屏幕分辨率比例不匹配时,视频就会出现撕裂。将smplayer中的纵横比设置为显示器的纵横比可以解决我的问题。
例如,我在全屏模式下播放一个1280x714大小的视频,视频中就会出现撕裂。当我强制将视频的纵横比设置为16:9时,播放就变得流畅了。
我必须指出,问题的根本原因仍然存在,并且很烦人。由于纵横比没有保持原始状态,视频会有一些变形。然而,与有撕裂的情况相比,这样看起来更好一些 ;)


不确定这是否对你有帮助,但对我有效。 打开nvidia-settings并将频率从自动更改为60。 然后点击应用。 这解决了我的视频撕裂和桌面闪烁问题。 可惜每次重新启动都需要这样做。

1正如我在帖子中解释的那样,我的显示器刷新率确实是60 Hz。至于你的问题,请按照这个答案进行操作。 - Chan-Ho Suh

这对我在ATI Radeon驱动上有效,所以它可能对你有用:

添加一个配置文件(例如,在/etc/X11/xorg.conf.d/20-nouveau.conf中)

包含以下内容:

Section "Device"
    Option      "EXAVsync"  "True"
    Option      "GLXVBlank" "True"
    Identifier  "Nvidia card"
    Driver      "nouveau"
EndSection

EXA是用于视频合成的框架;默认情况下似乎不能同步显示。
尝试使用其他软件(例如vlc)来播放视频可能也是值得一试的。

1正如我在帖子中提到的那样,切换到默认驱动程序不是一个选择。 - Chan-Ho Suh

抱歉,这个答案有点针对openSuSE而不是Ubuntu,但我最终通过以下更改使其正常工作:
- 暂时禁用合成/窗口效果(在openSuSE中按下alt+shift+f12) - 使用VLC,并将“视频”设置为“OpenGL视频输出(实验性)”。对我来说,“加速视频输出(叠加)”也被选中。我使用的是2.1.1版本的VLC,如果有关系的话。 - 将PowerMizer设置为性能模式,就像mjnichol的回答中所述 - 将OpenGL设置为高级模式,就像Amir Dizdarević的回答中所述
希望对你有帮助!我想可能有一些设置可以使它与合成一起工作,但我建议至少在测试时禁用合成。我的配置是一个4K显示器和GTX 650显卡。