更快的H.265 / HEVC视频编码与Nvidia的GTX960 GPU和ffmpeg
用一半的比特率时,H.265承诺在同等图像质量的H.264,所以你可曾想过有关转换的H.264视频,H.265 / HEVC,以减少使用视频的空间。但是,如果你曾经尝试转码的影片,如工具手刹,你就会知道这个过程可以是非常慢的,和一个电影可能需要几个小时甚至一台具有功率处理器。然而,有硬件加速编码一个更好的解决方案fster由于在一些英特尔和Nvidia图形卡可用。为此,GearBest送我铭瑄MS-GTX960显卡,第二代麦克斯韦的GPU,支持H.265加速视频编码,并承诺高达500 fps的视频编码。所以,我已经把显卡在测试中运行Ubuntu 14.04的计算机,并报告我的一些研究结果在这里。类似的指令也可以跟着在Windows中。
为了充分利用Nvidia的麦克斯韦2的GPU功能,你需要下载和安装Nvidia的视频编解码器的SDK。最新的版本(6.0.1)要求NVIDIA驱动358.xx或更高,我的系统有版本352.xx,所以我也跟着一些说明安装最新的驱动程序在Ubuntu 14.04。
|
1
2
3
|
sudo add–apt–repository ppa:graphics–drivers/ppa
sudo apt–get update
sudo apt–get install nvidia–358 nvidia–settings
|
重新启动后我安装了最新的358.16驱动程序。
不知不觉中,这些字体是安装后非常小权的xorg.conf不见了,所以我重新使用以下命令:
|
1
|
sudo nvidia–xconfig —no–use–edid–dpi
|
然后,我调整字体大小进一步统一调整工具。
下一步是下载并解压nvidia_video_sdk_6.0.1.zip到工作目录:
|
1
2
|
unzip nvidia_video_sdk_6.0.1.zip
cd nvidia_video_sdk_6.0.1
|
自述文件中的说明简单地告诉你去样品目录,输入make以构建样品,但我不得不这样做几个步骤:
|
1
2
|
sudo apt–get install libXlut freeglut3 freeglut3–dev
export LDFLAGS=“-L /usr/lib/nvidia-358/”
|
我也不得不修改样品/ NvTranscoder / Makefile文件来代替:=由+ = 在LDFLAGS面前。
|
1
2
3
4
5
6
7
|
ifeq ($(OS_SIZE),32)
LDFLAGS += –L/usr/lib64 –lnvidia–encode –ldl –lpthread
CCFLAGS := –m32
else
LDFLAGS += –L/usr/lib64 –lnvidia–encode –ldl –lpthread
CCFLAGS := –m64
endif
|
终于我可以成功打造了样本:
|
1
2
|
cd Samples
make
|
有在SDK几个样品:NvEncoder,NvEncoderCudaInterop,NvEncoderD3DInterop,NvEncoderLowLatency,NvEncoderPerf,NvTranscoder,NvDecodeD3D9和NvDecodeGL。对于这篇文章的目的,我用NvTranscoder使用GPU H.264视频转换为H.265。
起初,我曾与错误的一些问题:
|
1
|
cuInit(0, __CUDA_API_VERSION, hHandleDriver) has returned CUDA error 999
|
我跟着一个设置在搅拌机的解决方法,并没有一开始工作,但使用NvTranscoder使用sudo一次后,我可以使用的工具,然后以普通用户身份。
这里的转码与高品质预设一个H.264 1080p视频输出。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
time ./NvTranscoder –i h264_1080p_sample.m4v –o h265_1080p_sample.ts –codec 1 –preset hq
Encoding input : “h264_1080p_sample.m4v”
output : “h265_1080p_sample.ts”
codec : “HEVC”
size : 1920×1088
bitrate : 5000000 bits/sec
vbvMaxBitrate : 0 bits/sec
vbvSize : 0 bits
fps : 90000 frames/sec
rcMode : CONSTQP
goplength : INFINITE GOP
B frames : 0
QP : 28
preset : HQ_PRESET
Total time: 31314.338000ms, Decoded Frames: 4901, Encoded Frames: 4901, Average FPS: 156.509775
real 0m31.959s
user 0m33.667s
sys 0m1.429s
|
视频持续2分43秒(总共4901帧),和编码是在约32秒的意思进行比实时快约5倍,并在156.5 fps的平均。
我重复了同样的测试与高性能预设。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
time ./NvTranscoder –i h264_1080p_sample.m4v –o h265_1080p_sample_fast.ts –codec 1 –preset hp
Encoding input : “h264_1080p_sample.m4v”
output : “h265_1080p_sample_fast.ts”
codec : “HEVC”
size : 1920×1088
bitrate : 5000000 bits/sec
vbvMaxBitrate : 0 bits/sec
vbvSize : 0 bits
fps : 90000 frames/sec
rcMode : CONSTQP
goplength : INFINITE GOP
B frames : 0
QP : 28
preset : HP_PRESET
Total time: 23886.508000ms, Decoded Frames: 4901, Encoded Frames: 4901, Average FPS: 205.178589
real 0m24.433s
user 0m26.159s
sys 0m1.104s
|
解码了约24秒,205帧。它看起来很不错,但我想同样的测试,使用H.265射频质量设置为25手刹,前后历时4分30秒的视频编码,或比与GPU慢约9倍。作为参考,我的电脑是基于主频为4.0 GHz的AMD FX8350八核处理器。
但后来我试图播放的视频,我找不到任何工具打他们,NvTranscode似乎产生原始的H.265视频数据,所以,我不想写我自己的小程序,我发现的ffmpeg还支持nvenc,只是默认情况下不,你必须自己编译。
有指示,建立与ffmpeg的nvenc在Ubuntu 15.10,但他们并没有在Ubuntu 14.04工作,所以我混那些与ffmpeg的Ubuntu的编制指南建造它为我的电脑。
首先,我们需要安装一些依赖关系,并创建一个工作目录:
|
1
2
3
4
|
sudo apt–get –y —force–yes install autoconf automake build–essential libass–dev libfreetype6–dev \
libsdl1.2–dev libtheora–dev libtool libva–dev libvdpau–dev libvorbis–dev libxcb1–dev libxcb–shm0–dev \
libxcb–xfixes0–dev pkg–config texinfo zlib1g–dev yasm
mkdir ffmpeg_sources
|
您还需要下载并安装/编译取决于我们要启用的编解码器的一些额外的软件包。我将跳过H.264和H.265,因为这会被Nvidia的GPU来处理,而是和使AAC和MP3音频编码器,VP8 / VP9和XviD视频解码器和编码器,以及libopus解码器和编码器的建设说明指南:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
cd ffmpeg_sources
wget –O fdk–aac.tar.gz https://github.com/mstorsjo/fdk–aac/tarball/master
tar xzvf fdk–aac.tar.gz
cd mstorsjo–fdk–aac*
autoreconf –fiv
./configure —prefix=“$HOME/ffmpeg_build” —disable–shared
make
make install
make distclean
cd ..
sudo apt–get install libmp3lame–dev
wget http://storage.googleapis.com/downloads.webmproject.org/releases/webm/libvpx–1.5.0.tar.bz2
tar xjvf libvpx–1.5.0.tar.bz2
cd libvpx–1.5.0
PATH=“$HOME/bin:$PATH” ./configure —prefix=“$HOME/ffmpeg_build” —disable–examples —disable–unit–tests
PATH=“$HOME/bin:$PATH” make
make install
make clean
cd..
sudo apt–get install libxvidcore–dev
sudo apt–get install libopus–dev
|
现在,我会下载并解压的ffmpeg快照(2016年1月3日)和所需的NVENC 6.0 SDK头文件复制到/ usr / local / include目录:
|
1
2
3
|
wget http://ffmpeg.org/releases/ffmpeg–snapshot.tar.bz2
tar xjvf ffmpeg–snapshot.tar.bz2
sudo cp ../nvidia_video_sdk_6.0.1/Samples/common/inc/*.h /usr/local/include/
|
在配置和ffmpeg的建设与nvenc启用:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
cd ffmpeg
PATH=“$HOME/bin:$PATH” PKG_CONFIG_PATH=“$HOME/ffmpeg_build/lib/pkgconfig” ./configure \
—prefix=“$HOME/ffmpeg_build” \
—pkg–config–flags=“–static” \
—extra–cflags=“-I$HOME/ffmpeg_build/include” \
—extra–ldflags=“-L$HOME/ffmpeg_build/lib” \
—bindir=“$HOME/bin” \
—enable–gpl \
—enable–libass \
—enable–libfdk–aac \
—enable–libfreetype \
—enable–libmp3lame \
—enable–libopus \
—enable–libtheora \
—enable–libvorbis \
—enable–libvpx \
—enable–nvenc \
—enable–libxvid \
—enable–nonfree
make –j9
|
您也可以选择安装它(我做到了):
|
1
|
sudo make install
|
这将在$ HOME /斌/ ffmpeg的安装。现在,我们可以验证的H.264和H.265启用nvenc支持:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
ffmpeg –codecs | grep nvenc
ffmpeg version N–77671–g97c162a Copyright (c) 2000–2016 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4–2ubuntu1~14.04)
configuration: —prefix=/home/jaufranc/ffmpeg_build —pkg–config–flags=—static —extra–cflags=–I/home/jaufranc/ffmpeg_build/include —extra–ldflags=–L/home/jaufranc/ffmpeg_build/lib —bindir=/home/jaufranc/bin —enable–gpl —enable–libass —enable–libfdk–aac —enable–libfreetype —enable–libmp3lame —enable–libopus —enable–libtheora —enable–libvorbis —enable–libvpx —enable–nvenc —enable–nonfree —enable–libxvid
libavutil 55. 12.100 / 55. 12.100
libavcodec 57. 21.100 / 57. 21.100
libavformat 57. 21.100 / 57. 21.100
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 23.100 / 6. 23.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
DEV.LS h264 H.264 / AVC / MPEG–4 AVC / MPEG–4 part 10 (decoders: h264 h264_vdpau ) (encoders: nvenc nvenc_h264 )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (encoders: nvenc_hevc )
|
完善。时间到了考验我们的1080p H.264视频样本,和编码在2000 kbps的。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
time ffmpeg –i h264_1080p_sample.m4v –vcodec nvenc_hevc –b:v 2000k h265_1080p_sample.mkv
ffmpeg version N–77671–g97c162a Copyright (c) 2000–2016 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4–2ubuntu1~14.04)
configuration: —prefix=/home/jaufranc/ffmpeg_build —pkg–config–flags=—static —extra–cflags=–I/home/jaufranc/ffmpeg_build/include —extra–ldflags=–L/home/jaufranc/ffmpeg_build/lib —bindir=/home/jaufranc/bin —enable–gpl —enable–libass —enable–libfdk–aac —enable–libfreetype —enable–libmp3lame —enable–libopus —enable–libtheora —enable–libvorbis —enable–libvpx —enable–nvenc —enable–nonfree —enable–libxvid
libavutil 55. 12.100 / 55. 12.100
libavcodec 57. 21.100 / 57. 21.100
libavformat 57. 21.100 / 57. 21.100
libavdevice 57. 0.100 / 57. 0.100
libavfilter 6. 23.100 / 6. 23.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘h264_1080p_sample.m4v’:
Metadata:
major_brand : mp42
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 2015–12–29 10:35:15
title : MVI_0820
encoder : HandBrake 7412svn 2015082501
Duration: 00:02:43.53, start: 0.000000, bitrate: 5870 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920×1080 [SAR 1:1 DAR 16:9], 5703 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc (default)
Metadata:
creation_time : 2015–12–29 10:35:15
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
creation_time : 2015–12–29 10:35:15
handler_name : Stereo
Output #0, matroska, to ‘h265_1080p_sample.mkv’:
Metadata:
major_brand : mp42
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : MVI_0820
encoder : Lavf57.21.100
Stream #0:0(und): Video: hevc (nvenc_hevc) (Main), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], q=-1–1, 2000 kb/s, 29.97 fps, 1k tbn, 29.97 tbc (default)
Metadata:
creation_time : 2015–12–29 10:35:15
handler_name : VideoHandler
encoder : Lavc57.21.100 nvenc_hevc
Side data:
unknown side data type 10 (24 bytes)
Stream #0:1(eng): Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 48000 Hz, stereo, fltp (default)
Metadata:
creation_time : 2015–12–29 10:35:15
handler_name : Stereo
encoder : Lavc57.21.100 libvorbis
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (nvenc_hevc))
Stream #0:1 -> #0:1 (aac (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help
....
video:39825kB audio:2327kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 0.295402%
real 0m30.338s
user 1m19.296s
sys 0m1.555s
|
它花了30秒,大约在同一时间与NvTranscode,但这次我和音频悦目的视频,我可以没有任何通知而视觉质量下降。
我反复试了H.264 1080P影片持续1小时57分钟29秒。这部电影的H.264码流进行编码,在2150 kbps的,所以一半,以减少文件的大小我所编码的电影在1075 kbps的(-b:v 1075k选项)。该编码只用了13分12秒,或约9倍的速度实时218帧。
我还检查了转码过程中的一些GPU的详细信息:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
nvidia–smi
Mon Jan 4 11:57:40 2016
+———————————————————————————+
| NVIDIA–SMI 358.16 Driver Version: 358.16 |
|———————————————–+———————————+———————————+
| GPU Name Persistence–M| Bus–Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory–Usage | GPU–Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 960 Off | 0000:01:00.0 On | N/A |
| 42% 38C P2 33W / 120W | 658MiB / 2047MiB | 10% Default |
+———————————————–+———————————+———————————+
+——————————————————————————————————————–+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1705 G /usr/bin/X 265MiB |
| 0 2582 G compiz 117MiB |
| 0 10267 G /usr/lib/firefox/plugin–container 22MiB |
| 0 22818 G totem 35MiB |
| 0 22917 C ffmpeg 200MiB |
+——————————————————————————————————————–+
|
这表明,例如,它不马克塞斯GPU的功率消耗(P 2模式:33瓦)。我的处理器负载不过是有点高于预期,虽然不是100%所有的时间将是软件视频转码的情况。
除了节省时间,视频转码与GPU图形也应该降低您的电费。多少钱完全取决于您的视频库的大小,电费和计算机的整体功耗。
而原来的文件大小为2.0GB,该H.265视频只有985 MB的大,和视频质量显得很接近原始视频的一。
最后,我转码4K的H.264视频@ 30 FPS(big_buck_bunny_4k_H264_30fps.mp4)的略少一半的比特率(3500 kbps的用于H.265 VS 7480 kbps的对H.264),并用了6分56秒编码10分30秒的视频。当检查质量的主要问题是在我的电脑疲于应付的H.265 4K视频使用,有很多文物在时间和声音削减图腾和VLC视频播放器的时候,但视频只打了罚款ffplay和科迪。
我想感谢GearBest提供铭瑄MS-GTX960显卡售价为$二百四十零点零四在其网站上。



