文章目录
  • SRS transcode支持 h264_nvenc 硬件解码方案
  • 1、修改文件
  • 2、重新编译
  • 3、使用

SRS transcode支持 h264_nvenc 硬件解码方案

SRS 是开源的流媒体服务,但在使用 GPU 服务器时,想要通过硬件加速,目前官方是不支持的,所以简单修改了源码,重新编译实现,以 SRS6.0release 为例,操作如下:

1、修改文件

  • 编辑文件
#进入 SRS 核心目录
cd srs/trunk

vim /src/app/srs_app_ffmpeg.cpp
  • 1.
  • 2.
  • 3.
  • 4.
  • 定义变量
    找到 39 行附近,新增一行内容(注意:行首“#”也需要带上):
#define SRS_RTMP_ENCODER_VCODEC_H264NVENC "h264_nvenc"
  • 1.

SRS transcode支持 h264_nvenc 硬件解码方案_SRS流媒体硬件加速解码

  • 执行修改
    找到 129 行位置附近,内容为:
if (vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX264 && vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX265 && vcodec != SRS_RTMP_ENCODER_VCODEC_H264QSV) {
  • 1.

注释、删掉、或改造为如下内容:

if (vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX264 && vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX265 && vcodec != SRS_RTMP_ENCODER_VCODEC_H264QSV && vcodec != SRS_RTMP_ENCODER_VCODEC_H264NVENC) {
  • 1.

SRS transcode支持 h264_nvenc 硬件解码方案_GPU硬件解码_02

保存并退出。

2、重新编译

重新编译安装即可:

cd srs/trunk

#开启gb28181和ffmpeg配置
./configure --gb28181=on --ffmpeg-tool=on 

make && make install
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

编译安装完成后,重启 SRS 服务或第三步配置改完后重启服务。

3、使用

  • 安装 ffmpeg 关键点
    一般使用自己安装的 ffmpeg,需要启用硬件加速配置 --enable-nvenc 如下图:
  • srs.conf 解码配置:
cd srs/trunk

vim conf/srs.conf
  • 1.
  • 2.
  • 3.

vhost defaultVhost { 内增加解码配置:

#转码
    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];
        }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

SRS transcode支持 h264_nvenc 硬件解码方案_GPU硬件解码_03

重启 SRS 服务,推流即可自动解码。

注意:engine ff 是可以随意定义的,用解码地址拉流时,只需在后面拼接 _ff 即可,如果你定义的是 engine abc ,那么,你的推流访问地址后面拼接 _abc 即可,如:

RTMP 推流:

#非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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

ffplay 对 RTMP 拉流:

ffplay -fflags nobuffer -i rtmp://192.168.1.123/live/livestream
  • 1.

ffplay 对转码后的 RTMP 拉流:

ffplay -fflags nobuffer -i rtmp://192.168.1.123/live/livestream_ff
  • 1.

只要思想不滑坡,办法总比困难多*********************************