在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