先来个相关的话题:往srs服务推流这个步骤,用ffmpeg可以直接实现,用命令或者自己写代码封装相关接口,这个网上也有许多的例子,这里有个问题就是ffmpeg是不支持封装h265为flv推送rtmp的,所以需要修改相关的源码参考网址
https://github.com/runner365/ffmpeg_rtmp_h265
重新编译,编译步骤可以参考
https://github.com/runner365/srt_encoder/wiki/How-to-compile-cn
不用编译libsrt这个库,相关的后面ffmpeg编译配置命令需要将--enable-libsrt改为--disable-libsrt,还有这个里面h264有个小坑需要修改配置文件,支持静态或者动态库的输出,不然make成功后执行make install没有可拷贝的文件到相关目录下后面编译ffmpeg会报链接不到h264库的错误修改位置如下:
libx264-git/configure
到现在为止就将支持h265封装flv推送的ffmpeg编译完成了。
进入正题:
现在的srs的h265分支应该是支持hls格式的h265分发的但是我配置好过后不能成功,需要修改相关配置文件和源代码才能实现,修改如下:
1:修改配置文件
打开trunk/conf/hls.conf
添加 : hls_vcodec h265;
这个地方不是其它博客写的
hls_vcodec hevc;
或者
hls_vcodec HEVC;
因为源码中已经定死了是判断的"h265"字符
trunk/src/app/srs_app_hls.cpp
srs_error_t SrsHlsMuxer::segment_open() 函数下的
备注:后面验证了下就算不配置这个选项也没有影响,要配置的话配置为h265不然虽然能成功但是srs里面会报警告。
2:修改源码
trunk/src/kernel/srs_kernel_codec.cpp
srs_error_t SrsFormat::hevc_demux_ibmf_format(SrsBuffer* stream)函数
修改数据处理问题将
i += vcodec->NAL_unit_length + 1 + NALUnitLength;
修改为:
i += nal_len_size + 1 + NALUnitLength;
这个可以对比h264的相关函数接口
srs_error_t SrsFormat::avc_demux_ibmf_format(SrsBuffer* stream) 查看过后这个地方应该设为nal_len_size
到此就可以实现读取原始h265视频流并通过ffmpeg推送flv到srs服务进行hls的分发了。