#7272 closed defect (fixed)
encoding with hevc_amf results in video where forwarting is a mess
Reported by: | Marco Pardo | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avcodec |
Version: | git-master | Keywords: | amf |
Cc: | cornofear@yahoo.ca | Blocked By: | |
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description
Hi,
I recode videos on nvidia and AMD cards in x265.
The nvidia output is nice and ok (in example for ref). The AMD output looks OK. But you can not fast forward in it. It uses 100% CPU and needs minutes.
The funny thing is that for the nvidia compile I used an old version of ffmpeg and for the amd I used the newest version.
Are there missing parameters by the AMD ffmpeg command or is it a bug with compiling with hevc_amf?
EXAMPLETIME
For example I have cut a 3 minute video and compiled it both ways.
Original clip: https://sheepchen.net/nextcloud/index.php/s/Nku5EUrTZ37BzAo
ENC NVIDIA (good): https://sheepchen.net/nextcloud/index.php/s/RJCXZzsIJBOWVK7
ENC AMD (bad): https://sheepchen.net/nextcloud/index.php/s/e61XOfrHxpghwwf
EXAMPLE NVIDIA:
\ffmpeg_20170827\bin\ffmpeg.exe -hwaccel cuvid -i "s:\temp\in_orig.mkv" -c:v hevc_nvenc -profile:v main -rc vbr_hq -qmin 18 -qmax 24 -b:v 1000k -maxrate 3000k -preset slow -rc-lookahead 32 -g 250 -c:a copy -c:s copy -map 0 "s:\temp\out_nvidia.mkv"
ffmpeg version N-87095-gef0c6d9 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 7.1.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib
libavutil 55. 74.100 / 55. 74.100
libavcodec 57.103.101 / 57.103.101
libavformat 57. 78.100 / 57. 78.100
libavdevice 57. 8.100 / 57. 8.100
libavfilter 6.100.100 / 6.100.100
libswscale 4. 7.103 / 4. 7.103
libswresample 2. 8.100 / 2. 8.100
libpostproc 54. 6.100 / 54. 6.100
Input #0, matroska,webm, from 's:\temp\in_orig.mkv':
Metadata:
ENCODER : Lavf57.71.100
Duration: 00:01:00.00, start: 0.080000, bitrate: 12347 kb/s
Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Metadata:
DURATION : 00:01:00.000000000
Stream #0:1(ger): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
Stream #0:2: Audio: ac3, 48000 Hz, stereo, fltp, 448 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (hevc_nvenc))
Stream #0:1 -> #0:1 (copy)
Stream #0:2 -> #0:2 (copy)
Press [q] to stop, ? for help
Output #0, matroska, to 's:\temp\out_nvidia.mkv':
Metadata:
encoder : Lavf57.78.100
Stream #0:0: Video: hevc (hevc_nvenc) (Main), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=18-24, 1000 kb/s, 25 fps, 1k tbn, 25 tbc (default)
Metadata:
DURATION : 00:01:00.000000000
encoder : Lavc57.103.101 hevc_nvenc
Side data:
cpb: bitrate max/min/avg: 3000000/0/1000000 buffer size: 2000000 vbv_delay: -1
Stream #0:1(ger): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
Stream #0:2: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 448 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
%
EXAMPLE AMD:
\ffmpeg-20180619\bin\ffmpeg.exe -hwaccel dxva2 -i "s:\temp\in_orig.mkv" -c:v hevc_amf -profile:v main -qmin 18 -qmax 24 -b:v 1000k -maxrate 3000k -rc-lookahead 32 -g 250 -c:a copy -c:s copy -map 0 "s:\temp\out_amd.mkv"
ffmpeg version N-91330-ga990184007 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7.3.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
libavutil 56. 18.102 / 56. 18.102
libavcodec 58. 20.103 / 58. 20.103
libavformat 58. 17.100 / 58. 17.100
libavdevice 58. 4.101 / 58. 4.101
libavfilter 7. 25.100 / 7. 25.100
libswscale 5. 2.100 / 5. 2.100
libswresample 3. 2.100 / 3. 2.100
libpostproc 55. 2.100 / 55. 2.100
Input #0, matroska,webm, from 's:\temp\in_orig.mkv':
Metadata:
ENCODER : Lavf57.71.100
Duration: 00:01:00.00, start: 0.080000, bitrate: 12347 kb/s
Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Metadata:
DURATION : 00:01:00.000000000
Stream #0:1(ger): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
Stream #0:2: Audio: ac3, 48000 Hz, stereo, fltp, 448 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (hevc_amf))
Stream #0:1 -> #0:1 (copy)
Stream #0:2 -> #0:2 (copy)
Press [q] to stop, ? for help
Output #0, matroska, to 's:\temp\out_amd.mkv':
Metadata:
encoder : Lavf58.17.100
Stream #0:0: Video: hevc (hevc_amf), nv12, 1920x1080 [SAR 1:1 DAR 16:9], q=18-24, 1000 kb/s, 25 fps, 1k tbn, 25 tbc (default)
Metadata:
DURATION : 00:01:00.000000000
encoder : Lavc58.20.103 hevc_amf
Stream #0:1(ger): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
Stream #0:2: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 448 kb/s (default)
Metadata:
DURATION : 00:00:59.952000000
%
Change History (16)
comment:1 by , 6 years ago
Priority: | important → normal |
---|
comment:2 by , 6 years ago
comment:3 by , 6 years ago
Hi,
The recoding using the GPU (80% load on GPU and fast.. definily using GPU chip).
The playback from both clips is on the AMD Ryzen 5 (with internal Vega 11 GPU). The Video that was encoded using the NVIDIA has no problems (playback on AMD). The video that was encoded on the AMD has slow forwarting on AMD and Intel CPUs.
Playback in all 4 instances (INTEL, AMD CPU and NVIDIA, VEGA encoded video) was with VLC.
The problem is definitly by encoding with AMD hardware acceleration.
How can I set the codec frame size? Then I try it..
comment:4 by , 6 years ago
hi
thanks for the sample clips.
could you transcode the clip once again but with -c:v h264_amf parameter to see if it is h264 or just hevc related?
comment:5 by , 6 years ago
Hi,
here a reupload of the x265 command: https://sheepchen.net/nextcloud/index.php/s/Fy8Kk8ZYlJgc0Br
here the x264 command: https://sheepchen.net/nextcloud/index.php/s/LH2j8ugitFw89W2
here the x264 file: https://sheepchen.net/nextcloud/index.php/s/HcYsFBBc7sO3moa
The x264 file has no problem by fast forwarting.
comment:6 by , 6 years ago
I reproduced the problem. It appeared that AMD HEVC encoder has an additional parameter that controls frequency of IDR frames. And in turn IDRs are needed to indicate key frames used in seek. Please add "-gops_per_idr 1" to your command line. It will write IDR on every GOP. Maybe, it makes sense to change ffmpeg AMF default value from 60 to 1.
comment:7 by , 6 years ago
I reproduced the problem. It appeared that AMD HEVC encoder has an additional parameter that controls frequency of IDR frames. And in turn IDRs are needed to indicate key frames used in seek. Please add "-gops_per_idr 1" to your command line. It will write IDR on every GOP. Maybe, it makes sense to change ffmpeg AMF default value from 60 to 1.
comment:9 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Yes, this solved the problem! Thanks!
Here is the command: ffmpeg.exe -hwaccel dxva2 -i <inputfile> -c:v hevc_amf -gops_per_idr 1 -profile:v main -qmin 18 -qmax 24 -b:v 1000k -maxrate 3000k -rc-lookahead 32 -g 250 -c:a copy -c:s copy -map 0 <outputfile>
Here is the command output: https://sheepchen.net/nextcloud/index.php/s/n7Y85DfDRkotQX5
And here is the encoded videofile: https://sheepchen.net/nextcloud/index.php/s/HGoovTtsqOlJCvP
comment:10 by , 6 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Either there never was an issue or this can still be improved, it was not fixed.
comment:11 by , 6 years ago
ok, right.
It would be nice if ffmpeg use the default value "-gops_per_idr 1" if hevc_amf is used and no other value of gops_per_idr is set.
comment:12 by , 6 years ago
well i am on macOS High Sierra 10.13 which introduced native hardware accelerated playback of hevc media files and this clip when further transcoded with -c:v copy -c:a aac -tag:v? hvc1 out.mp4 still doesnt seek very well. so what further settings should be enabled?
comment:13 by , 6 years ago
Keywords: | amf added; hevc_amf removed |
---|
comment:14 by , 4 years ago
Cc: | added |
---|
As of git-2020-05-19-74dfc88 the default gops_per_idr is still 60 rather than 1.
comment:15 by , 4 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
Fixed in 76a3ee996bf9f3435b1c11d69639cd1e971f20c3.
comment:16 by , 4 years ago
Component: | undetermined → avcodec |
---|---|
Version: | unspecified → git-master |
hello
Fast forwarding on AMD output is slow because it is not even using gpu acceleration on latest hardware for playback that means cpu slowing everything down. Inspecting clip with ffmpeg reports : track 1: codec frame size is not set. maybe is it related to that? how can we fix this?