我正在尝试对级别小于或等于 5.0 的 4K(3840x2160)流进行编码,但没有成功。
我正在使用 ffmpeg 最新版本、nvidia 驱动程序 410.66。全部在 nvidia/cuda:8.0-devel-ubuntu16.04 映像上进行 dockerized。
我的测试命令:
ffmpeg -nostdin -loglevel trace -hwaccel cuvid -c:v hevc_cuvid -analyzeduration 10000000 -probesize 10000000 -y -i "udp://239.1.2.3:1234?pkt_size=1316\&timeout=2500000\&buffer_size=409600\&fifo_size=1000000\&overrun_nonfatal=1" -map i:0x100 -filter:v:0 "scale_cuda=w=3840:h=2160" -c:v:0 hevc_nvenc -profile main -level 150 -preset llhp -zerolatency 1 -cbr 1 -rc cbr_ld_hq -b:v:0 2000k -minrate:0 1500k -maxrate:0 2400k -bufsize:0 1000k -map i:0x101 -c:a copy -f ismv /tmp/test.ismv
它必须小于或等于,因为苹果规格说:
1.6. HEVC 的配置文件、级别和层级必须小于或等于 Main10 配置文件、级别 5.0、高层级。
奇怪的是,如果我以较低的分辨率(HD)进行编码,它可以工作,但使用 4K 分辨率时我收到此错误:
InitializeEncoder 失败:参数无效(8)初始化输出流 0:0 时出错——打开输出流 #0:0 的编码器时出错 - 可能存在不正确的参数,例如 bit_rate、rate、width 或 height
我的 ffmpeg 配置命令:
PKG_CONFIG_PATH="/usr/local/nv-codec-headers" ./configure --prefix=/usr/local/ffmpeg_build --extra-cflags='-I/usr/local/ffmpeg_build/include -I/usr/local/cuda/include/' --extra-ldflags='-L/usr/local/ffmpeg_build/lib -L/usr/local/cuda/lib64/' --bindir=/usr/local/bin --extra-libs=-ldl --enable-cuvid --enable-cuda --enable-cuda-sdk --enable-nvenc --enable-filter=scale_cuda --enable-filter=thumbnail_cuda --enable-libnpp --enable-gpl --enable-libx264 --enable-libfdk-aac --enable-nonfree --enable-version3
答案1
HEVC 级别 5.0 支持每秒最多 267,386,880 个亮度样本 3840 x 2160 即每帧 8,294,400 个样本 8,294,400/267,386,880 = 每秒最多 32 帧。(见此处)https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding_tiers_and_levels)
您的视频Video: hevc (Main 10), 1 reference frame ([36][0][0][0] / 0x0024), yuv420p10le(tv, bt709), 3840x2160 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 50 tbc
每秒 50 帧。
如果你将帧速率降低到 25,它就可以工作。否则你需要升级到 5.1 级