修改srs服务器端支持h.265编码(rtmp协议)

在srs(simple rtmp server)服务器端修改了代码支持h.265编码以及 增加推送h.265裸流客户端,srs服务器本身不支持h.265以及推送h.265裸流走rtmp协议。
百度网盘下载:链接:https://pan.baidu.com/s/1u_zGiGmLzb9EPujBnOJe_g
提取码:a3qm
复制这段内容后打开百度网盘手机App,操作更方便哦

一.修改srs服务器端代码支持h.265

1)vim src/app/srs_app_source.cpp
在这个函数中 srs_error_t SrsSource::on_video(SrsCommonMessage* shared_video)
找到if (!SrsFlvVideo::acceptable(shared_video->payload, shared_video->size)),跳转到SrsFlvVideo::acceptable()函数定义中,下面修改内容如下:

bool SrsFlvVideo::acceptable(char* data, int size)
{
    // 1bytes required.
    if (size < 1) 
    {
        return false;
    }
    char frame_type = data[0];
    char codec_id = frame_type & 0x0f;
    frame_type = (frame_type >> 4) & 0x0f;
    if (frame_type < 1 || frame_type > 5) //   1<= x <= 5
    {
        return false;
    }
    /* 2020-03-31 头部问题以解决*/
    if (codec_id < 2 || codec_id > 12) {   //  2<= x <=7
        return false;
    }
    return true;
}

2)vim src/app/srs_app_source.cpp
这个函数中 srs_error_t SrsSource::on_video_imp(SrsSharedPtrMessage* msg) 找到
bool is_sequence_header = SrsFlvVideo::sh(msg->payload, msg->size) 这一行,跳转到sh()函数定义中

bool SrsFlvVideo::sh(char* data, int size)
{ //判断是否是h264
    if (h264(data, size)) 
    {
        char frame_type = data[0];
        frame_type = (frame_type >> 4) & 0x0F;
        char avc_packet_type = data[1];
        //srs_trace("h264**** data[0]=%#x,data[1]=%#x,%d,%d",data[0],data[1],frame_type, avc_packet_type );
        return frame_type == SrsVideoAvcFrameTypeKeyFrame               //1
            && avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader;  //0
    }
    //判断是否是h265
    if(h265(data, size))
    {
        char frame_type = data[0];
        frame_type = (frame_type >> 4) & 0x0F;
        char avc_packet_type = data[1];
        //srs_trace("h265#### data[0]=%#x,data[1]=%#x,%d,%d",data[0],data[1],frame_type, avc_packet_type );
        return frame_type == SrsVideoHevcFrameTypeKeyFrame          //1
        && avc_packet_type == SrsVideoHevcFrameTraitSequenceHeader; //0
    }
    if (size < 2) 
    {
        return false;
    }
    return true;
}
//别忘了函数定义在.h中自行添加
bool SrsFlvVideo::h265(char *data, int size)
{
    if(size < 1)
        return false;

    char codec_id = data[0];
    codec_id = codec_id & 0x0F;

    return codec_id == SrsVideoCodecIdHEVC;
}

srs服务器端支持h.265编码已修改完成,重新编译srs代码
./configure && make && make install
启动服务器: ./objs/srs -c conf/srs.conf 查看服务器是否启动成功:ps -ef | grep srs

二.增加推送h.265裸流客户端,推送h.265裸流到srs中

先看个demo,工程已上传 如下图
在这里插入图片描述
注意:拉流播放器中,VLC不支持h.265的,想播放h.265,用大牛直播SDK:https://github.com/daniulive/SmarterStreaming

三.效果演示,验证测试

推流–>> 服务器端 —>> 拉流 演示推送h.265裸流
在这里插入图片描述
1)启动srs 服务器/nginx-rtmp-server 服务器(自己搭有个补丁支持h.265)确定服务器ip:192.168.43.49 端口号:1935
2)开始推流:cd/srs/bin 目录中: ./srs_h265_raw_publish xxx.h265 rtmp://192.168.43.49:1935/live/livestream 25
在这里插入图片描述
3)大牛直播SDK拉流播放
rtmp://192.168.43.49:1935/live/livestream
在这里插入图片描述
从图中可以知道正常播放,说明修改srs服务器端代码 支持h.265编码

四.ffmpeg命令从MP4文件提取裸流

1)h.264编码的MP4文件
ffmpeg -i input.mp4 -vcodec copy -an output.h264
2)h.265编码的MP4文件
ffmpeg -i xxx.mp4 -vcodec copy -an -bsf hevc_mp4toannexb -f hevc xxx.hevc

  • 15
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值