还有另一个英特尔快速同步 (QSV) 问题。
我已经使用支持 QSV 的解码器、编码器和过滤器大约一年了,大部分情况下都能正常工作,至少对于 H264 来说是这样。但是,正如其他人所报告的那样,HEVC 和 VP9 存在问题。我最近的情况是我想解码 VP9 并编码 H264。
Intel 称 vp9_qsv 既是解码器又是编码器。我的 ffmpeg 版本称它有这个功能。
I:\Downloads>ffmpeg -hide_banner -h decoder=h264_qsv
Decoder h264_qsv [H264 video (Intel Quick Sync Video acceleration)]:
General capabilities: dr1 delay avoidprobe hybrid
Threading capabilities: none
Supported hardware devices: qsv
Supported pixel formats: nv12 p010le qsv
h264_qsv AVOptions:
-async_depth <int> .D.V....... Internal parallelization depth, the higher the value the higher the latency. (from 1 to INT_MAX) (default 4)
-gpu_copy <int> .D.V....... A GPU-accelerated copy between video and system memory (from 0 to 2) (default default)
default 0 .D.V.......
on 1 .D.V.......
off 2 .D.V.......
I:\Downloads>ffmpeg -h decoder=vp9_qsv
ffmpeg version 4.4-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-lib
ml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --e
able-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --
nable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-
ibzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslan
--enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshin
--enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-l
bvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Decoder vp9_qsv [VP9 video (Intel Quick Sync Video acceleration)]:
General capabilities: dr1 delay avoidprobe hybrid
Threading capabilities: none
Supported hardware devices: qsv
Supported pixel formats: nv12 p010le qsv
vp9_qsv AVOptions:
-async_depth <int> .D.V....... Internal parallelization depth, the higher the value the higher the latency. (from 1 to INT_MAX) (default 4)
-gpu_copy <int> .D.V....... A GPU-accelerated copy between video and system memory (from 0 to 2) (default default)
default 0 .D.V.......
on 1 .D.V.......
off 2 .D.V.......
如果我在输入文件为 AVC / H264 时执行此操作
ffmpeg -y -hide_banner -err_detect aggressive -loglevel verbose -stats -benchmark ^
-init_hw_device qsv:hw,child_device_type=qsv -hwaccel qsv -hwaccel_output_format qsv ^
-vcodec h264_qsv -to 00:10:00.000 -i "h264_input_file.mkv" -strict normal ^
-c:a aac -q:a 0.9 ^
-vf "hwupload=extra_hw_frames=128,vpp_qsv=w=1696:h=954" ^
-c:v h264_qsv -preset veryslow -q:v 32 -movflags +faststart ^
"h264_output_file.mp4"
它有效。Verbose 表示 QSV 解码器和编码器正在工作,GPU-Z 表示 gpu 很忙,等等。有时解码器会在输入时阻塞,因为 QSV 解码器显然对它可以读取的内容非常挑剔,但重要的是 h264_qsv 解码器加载并运行。我相信这非常清楚地表明 QSV 已安装并正在运行,因为我可以使用启用 QSV 的编解码器和过滤器进行解码、过滤和编码。但如果我对 VP9 做同样的事情,如下所示:
ffmpeg -y -hide_banner -err_detect aggressive -loglevel verbose -stats -benchmark ^
-init_hw_device qsv:hw,child_device_type=qsv -hwaccel qsv -hwaccel_output_format qsv ^
-vcodec vp9_qsv -to 00:10:00.000 -i "vp9_input_file.mkv" -strict normal ^
-c:a aac -q:a 0.9 ^
-vf "hwupload=extra_hw_frames=128,vpp_qsv=w=1696:h=954" ^
-c:v h264_qsv -preset veryslow -q:v 32 -movflags +faststart ^
"h264_output_file.mp4"
我被错误淹没了。
ffmpeg -y -hide_banner -err_detect aggressive -loglevel verbose -stats -benchmark -init_hw_device qsv:hw,child_device_type=qsv -hwaccel qsv -hwaccel_output_
format qsv -vcodec vp9_qsv -to 00:10:00.000 -i "VIEW 360: Taking a FLIRT to the Workshop in Drammen part 2 of 2.mkv" -strict normal -c:a aac -q:a 0.9 -vf "hwupload=e
xtra_hw_frames=128,vpp_qsv=w=1696:h=954" -c:v h264_qsv -preset veryslow -q:v 32 -movflags +faststart "VP9 test.mp4"
Routing option err_detect to both codec and muxer layer
Routing option strict to both codec and muxer layer
[AVHWDeviceContext @ 00000000003e9500] Using D3D9Ex device.
[AVHWDeviceContext @ 00000000003e9300] Initialize MFX session: API version is 1.34, implementation version is 1.11
Input #0, matroska,webm, from 'vp9_input_file.mkv':
Metadata:
ENCODER : Lavf58.76.100
Duration: 02:30:37.56, start: -0.007000, bitrate: 17668 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), 1 reference frame, yuv420p(tv, bt709), 3840x2160, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 1k tbc (default)
Metadata:
DURATION : 02:30:37.535000000
Side data:
stereo3d: 2D
Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp, delay 312 (default)
Metadata:
DURATION : 02:30:37.561000000
Stream mapping:
Stream #0:0 -> #0:0 (vp9 (vp9_qsv) -> h264 (h264_qsv))
Stream #0:1 -> #0:1 (opus (native) -> aac (native))
Press [q] to stop, [?] for help
[graph_1_in_0_1 @ 0000000000431b80] tb:1/48000 samplefmt:fltp samplerate:48000 chlayout:0x3
[AVHWDeviceContext @ 0000000000413900] Using D3D9Ex device.
[AVHWDeviceContext @ 0000000000413880] Initialize MFX session: API version is 1.34, implementation version is 1.11
[vp9_qsv @ 0000000002cbc780] Decoder: output is video memory surface
[vp9_qsv @ 0000000002cbc780] Could not load the requested plugin 'a922394d8d87452f878c51f2fc9b4131': specified object was not found (-9)
[vp9_qsv @ 0000000002cbc780] Error loading plugins
[vp9_qsv @ 0000000002cbc780] Error initializing an MFX session
[vp9_qsv @ 0000000002cbc780] Error initializing the MFX video decoder: invalid handle (-6)
Error while decoding stream #0:0: Invalid argument
[vp9_qsv @ 0000000002cbc780] Decoder: output is video memory surface
[vp9_qsv @ 0000000002cbc780] Could not load the requested plugin 'a922394d8d87452f878c51f2fc9b4131': specified object was not found (-9)
[vp9_qsv @ 0000000002cbc780] Error loading plugins
[vp9_qsv @ 0000000002cbc780] Error initializing an MFX session
[vp9_qsv @ 0000000002cbc780] Error initializing the MFX video decoder: invalid handle (-6)
Error while decoding stream #0:0: Invalid argument
[vp9_qsv @ 0000000002cbc780] Decoder: output is video memory surface
我拥有最新的英特尔驱动程序,我尝试过的所有非 qsv 命令都可以工作,h264_qsv 既可以用作解码器也可以用作编码器,而且我在两个 Windows 7 系统和一个 Windows 10 系统上尝试过,它们都使用不同的英特尔处理器,我得到了相同的结果。我在各种网站上看到很多人问这个问题,但我没有看到答案。
有人能解释一下为什么 ffmpeg 没有“加载请求的插件”吗?QSV 软件是否存在英特尔未提及的某种问题?
或者我应该问一个更基本的问题。这里有人真的能够在任何 Windows 7 系统上成功使用 hevc_qsv 或 vp9_qsv 编解码器进行解码或编码吗?我看到了很多问题,但我没有看到任何人发布一个示例说“当我在我的系统上测试它时,它确实有效”。我看到的只是“应该有效”的理论代码。我应该继续尝试解决这个问题,还是英特尔提供的软件有故障,并且永远不会起作用?
答案1
我没有看过,但我可以给出某种答案。
英特尔网站上的信息并不完整,并且 ffmpeg 返回的信息可能会产生误导。
ffmpeg 返回的信息不是通过探测系统或查看您的 PC 可以做什么和不能做什么而获得的。它报告该版本软件的最大值。
您必须知道英特尔处理器的“代”号,才能确定哪些编解码器实际上“嵌入”到 CPU/GPU 中。
我最新的系统(直到一周前)是 Gen 4。要了解您的系统实际上可以做什么,您需要访问英特尔网站并查找您的处理器以了解其内部项目名称。(据我所知,无法通过您在系统上运行的任何命令或实用程序找到它。)然后您可以转到:
https://en.wikipedia.org/wiki/Intel_Graphics_Technology
并查看表格。底部附近有一个表格,显示您的系统硬件支持哪些编码器和解码器。Sandy Bridge(Gen 4 的一部分)可以解码 H.264 和 H.262,并编码 H.264:我在我的系统上编码 H.264 获得了良好的结果。
一周前,我买了一台带有第七代处理器(Kaby Lake)的翻新系统。它可以编码和解码 H.262、H.264、H.265(我已经做过了)以及 JMPEG、VP8 和 VP9:我已经测试过使用 VP9 解码,可以正常工作;我还没有测试其他的。它比第四代处理器的分辨率更高,可以执行 H.265。它还可以解码 VC1(WMV),但不能编码。
我想这里的教训是,如果你无法让 QSV 加速编解码器工作,请检查你的处理器是否真的支持它们。似乎没有简单的方法可以做到这一点,你必须自己挖掘信息。
我应该说一下,我已经用 ffmpeg 4.4 完成了所有测试。我无法升级到新版本,因为开发人员删除了一些修复有问题的旧视频所需的基本功能。