项目需要接入20多路rtsp转hls视频流,机器的CPU为i9-10900,显卡为P2200。
CPU转码
最开始测试使用脚本:
start ./ffmpeg -i rtsp://<账号>:<密码>@<IP>:554/Streaming/Channels/101 -c:v libx264 -c:a copy -f hls -threads 8 -hls_time 5 -hls_list_size 8 -hls_wrap 8 db1.m3u8
- -i 输入
- -c:v libx264 使用h264编码
- -c:a copy 拷贝所有流
- -f hls 生成hls流。HTTP Live Streaming,是苹果出的一个基于HTTP的流媒体通信协议
- -threads 8 以8个线程运行
- -hls_time 5 设置TS切片时间为5
- -hls_list_size 8 HLS播放的列表
- -hls_wrap 8 hls_wrap则表示为最大的TS循环数,也就是每8个一个循环
使用多行start这样的脚本,发现当数量达到5~7路之后,视频质量下降,出现许多涂抹画面,根本没法看。原因是CPU已经满载,所以想支持更多路视频只能去找GPU加速的方法。
GPU加速转码
首先安装CUDA
个人理解的CUDA就是可供开发者调用显卡进行处理运算的通道。通过英伟达官网,下载对应系统、版本的安装程序进行安装。注意,不是所有的英伟达显卡、驱动版本都支持CUDA。
使用编译好的ffmpeg
使用已经编译好的ffmpeg,可以通过:
ffmpeg -decoders
ffmpeg -encoders
这两个命令行可以查看ffmpeg支持的解码器、编码器名称。其中包含“xxx_amf”,“xxx_nvenc”,"xxx_qsv"等就证明可以调用显卡
使用
start ./ffmpeg -i rtsp://<账号>:<密码>@<IP>:554/Streaming/Channels/101 -vcodec h264_nvenc -c:a copy -f hls -threads 8 -hls_time 5 -hls_list_size 8 -hls_wrap 8 db1.m3u8
注意,这时-vcodec(与上面的-c:v相同)指定视频解码器为h264_nvenc
实测同时开启21路视频后,视频全部编码正常,CPU占用率极低,显卡3D性能占用月50%~60%