我们今天的主角 NVENC 是 Nvidia 自 Kepler 架构显卡(600系)起所配备的独立显卡编码加速单元。 相较于过往使用 CUDA 通用计算进行加速,NVENC 无论是画质还是性能方面都有了长足的进步。 今天我们便以 NVENC 为例,实战处理非常常见的 1080P 30fps 6Kbps 标准的视频压缩存档。 不支持 NVENC 的显卡:MX130 MX150 MX330 MX350 GT 1030 等。 reizhi 在10系显卡上测试使用 nvenc 后发觉画面锐度略有下降,推荐按照上图设置轻微的细节锐化。
NVIDIA 编码器 NVENC。 对于 Twitch,选择硬件 (NVENC, H.264)。 对于 YouTube,如果您使用 RTX 40 系列 GPU,选择硬件 (NVENC, AV1),其它 GeForce 型号则选硬件 (NVENC, HEVC)。 对于 YouTube,如果您使用 RTX 40 系列 GPU,选择硬件 (NVENC, AV1),其它 GeForce 型号则选硬件 (NVENC, HEVC)。 NVENC 的另一个优势是,通常每一代 GPU 使用相同版本的 NVENC。 例如,GeForce RTX 4090 和 GeForce RTX 4050 都具有相同的编码器质量。
最近弄了一台带 GT 710 显卡的杜甫,便想着可以利用 Nvenc 显卡硬件编码来驱动 Jellyfin 在线转码云播。 另一方面,目前版本的 Jellyfin 所自带的 FFmpeg 编译时已经加入了 Nvenc 和 Nvdec 支持,无需再手动编译 ffmpeg 。 如果需要开启 Jellyfin 的硬件转码功能,还需要两个额外的操作: 1.进入“控制台-播放-转码”并选择 Nvidia Nvenc 保存 2.在 ssh 终端执行: usermod -aG render
找到obs-ffmpeg这个模块,里面有个文件jim_nvenc.c struct obs_encoder_info nvenc_info = { .id = = nvenc_update, .encode_texture = nvenc_encode_tex, .get_defaults = nvenc_defaults = nvenc_sei_data, }; 上面这段代码就是nvenc的h264编码模块,nvenc是NVIDIA推出的显卡编码工具,同时具备h264和h265编码功能,只是OBS , .destroy = nvenc_destroy, .update = nvenc_update, .encode_texture = nvenc_encode_tex, .get_defaults = nvenc_defaults, .get_properties = nvenc_properties, .get_extra_data = nvenc_extra_data, .get_sei_data
另外receive流程没有上述限制,在成功收到一帧码流之后,仍然会调用receive,比较灵活,可以做一些定制化的操作2 适配接口适配接口参考ffmpeg/libavcodec/nvenc_h264.c ,这是英伟达的硬件编码器接口,自定义一个编码器只需实现以下结构体const FFCodec ff_h264_nvenc_encoder = { .p.name = "h264_nvenc (ff_nvenc_receive_packet), .close = ff_nvenc_encode_close, .flush = ff_nvenc_encode_flush , .p.wrapper_name = "nvenc", .hw_configs = ff_nvenc_hw_configs,};这里面最重要三个接口是init、close和receive ;static const AVClass h264_nvenc_class = { .class_name = "h264_nvenc", .item_name = av_default_item_name
查看 ffmpeg 中 hevc_nvenc 支持的像素格式: [root@node0 ~]# ffmpeg -hide_banner -h encoder=hevc_nvenc | grep "pixel /hevc_4k_422_10b_5994_60m_vibe.ts -c:v hevc_nvenc -preset fast -profile:v main10 -c:a aac -f mpegts buffersink 滤镜的输入格式,是 ffmpeg 在 buffersink 滤镜前插入 format 滤镜,在执行 format 滤镜初始化时,从 hevc_nvenc 编码器支持的像素格式列表中 /hevc_4k_422_10b_5994_60m_vibe.ts -vf format=yuv420p10le -c:v hevc_nvenc -preset fast -profile:v main10 /hevc_4k_422_10b_5994_60m_vibe.ts -vf format=p010le -c:v hevc_nvenc -preset fast -profile:v main10 -
vod.VideoCodec { case "H.264": vcodec = "copy" case "VP9": // vp9 编码,仅能够转换成 h265 编码, nvenc 代表设置编码 vcodec = "hevc_nvenc" case "HEVC": // hevc 编码为 h265 编码,转换成 h264,有两种 h264_nvenc
更新功能: 更新了 Exiv2 图片信息库 更新了 ffmpeg5.1 版本 调整了视频合并命名规则 修正了视频合并中图片读取错误 加入 av1_nvenc,h264_mf,h265_mf 硬件编码 优化了 h26X_nvenc h26X_qsv h26X_amf 的编码参数 硬件编码 h26X_nvenc 增加了恒定质量参数 CQ 优化了中低质量和大小的分辨率 格式工厂 FormatFactory 5.13.0
与Intel 提出的VA-API在Linux上竞争,但最近的趋势似乎是Nvidia走向了更为封闭的方式,最主要的倾向是,Nvidia似乎放缓了对VPDAU的支持,取而代之的是提供较为封闭的NVDEC与NVENC 另外,在FFmpeg中集成NVENC 与NVDEC的方式与FFmpeg QSV集成Intel Media SDK方式一致,也是以集成第三方库的方式集成进FFmpeg的。 这带来的弊端是,对NVENC/NVDEC的依赖较大,加上Nvidia并未开放NVENC/NVDEC的代码,因此如果想做二次开发或者功能增强以及性能调整的时候,基本都得依赖Nvidia自身去改动NVENC 另外,CUVID部分,为了和NVENC统一,Nvidia已经把它改称为NVENC,但FFmpeg并没有去做这个更新。 /on-demand.gputechconf.com/gtc/2016/presentation/s6226-abhijit-patait-high-performance-video.pdf 这里对NVENC
视频编码性能测试 使用ffmpeg进行编码性能测试,编码参数: ffmpeg -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i test.mp4 -c:v h264_nvenc ffmpeg -vsync 0 -i testencoder.mp4 -c:v h264_nvenc -preset slow -profile main -qp 20 output22.mp4 frame 关闭B帧: ffmpeg -vsync 0 -i testencoder.mp4 -c:v hevc_nvenc -preset fast -b_ref_mode 0-t 180 output33.mp4fps = 826 编码视频体积 46.4MB 指定b_ref_mode为2: ffmpeg -vsync 0 -i testencoder.mp4 -c:v h264_nvenc -preset fast 180 output22.mp4 fps = 868 编码视频体积46.4MB 同参数下选用h.264编码: ffmpeg -vsync 0 -i testencoder.mp4 -c:v h264_nvenc
NVIDIA GPU 配备了编码(NVenc)和解码(NVdec)专用硬件。 CPU 上的图像在计算时会被迅速上传至 GPU,而 GPU 上的图像可从 NVENC/NVDEC 或 CUDA 内核等来源获得。 NVIDIA GPU 可以在独立于 NVENC 和 NVDEC 的 GPU 内核上运行计算任务。NVENC 使用原始视频帧,而 NVDEC 则将输出帧解码到视频内存中。 因此,由于 NVENC 不需要 GPU 计算资源,可以在编码过程中计算 VMAF。VMAF-CUDA 还可在转码过程中用于质量监控。 该参考帧使用 NVENC 编码为 H.265,可直接解码,从而产生失真的帧。这一过程将计算资源闲置,同时在 GPU 上进行转码,并将数据保存在 GPU 内存中。
在linux 平台做FFMPEG视频编码的程序时,程序运行时提示错误:[h264_nvenc @ 0x2018080] Cannot load libcuda.so.1 。 要解决 [h264_nvenc @ 0x2018080] Cannot load libcuda.so.1 这个问题,并不是要安装cuda,而是需要安装解码库。
基于英伟达显卡硬编码(NVIDIA NVENC)的RTMP、RTSP低延迟技术方案: 4K相当于4个1080P,Windows平台软编码有些困难,特别是h265,姑且不说4K软编,4K软解在一些配置一般的机器都比较吃力 针对编码这块,我们实现了基于英伟达显卡硬编码(NVIDIA NVENC)的RTMP、RTSP低延迟技术解决方案,无论是H265还是H264 4K 30fps都能编的动(以下测试截图,基于GeForce 硬解码效果(对应 SmartPlayer.exe): RTMP H264 4K 硬编解码GPU, CPU占用情况: RTMP H264 4K直播低延时效果: 总结: 从整体测试来看,英伟达硬编码(NVENC )能达到期望的效果,可以满足毫秒级低延时大分辨率需求,同时NVENC也提供了灵活的码率控制策略来满足不同的编码需求。
28.0 详细说明: 功能特点: 支持直播推流(RTMP协议) 多平台录制(Windows/macOS/Linux) 场景/源管理系统 音频混合器 视频编码器(x264/NVENC Apple Silicon支持 改进浏览器源性能 优化音频处理管线 新增HEVC编码支持 修复多显示器捕获问题 使用建议: 直播建议上传带宽≥5Mbps 录制建议使用NVENC
如果计算机中存在英伟达显卡,对于以上参数还可以继续优化,将 libx264 修改为 h264_nvenc,即可加快转码速度。 ffmpeg.exe -fflags +genpts -hide_banner -i input.mp4 -vcodec h264_nvenc -acodec copy -strict -2 -f hls -hls_time 8 -hls_list_size 0 output.m3u8 libx264 参数为仅使用 cpu 的能力进行视频转码,h264_nvenc 调用了显卡的程序进行转码,速度更快。
NVIDIA NVENC H.264 encoder (codec h264) V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264) V..... nvenc NVIDIA NVENC H.264 encoder (codec h264) V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec NVENC hevc encoder (codec hevc) V....D hevc_amf AMD AMF HEVC encoder (codec hevc) V... .D hevc_mf HEVC via MediaFoundation (codec hevc) V....D hevc_nvenc NVIDIA NVENC
ffmpeg -y -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:a copy -vf scale_npp=920:-2 -c:v h264_nvenc ffmpeg -y -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:a copy -vf scale=920:-2 -c:v h264_nvenc
disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc
NVIDIA AMD INTEL 编码器 NVENC UVD 参考sample_encode 解码器 NVDEC VCE 参考sample_decode 对应的SDK Video_Codec_SDK AMF 硬件编解码SDK方案 2)FFMPEG方案 ffmpeg对厂家SDK进行封装和集成,实现部分的硬件编解码 NVIDIA AMD INTEL 编码器 xxx_nvenc
NVIDIA NVENC H.264 encoder (codec h264) V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264) V..... nvenc NVIDIA NVENC H.264 encoder (codec h264) V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec NVENC hevc encoder (codec hevc) V....D hevc_amf AMD AMF HEVC encoder (codec hevc) V... .D hevc_mf HEVC via MediaFoundation (codec hevc) V....D hevc_nvenc NVIDIA NVENC