由于项目要求,需要对1080P以及4K的视频实时编解码,编码格式为H265。首先使用X265编码测试,无奈平均编码速度仅有6.08fps,远远无法满足实时性的要求。之后依次使用Intel与nvidia的硬编码测试效果,总算满足了实时编码的要求,下面把整个过程做一个记录。整个过程均使用ffmpeg实现,不清楚ffmpeg的请参考雷神的博客FFMPEG视音频编解码零基础学习方法
所谓硬编码,我的理解就是硬件加速编码,intel硬编码是使用其集显中的视频编解码模块加速,同理nvidia硬编码使用nvidia显卡中的视频编解码模块进行加速。在命令行中使用 ffmpeg -hwaccels
可以查看ffmpeg支持的硬件加速方法。
Intel硬编码
Intel硬编码使用Intel处理器内部集成的显卡进行硬件加速,图一中的qsv加速方法便对应着Intel硬编码。测试中发现Intel硬编码对H.264加速效果明显,且不需要安装额外库(仅使用相应的ffmpeg命令):
ffmpeg -y -i infile -vframes 2000 -b:v 8000K -vcodec h264_qsv -preset veryfast output.h264
使用Intel编码h265文件,需要额外安装Intel® Media SDK,之后使用下图中的命令进行编码,或直接查看官方文档
NVIDIA硬编码
顾名思义,NVIDIA硬编码使用英伟达的显卡对视频编码进行加速。在正确使用英伟达硬编码之前需要安装CUDA与英伟达的必要驱动。
安装好以上两个环境后就可以使用NVIDIA的硬编码了,编码H264格式命令为
ffmpeg -f rawvideo -s:v 1920x1080 -r 30 -pix_fmt yuv420p -i <input.yuv> -c:v h264_nvenc -preset slow -cq 10 -bf 2 -g 150 <output.h264>
编码H265格式命令为:
ffmpeg -f rawvideo -s:v 1920x1080 -r 30 -pix_fmt yuv420p -i <input.yuv> -vcodec hevc_nvenc -preset slow -cq 10 -g 150 <output.h265>
使用英伟达加速后速度明显上升,H265编码帧率达到180+fps。具体资料参考英伟达官网给出的教程NVIDIA/FFMPEG
Ubuntu 上编译支持CUDA硬编码的ffmpeg
- Clone ffnvcodec
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
- Install ffnvcodec
cd nv-codec-headers && sudo make install
- 下载源码 ffmpeg download 官网下载速度比GitHub上快很多,推荐官网下载
- Install necessary packages
sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev
- Configure
sudo ./configure --prefix="$HOME/ffmpeg_build" --pkg-config-flags="--static" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --bindir="$HOME/bin"
- sudo make
- sudo make install
- 测试是否安装成功
ffmpeg -h encoder=h264_nvenc
orffmpeg -h encoder=hevc_nvenc
参考资料
- using ffmpeg with nvidia gpu hardware acceleration
- ffmpeg compilation guide
- HWAccelIntro - FFmpeg
- NVIDIA - FFMEPG
- Ubuntu 下 nvidia 驱动安装
结语:以上只是简要地记录了整个试验过程,文中给出地链接都是官方教程中的,部分可能需要梯子才能访问。试验中遇到的很多问题都是因为环境没有配置好引起的,走了很多弯路,所以记录下来备忘,也方便以后的同行参考。