SRS transcode支持 h264_nvenc 硬件解码方案

文章目录

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 行位置附近,内容为:

    cpp 复制代码
    if (vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX264 && vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX265 && vcodec != SRS_RTMP_ENCODER_VCODEC_H264QSV) {

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

    cpp 复制代码
    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) {

    保存并退出。

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

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

相关推荐
只是个~小不点5 个月前
流媒体之linux下离线部署FFmpeg 和 SRS
linux·ffmpeg·srs·流媒体
汪小敏同学5 个月前
docker进行SRS直播服务器搭建
docker·srs
wyw00006 个月前
解决SRS推送webrtc流卡顿问题
webrtc·srs
冰山一脚20136 个月前
SRS服务器搭建
srs
webrtc&ffmpeg_study9 个月前
clion调试SRS
srs·流媒体服务
webrtc&ffmpeg_study9 个月前
srs直播内网拉流带宽飙升问题记录
实时音视频·srs·流媒体服务
HSJ01701 年前
SRS、ZLMediakit音视频流媒体服务器
音视频·srs·zlmediakit
、、、、南山小雨、、、、1 年前
ffmpeg-webrtc(metartc)给ffmpeg添加webrtc协议
ffmpeg·音视频·webrtc·srs
TYUT_xiaoming1 年前
SRS视频服务器使用记录
服务器·音视频·srs