ffmpeg最简单方式支持nvidia硬编解码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

因为工作内容的需要,之前写过一篇文章关于ffmpeg支持英伟达的硬编解码,那个方法比较适合定制化的ffmpeg编译,如果你仅仅使用ffmpeg进行硬件编解码的话,其实不需要这么麻烦。
ffmpeg定制化编译支持cuda编解码


一、nvidia硬编解码是什么?

这个之前的文章已经说过,这里不再多做叙述。可以理解为一种专门的硬件,处理视频解码和编码。

二、使用步骤

首先你需要一张nvidia的卡,最好是GTX以上级别的,因为有些显卡没有硬件编解码器,比如GT920M这种早期笔记本显卡。

AV1在RTX30系列显卡上获得了硬件支持,因为手上没有30系显卡,所以今天只说H264和H265。

今天的比较简单,得益于ffmpeg-3.4功能,让我们在不用编译的情况下就可以直接安装这个版本。

1.安装

确保你的分发版默认的ffmpeg版本支持3.4以上的版本,Ubuntu需要>=18.04,Debian需要>=9。其他的分发版请自行查看。

安装方法也比较简单,使用官方源安装即可。
Ubuntu&Debian:

sudo apt update
sudo apt install ffmpeg

2.确认

确认需要用到两个options,一个是-decoders,一个是-encoders

这里输出太长了,我只截取一部分。

1.硬件解码器

ffmpeg -decoders
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 VFS..D hap                  Vidvox Hap
 VFS..D hevc                 HEVC (High Efficiency Video Coding)
 V..... hevc_v4l2m2m         V4L2 mem2mem HEVC decoder wrapper (codec hevc)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V....D hnm4video            HNM 4 video
 V....D hq_hqa               Canopus HQ/HQA
 VFS..D hqx                  Canopus HQX
 VF..BD huffyuv              Huffyuv / HuffYUV
 VF..BD hymt                 HuffYUV MT
 V....D idcinvideo           id Quake II CIN video (codec idcin)
 V....D idf                  iCEDraw text
 V....D iff                  IFF ACBM/ANIM/DEEP/ILBM/PBM/RGB8/RGBN (codec iff_ilbm)
 V....D imm4                 Infinity IMM4
 V....D indeo2               Intel Indeo 2
 V....D indeo3               Intel Indeo 3
 V....D indeo4               Intel Indeo Video Interactive 4
 V....D indeo5               Intel Indeo Video Interactive 5
 V....D interplayvideo       Interplay MVE video
 VFS..D jpeg2000             JPEG 2000
 VF...D libopenjpeg          OpenJPEG JPEG 2000 (codec jpeg2000)
 V....D jpegls               JPEG-LS
 V....D jv                   Bitmap Brothers JV video
 V....D kgv1                 Kega Game Video
 V....D kmvc                 Karl Morton's video codec
 VF...D lagarith             Lagarith lossless
 V....D loco                 LOCO
 V....D lscr                 LEAD Screen Capture
 V....D m101                 Matrox Uncompressed SD
 V....D eamad                Electronic Arts Madcow Video (codec mad)
 VFS..D magicyuv             MagicYUV video
 VF...D mdec                 Sony PlayStation MDEC (Motion DECoder)
 VF...D mimic                Mimic
 V....D mjpeg                MJPEG (Motion JPEG)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V....D mjpegb               Apple MJPEG-B
 V....D mmvideo              American Laser Games MM Video
 V....D motionpixels         Motion Pixels video
 V.S.BD mpeg1video           MPEG-1 video
 V..... mpeg1_v4l2m2m        V4L2 mem2mem MPEG1 decoder wrapper (codec mpeg1video)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V.S.BD mpeg2video           MPEG-2 video
 V.S.BD mpegvideo            MPEG-1 video (codec mpeg2video)
 V..... mpeg2_v4l2m2m        V4L2 mem2mem MPEG2 decoder wrapper (codec mpeg2video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 VF..BD mpeg4                MPEG-4 part 2
 V..... mpeg4_v4l2m2m        V4L2 mem2mem MPEG4 decoder wrapper (codec mpeg4)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)

所有支持的解码器中后缀带_cuvid的都是英伟达的硬件解码格式,按照自己的需要选择。

2.硬件编码器

一般硬件差不多都是解码能力强过编码能力,英伟达也不例外,可能支持的编码格式没有解码那么多。

ffmpeg -encoders
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... h264_omx             OpenMAX IL H.264 video encoder (codec h264)
 V..... h264_v4l2m2m         V4L2 mem2mem H.264 encoder wrapper (codec h264)
 V..... h264_vaapi           H.264/AVC (VAAPI) (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... hap                  Vidvox Hap
 V..... libx265              libx265 H.265 / HEVC (codec hevc)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)

后缀或前缀带nvenc的都是硬件编码器,我的显卡只支持h264和hevc,也就是俗称的H264和H265,只是不同的组织叫法不一样。

3.测试

测试也很简单,只要使用h264解码+h265编码就行了,正常的话不会报错。

ffmpeg -rtsp_transport tcp -vcodec h264_cuvid -an -i <H264视频文件> -vcodec hevc_nvenc -an -t 100 -f mp4 -y output.mp4

特别说明:-an的意思是不要音频,因为只测试视频,要不然还要单独指定音频编码器

也可以用H265文件解码+H264文件编码,你需要把操作反过来。


总结

1、同时需要ffmpeg和nvidia的支持,不同的版本可能效果不一样。
2、也有可能ffmpeg早期版本就已经支持nvidia了,只不过我用的最低Ubuntu版本是18.04,所以没法确认。

猜你喜欢

转载自blog.csdn.net/jiexijihe945/article/details/131912403