2

Problem

  • Files created with hevc_nvenc do not play on TV. (samsung smart tv, model unknown) Related to my ffmpeg build is below.

FFmpeg build conf

$ ffmpeg -buildconf
    --enable-cuda
    --enable-cuvid
    --enable-nvenc
    --enable-nonfree
    --enable-libnpp
    --extra-cflags=-I/path/cuda/include
    --extra-ldflags=-L/path/cuda/lib64
    --prefix=/prefix/ffmpeg_build
    --pkg-config-flags=--static
    --extra-libs='-lpthread -lm'
    --extra-cflags=-I/prefix/ffmpeg_build/include
    --extra-ldflags=-L/prefix/ffmpeg_build/lib
    --enable-gpl
    --enable-nonfree
    --enable-version3
    --disable-stripping
    --enable-avisynth
    --enable-libass
    --enable-libfontconfig
    --enable-libfreetype
    --enable-libfribidi
    --enable-libgme
    --enable-libgsm
    --enable-librubberband
    --enable-libshine
    --enable-libsnappy
    --enable-libssh
    --enable-libtwolame
    --enable-libwavpack
    --enable-libzvbi
    --enable-openal
    --enable-sdl2
    --enable-libdrm
    --enable-frei0r
    --enable-ladspa
    --enable-libpulse
    --enable-libsoxr
    --enable-libspeex
    --enable-avfilter
    --enable-postproc
    --enable-pthreads
    --enable-libfdk-aac
    --enable-libmp3lame
    --enable-libopus
    --enable-libtheora
    --enable-libvorbis
    --enable-libvpx
    --enable-libx264
    --enable-libx265
    --disable-ffplay
    --enable-libopenjpeg
    --enable-libwebp
    --enable-libxvid
    --enable-libvidstab
    --enable-libopenh264
    --enable-zlib
    --enable-openssl

ffmpeg Command

  • Command about FFmpeg encoding
ffmpeg -ss 1800 -vsync 0 -hwaccel cuvid -hwaccel_device 0 \
-c:v h264_cuvid -i /data/input.mp4 -t 10 \
-filter_complex "\
[0:v]hwdownload,format=nv12,format=yuv420p,\
scale=iw*2:ih*2" -gpu 0 -c:v hevc_nvenc -pix_fmt yuv444p16le -preset slow -rc cbr_hq -b:v 5000k -maxrate 7000k -bufsize 1000k -acodec aac -ac 2 -dts_delta_threshold 1000 -ab 128k -flags global_header ./makevideo_nvenc_hevc.mp4

Full log about This Command - check this full log

The reason for adding "-color_ ~" in the command is as follows.

  • HDR video after creating bt2020 + smpte2084 video using nvidia hardware accelerator. (I'm studying to make HDR videos. I'm not sure if this is right.)

How can I make a video using ffmpeg hevc_nvenc and have it play on TV?


Things i've done

Here's what I've researched about why it doesn't work. -The header information is not properly included in the resulting video file. So I used a program called nvhsp to add SEI and VUI information inside the video. See below for the commands and logs used.

nvhsp is open source for writing VUI and SEI bitstrings in raw video. nvhsp link

# make rawvideo for nvhsp
$  ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 0 -c:v h264_cuvid \
-i /data/input.mp4 -t 10 \
-filter_complex "[0:v]hwdownload,format=nv12,\
format=yuv420p,scale=iw*2:ih*2" \
-gpu 0 -c:v hevc_nvenc -f rawvideo output_for_nvhsp.265

# use nvhsp
$ python nvhsp.py ./output_for_nvhsp.265 -colorprim bt2020 \
-transfer smpte-st-2084 -colormatrix bt2020nc \
-maxcll "1000,300" -videoformat ntsc -full_range tv \
-masterdisplay "G (13250,34500) B (7500,3000 ) R (34000,16000) WP (15635,16450) L (10000000,1)" \
./after_nvhsp_proc_output.265

Parsing the infile:

==========================

Prepending SEI data
Starting new SEI NALu ...
SEI message with MaxCLL = 1000 and MaxFall = 300 created in SEI NAL
SEI message Mastering Display Data G (13250,34500) B (7500,3000) R (34000,16000) WP (15635,16450) L (10000000,1) created in SEI NAL
Looking for SPS ......... [232, 22703552]
SPS_Nals_addresses [232, 22703552]
SPS NAL Size 488
Starting reading SPS NAL contents
Reading of SPS NAL finished. Read 448 of SPS NALu data.

Making modified SPS NALu ...
Made modified SPS NALu-OK
New SEI prepended
Writing new stream ...
Progress: 100%
=====================
Done!

File nvhsp_after_output.mp4 created.

# after process
$ ffmpeg -y -f rawvideo -r 25 -s 3840x2160 -pix_fmt yuv444p16le -color_primaries bt2020 -color_trc smpte2084  -colorspace bt2020nc -color_range tv -i ./1/after_nvhsp_proc_output.265 -vcodec copy  ./1/result.mp4 -hide_banner

Truncating packet of size 49766400 to 3260044
[rawvideo @ 0x40a6400] Estimating duration from bitrate, this may be inaccurate
Input #0, rawvideo, from './1/nvhsp_after_output.265':
  Duration: N/A, start: 0.000000, bitrate: 9953280 kb/s
    Stream #0:0: Video: rawvideo (Y3[0][16] / 0x10003359), yuv444p16le(tv, bt2020nc/bt2020/smpte2084), 3840x2160, 9953280 kb/s, 25 tbr, 25 tbn, 25 tbc
[mp4 @ 0x40b0440] Could not find tag for codec rawvideo in stream #0, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
    Last message repeated 1 times

Goal

  • I want to generate matadata normally when encoding a video through hevc_nvenc.

  • I want to create a video through hevc_nvenc and play HDR Video on smart tv with 10bit color depth support.


Additional

  • Is it normal for ffmpeg hevc_nvenc not to generate metadata in the resulting video file? or is it a bug?

  • Please refer to the image below. (*'알 수 없음' meaning 'unknown')

    • if you need more detail file info, check this Gist Link (by ffprobe) hevc_nvenc metadata
  • However, if you encode a file in libx265, the attribute information is entered correctly as shown below.

    • if you need more detail file info, check this Gist Link libx265 metadata

However, when using hevc_nvenc, all information is missing.

  • i used option -show_streams -show_programs -show_format -show_data -of json -show_frames -show_log 56 at ffprobe
Dashhh
  • 21
  • 4
  • Are you sure the TV can decode HEVC, yuv444p16le, and main10? What's the point of forcing yuv444p16le although you already set yuv420p? Can you show the info of a video that does play on the TV (output of `ffmpeg -i input.mp4`)? – llogan Jan 28 '20 at 18:22
  • @llogan, Thank you for your help! i checked answer late.. We are working on a study using a.i. to make yuv444p16le from yuv420p. Please check the link for 'input.mp4' video information. (https://pastebin.com/XWixHcg4). This is the result of printing using ffprobe. – Dashhh Jan 30 '20 at 18:53

0 Answers0