文章目录
SRS transcode支持 h264_nvenc 硬件解码方案
SRS 是开源的流媒体服务,但在使用 GPU 服务器时,想要通过硬件加速,目前官方是不支持的,所以简单修改了源码,重新编译实现,以 SRS6.0release 为例,操作如下:
1、修改文件
-
编辑文件
shell#进入 SRS 核心目录 cd srs/trunk vim /src/app/srs_app_ffmpeg.cpp
-
定义变量
找到 39 行附近,新增一行内容(注意:行首"#"也需要带上):
cpp#define SRS_RTMP_ENCODER_VCODEC_H264NVENC "h264_nvenc"
-
执行修改
找到 129 行位置附近,内容为:
cppif (vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX264 && vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX265 && vcodec != SRS_RTMP_ENCODER_VCODEC_H264QSV) {
注释、删掉、或改造为如下内容:
cppif (vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX264 && vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX265 && vcodec != SRS_RTMP_ENCODER_VCODEC_H264QSV && vcodec != SRS_RTMP_ENCODER_VCODEC_H264NVENC) {
保存并退出。
2、重新编译
重新编译安装即可:
shell
cd srs/trunk
#开启gb28181和ffmpeg配置
./configure --gb28181=on --ffmpeg-tool=on
make && make install
编译安装完成后,重启 SRS 服务或第三步配置改完后重启服务。
3、使用
- 安装 ffmpeg 关键点
一般使用自己安装的 ffmpeg,需要启用硬件加速配置--enable-nvenc
如下图:
- srs.conf 解码配置:
shell
cd srs/trunk
vim conf/srs.conf
vhost defaultVhost { 内增加解码配置:
shell
#转码
transcode {
enabled on;
#ffmpeg /data/software/srs/trunk/objs/ffmpeg/bin/ffmpeg;
#这里 ffmpeg 是自行安装的,不是 SRS 自带的
ffmpeg /usr/local/bin/ffmpeg;
engine ff {
enabled on;
vfilter {
}
#vcodec libx264;
vcodec h264_nvenc;
vbitrate 5000;
vfps 25;
vwidth 1280;
vheight 720;
vthreads 12;
#high、main、baseline
vprofile high;
vpreset medium;
vparams {
b:v 5000k;
}
acodec libfdk_aac;
abitrate 70;
asample_rate 44100;
achannels 2;
aparams {
}
oformat flv;
#这里 output 使用正常,按第三种方式会造成循环解码,直接给服务器干废了
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
#output rtmp://127.0.0.1:[port]/[app]/[stream];
#output rtmp://127.0.0.1:[port]/[app]/[stream]_[engine]?vhost=[vhost];
}
}

重启 SRS 服务,推流即可自动解码。
注意:engine ff
是可以随意定义的,用解码地址拉流时,只需在后面拼接 _ff
即可,如果你定义的是 engine abc
,那么,你的推流访问地址后面拼接 _abc
即可,如:
RTMP 推流:
shell
#非GPU硬件加速推流
ffmpeg -stream_loop -1 -re -i fly.mp4 -c:v libx264 -preset medium -tune zerolatency -b:v 5000k -maxrate 8000k -g 25 -c:a aac -b:a 128k -f flv rtmp://192.168.1.123/live/livestream
#GPU硬件加速推流
ffmpeg -stream_loop -1 -re -i fly.mp4 -c:v h264_nvenc -preset medium -tune zerolatency -b:v 5000k -maxrate 8000k -g 25 -c:a aac -b:a 128k -f flv rtmp://192.168.1.123/live/livestream
ffplay 对 RTMP 拉流:
shell
ffplay -fflags nobuffer -i rtmp://192.168.1.123/live/livestream
ffplay 对转码后的 RTMP 拉流:
shell
ffplay -fflags nobuffer -i rtmp://192.168.1.123/live/livestream_ff
********************************* 只要思想不滑坡,办法总比困难多*********************************