在 Kubuntu 16.04 中,我使用以下命令安装了 nvidia 二进制驱动程序版本 384.69“图形驱动程序”团队的 PPA。我还尝试了当前官方发布的 381.22 版本,结果相同。我设置了 SMplayer 15.11.0 以使用 VDPAU,并通过启动 h.264 视频播放并查看播放视频的命令来确保它确实在使用 VDPAU。以下是一个例子:
/usr/bin/mpv --no-config --no-quiet --terminal --no-msg-color --input-file=/dev/stdin --no-fs --vd-lavc-threads=12 --hwdec=vdpau --sub-auto=fuzzy --vo=vdpau --ao=alsa:device=[hw:2,0] --no-input-default-bindings --input-x11-keyboard=no --no-input-cursor --cursor-autohide=no --no-keepaspect --wid=100664033 --monitorpixelaspect=1 --osd-scale=1 --sub-ass --embeddedfonts --ass-line-spacing=0 --sub-scale=1 --sub-text-font=Fira Sans --sub-text-color=#ffffff --sub-text-shadow-color=#000000 --sub-text-border-color=#000000 --sub-text-border-size=2.5 --sub-text-shadow-offset=5 --ass-force-style=PlayResX=512,PlayResY=320,Name=Default,Fontname=Fira Sans,Fontsize=20,PrimaryColour=&H00ffffff,BackColour=&H00000000,OutlineColour=&H00000000,Bold=0,Italic=0,Alignment=2,BorderStyle=1,Outline=1,Shadow=2,MarginL=20,MarginR=20,MarginV=8 --sub-codepage=utf8:ISO-8859-1 --vid=1 --aid=1 --sub-pos=100 --volume=50 --cache=2048 --osd-level=0 --audio-channels=2 --af-add=scaletempo --af-add=equalizer=0:0:0:0:0:0:0:0:0:0 --softvol=yes --softvol-max=100 --ytdl=no --term-playing-msg=MPV_VERSION=${=mpv-version:} INFO_VIDEO_WIDTH=${=width} INFO_VIDEO_HEIGHT=${=height} INFO_VIDEO_ASPECT=${=video-aspect} INFO_VIDEO_FPS=${=fps} INFO_VIDEO_FORMAT=${=video-format} INFO_VIDEO_CODEC=${=video-codec} INFO_AUDIO_FORMAT=${=audio-codec-name:${=audio-format}} INFO_AUDIO_CODEC=${=audio-codec} INFO_AUDIO_RATE=${=audio-params/samplerate:${=audio-samplerate}} INFO_AUDIO_NCH=${=audio-params/channel-count:${=audio-channels}} INFO_LENGTH=${=duration:${=length}} INFO_DEMUXER=${=demuxer} INFO_TITLES=${=disc-titles} INFO_CHAPTERS=${=chapters} INFO_TRACKS_COUNT=${=track-list/count} METADATA_TITLE=${metadata/by-key/title:} METADATA_ARTIST=${metadata/by-key/artist:} METADATA_ALBUM=${metadata/by-key/album:} METADATA_GENRE=${metadata/by-key/genre:} METADATA_DATE=${metadata/by-key/date:} METADATA_TRACK=${metadata/by-key/track:} METADATA_COPYRIGHT=${metadata/by-key/copyright:} INFO_MEDIA_TITLE=${=media-title:} --term-status-msg=STATUS: ${=time-pos} / ${=duration:${=length:0}} P: ${=pause} B: ${=paused-for-cache} I: ${=core-idle} /home/user/video.mkv
我尝试了不同的线程数(上例中为 12)、启用和禁用循环滤波器、直接渲染和其他选项,但都没有太大效果。
我的显卡是 nvidia geforce 1070。我可以观看用安装了 9 年历史的 nvidia 9600 GT 显卡的旧电脑测试过的相同视频文件,而不会出现任何撕裂现象,所以我认为应该可以解决这个问题。
如果有帮助的话,这里是 vdpauinfo 的输出:
display: :0 screen: 0
API version: 1
Information string: NVIDIA VDPAU Driver Shared Library 384.69 Wed Aug 16 19:38:45 PDT 2017
Video surface:
name width height types
-------------------------------------------
420 8192 8192 NV12 YV12
422 8192 8192 UYVY YUYV
Decoder capabilities:
name level macbs width height
----------------------------------------------------
MPEG1 0 65536 4096 4096
MPEG2_SIMPLE 3 65536 4096 4096
MPEG2_MAIN 3 65536 4096 4096
H264_BASELINE 41 65536 4096 4096
H264_MAIN 41 65536 4096 4096
H264_HIGH 41 65536 4096 4096
VC1_SIMPLE 1 8190 2048 2048
VC1_MAIN 2 8190 2048 2048
VC1_ADVANCED 4 8190 2048 2048
MPEG4_PART2_SP 3 8192 2048 2048
MPEG4_PART2_ASP 5 8192 2048 2048
DIVX4_QMOBILE 0 8192 2048 2048
DIVX4_MOBILE 0 8192 2048 2048
DIVX4_HOME_THEATER 0 8192 2048 2048
DIVX4_HD_1080P 0 8192 2048 2048
DIVX5_QMOBILE 0 8192 2048 2048
DIVX5_MOBILE 0 8192 2048 2048
DIVX5_HOME_THEATER 0 8192 2048 2048
DIVX5_HD_1080P 0 8192 2048 2048
H264_CONSTRAINED_BASELINE 41 65536 4096 4096
H264_EXTENDED 41 65536 4096 4096
H264_PROGRESSIVE_HIGH 41 65536 4096 4096
H264_CONSTRAINED_HIGH 41 65536 4096 4096
H264_HIGH_444_PREDICTIVE 41 65536 4096 4096
HEVC_MAIN 153 262144 8192 8192
HEVC_MAIN_10 --- not supported ---
HEVC_MAIN_STILL --- not supported ---
HEVC_MAIN_12 --- not supported ---
HEVC_MAIN_444 --- not supported ---
Output surface:
name width height nat types
----------------------------------------------------
B8G8R8A8 32768 32768 y Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8
R10G10B10A2 32768 32768 y Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8
Bitmap surface:
name width height
------------------------------
B8G8R8A8 32768 32768
R8G8B8A8 32768 32768
R10G10B10A2 32768 32768
B10G10R10A2 32768 32768
A8 32768 32768
Video mixer:
feature name sup
------------------------------------
DEINTERLACE_TEMPORAL y
DEINTERLACE_TEMPORAL_SPATIAL y
INVERSE_TELECINE y
NOISE_REDUCTION y
SHARPNESS y
LUMA_KEY y
HIGH QUALITY SCALING - L1 y
HIGH QUALITY SCALING - L2 -
HIGH QUALITY SCALING - L3 -
HIGH QUALITY SCALING - L4 -
HIGH QUALITY SCALING - L5 -
HIGH QUALITY SCALING - L6 -
HIGH QUALITY SCALING - L7 -
HIGH QUALITY SCALING - L8 -
HIGH QUALITY SCALING - L9 -
parameter name sup min max
-----------------------------------------------------
VIDEO_SURFACE_WIDTH y 1 8192
VIDEO_SURFACE_HEIGHT y 1 8192
CHROMA_TYPE y
LAYERS y 0 4
attribute name sup min max
-----------------------------------------------------
BACKGROUND_COLOR y
CSC_MATRIX y
NOISE_REDUCTION_LEVEL y 0.00 1.00
SHARPNESS_LEVEL y -1.00 1.00
LUMA_KEY_MIN_LUMA y
LUMA_KEY_MAX_LUMA y
任何帮助都将不胜感激。提前致谢!
编辑:帮助自己:以下命令似乎可以解决问题。
nvidia-settings --assign CurrentMetaMode="HMDI-0: nvidia-auto-select { ForceCompositionPipeline = On }"
现在我“只”需要找到一种方法让它自动执行。为了使更改永久生效,我发现建议将以下几行添加到 /etc/X11/xorg.conf
Section "Screen"
…
Option "metamodes" "HDMI-0: nvidia-auto-select {ForceCompositionPipeline = On }"
EndSection
我的问题是:在这个版本的 Kubuntu 上,不再有这样的文件。我尝试向 usr/share/X11/xorg.conf.d/50-nvidia-drm-outputclass.conf/nvidia-drm-outputclass.conf 添加一个新部分,但没有成功。所以我现在的问题是:我应该把那一行放在哪里?
编辑:好吧,我认为这个问题解决了:我创建了一个包含以下内容的 bash 脚本:
#!/bin/bash
nvidia-settings --assign CurrentMetaMode="HDMI-0: nvidia-auto-select { ForceCompositionPipeline = On }"
nvidia-settings --assign CurrentMetaMode="DP-1: nvidia-auto-select { ForceCompositionPipeline = On }"
nvidia-settings --assign CurrentMetaMode="DP-2: nvidia-auto-select { ForceCompositionPipeline = On }"
我调整了系统设置,每次登录时都运行该脚本。它可以有效地防止 HDMI 和显示端口上的撕裂伪影。如果有人遇到同样的问题,你可以使用以下命令找到相应端口的名称
xrandr | grep " connect"