Originally posted by sdack
View Post
Using NVIDIA's NVENC On Linux With FFmpeg
Collapse
X
-
I've now managed to get even more speed from using an Nvidia GTX 960 for HEVC/H.265 encoding. Using ffmpeg 3.1.2 and Nvidia Video SDK 7.0.1 can one not only use two nvenc sessions in parallel for more speed, but it also allows to combine it with CUDA for faster image scaling on top of it. So instead of doing this:
Code:ffmpeg -i input.avi \ -c:a aac -b:a 128k \ -s hd480 \ -c:v hevc_nvenc -b:v 1024k \ -y output.mp4
Code:ffmpeg -i input.avi \ -c:a aac -b:a 128k \ -filter:v “hwupload_cuda,scale_npp=w=852:h=480:format=nv12:interp_algo=lanczos,hwdownload,format=nv12” \ -c:v hevc_nvenc -b:v 1024k \ -y output.mp4
When I started with it was I encoding videos at a speed of 10-20 fp/s with libx264, just so I can upload them to mobile phones and tablets. Needless to say how pointless it seemed having to wait several hours for the encoding to finish just to be able to watch a 30min video on a mobile phone.
Now, running two ffmpeg proccesses in parallel and using CUDA for scaling, am I encoding videos with a combined speed of 720 fp/s (2x360 fp/s) on a GTX 960.
Code:find Videos/ -type f -name \*.avi -print | sed 's/.avi$//' | xargs -n 1 -I@ -P 2 \ ffmpeg -i "@.avi" \ -c:a aac -b:a 128k \ -filter:v “hwupload_cuda,scale_npp=w=852:h=480:format=nv12:interp_algo=lanczos,hwdownload,format=nv12” \ -c:v hevc_nvenc -b:v 1024k \ -y "@.mp4"
Leave a comment:
-
-
I was in need of a fast encoder myself and now started using HEVC/H.265 with nvenc running on a GTX 960. Little did I know... not only is the quality good, the speed fast, but one can run two encoding processes in parallel!
For some reason does the GTX960 allow to run two nvenc session simultaneously, thereby doubling the theoretical encoding speed. So now am I encoding two videos at a time, each at 200fp/s. An example:
Code:$ find Videos/ -type f -name \*.avi -print | sed 's/.avi$//' |\ xargs -n 1 -I@ -P 2 ffmpeg -i "@.avi" -c:a aac -c:v hevc_nvenc "@.mp4"
Trying to start a third process results in an "out of memory error" and the Nvidia documentation (on their developers' website) states that a GTX960 can only run two sessions. Quadro cards supposedly can handle more than 2. This is some amazing encoding power.
Leave a comment:
-
-
You can also try nvenc_hevc for h265. But i see a difference. On Windows i have more pixel formats [Supported pixel formats: yuv420p nv12 yuv444p] and i can set a profile etc. Im Using the latest git code.
Code:Encoder nvenc [NVIDIA NVENC h264 encoder]: General capabilities: delay Threading capabilities: none Supported pixel formats: yuv420p nv12 yuv444p nvenc AVOptions: -preset <string> E..V.... Set the encoding preset (one of slow = hq 2pass, medium = hq, fast = hp, hq, hp, bd, ll, llhq, llhp, lossless, losslesshp, default) (default "medium") -profile <string> E..V.... Set the encoding profile (high, main, baseline or high444p) (default "main") -level <string> E..V.... Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1) (default "auto") -tier <string> E..V.... Set the encoding tier (main or high) (default "main") -cbr <boolean> E..V.... Use cbr encoding mode (default false) -2pass <boolean> E..V.... Use 2pass encoding mode (default auto) -gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from 0 to INT_MAX) (default 0) -delay <int> E..V.... Delays frame output by the given amount of frames. (from 0 to INT_MAX) (default INT_MAX)
Code:Encoder nvenc_hevc [NVIDIA NVENC hevc encoder]: General capabilities: delay Threading capabilities: none Supported pixel formats: yuv420p nv12 yuv444p nvenc_hevc AVOptions: -preset <string> E..V.... Set the encoding preset (one of slow = hq 2pass, medium = hq, fast = hp, hq, hp, bd, ll, llhq, llhp, lossless, losslesshp, default) (default "medium") -profile <string> E..V.... Set the encoding profile (high, main, baseline or high444p) (default "main") -level <string> E..V.... Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1) (default "auto") -tier <string> E..V.... Set the encoding tier (main or high) (default "main") -cbr <boolean> E..V.... Use cbr encoding mode (default false) -2pass <boolean> E..V.... Use 2pass encoding mode (default auto) -gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from 0 to INT_MAX) (default 0) -delay <int> E..V.... Delays frame output by the given amount of frames. (from 0 to INT_MAX) (default INT_MAX)
Leave a comment:
-
-
Interesting. I'll play around with some of the options later on as well. Here is what the ffmpeg help states about the switches we have access to:
Code:[sodo@box ~]$ ffmpeg -h encoder=nvenc ffmpeg version 2.6.8 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.1 (GCC) 20151207 (Red Hat 5.3.1-2) .. Encoder nvenc [Nvidia NVENC h264 encoder]: Threading capabilities: no Supported pixel formats: nv12 nvenc AVOptions: -preset <string> E..V.... Set the encoding preset (one of hq, hp, bd, ll, llhq, llhp, default) (default "hq") -cbr <int> E..V.... Use cbr encoding mode (from 0 to 1) (default 0) -2pass <int> E..V.... Use 2pass cbr encoding mode (low latency mode only) (from -1 to 1) (default -1) -gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from 0 to INT_MAX) (default 0)
Leave a comment:
-
-
i download a uhd sample right now and see if it is a big impact (ofc there is a impact)
EDIT: So UHD 3840x2160 are encoded with hevc with around 27 fps and with h264 33fps. I can test it also with quicksync
Uh, but the quality is low. I test it with another preset slow = horrible
EDIT2: hq looks better but still low. ok the source file is over 1GB and the output has only 30MB. He goes to 2000 kbit for both per default. Without the Preset the encoding is a bit faster, around 40fps with uhd
PS: qsv is not starting but eat up one core without progressLast edited by Nille; 25 May 2016, 04:13 PM.
Leave a comment:
-
-
Hi Nille,
I should have made it more clear that my source is a much larger 2.7K video from a GoPro, not the 1080P content that you're transcoding.
That being said, I'll try a 1080P render to see what I get.
'sodo
Leave a comment:
-
-
i get much much more fps with my 960. I have Encoded a 1080p with over 200 fps.
Code:ffmpeg -i "input(1080p).mp4" -map 0 -loglevel repeat+verbose -c copy -c:v nvenc -preset slow -movflags +faststart "output-nvenc.mp4"
Code:ffmpeg -i "input(1080p).mp4" -map 0 -loglevel repeat+verbose -c copy -c:v nvenc_hevc -preset slow -movflags +faststart "output-nvenc_hevc.mp4"
i would provide my builds but due to all the included stuff its not distributable.Last edited by Nille; 25 May 2016, 01:56 PM.
Leave a comment:
-
-
This thread was helpful to me in getting FFmpeg compiled on Fedora 22. I posted initial results of the CPU offload from a 2.7K source video and FPS increase by using nvenc over libx264. Impressive.Last edited by cacasodo; 25 May 2016, 02:02 PM.
Leave a comment:
-
-
Originally posted by tuke81 View PostDoes anyone have 2nd generation maxwell(gtx980/970/960), nvenc 5.0 sdk have now h265 support. Well I'm quite sure it won't work with ffmpeg yet but I'm a bit curious how it works with samples bundled with sdk.
I've tested the latest ffmpeg version (git) with a Maxwell Gen 2 GTX 980M and NVENC for H.264 and H.265/HEVC is working just fine.
Leave a comment:
-
Leave a comment: