在OBS上进行H265推流

2022-07-28 14:31:58 浏览数 (1)

OBS官方明确表态不支持H265,貌似以后也不会支持,什么原因呢?可以看官方论坛上的吵架

h265 Support

不想看英文的,我这里简单说一下,就是因为Adobe公司的RTMP协议里面并没有支持H265,所以他们不想支持H265。当然群众的呼声还是十分强烈的。那么问题来了,如何修改OBS的开源代码使得其支持H265格式呢?

开始尝试:

首先github上clone下OBS源码,按照官方说明,配置编译环境,这里不多说。编译成功后,开始尝试寻找编码器的部分代码。

找到obs-ffmpeg这个模块,里面有个文件jim_nvenc.c

代码语言:javascript复制
struct obs_encoder_info nvenc_info = {
	.id                      = "jim_nvenc",
	.codec                   = "h264",
	.type                    = OBS_ENCODER_VIDEO,
	.caps                    = OBS_ENCODER_CAP_PASS_TEXTURE,
	.get_name                = nvenc_get_name,
	.create                  = nvenc_create,
	.destroy                 = nvenc_destroy,
	.update                  = nvenc_update,
	.encode_texture          = nvenc_encode_tex,
	.get_defaults            = nvenc_defaults,
	.get_properties          = nvenc_properties,
	.get_extra_data          = nvenc_extra_data,
	.get_sei_data            = nvenc_sei_data,
};

上面这段代码就是nvenc的h264编码模块,nvenc是NVIDIA推出的显卡编码工具,同时具备h264和h265编码功能,只是OBS没有使用h265的部分而已。

于是仿照上面的代码,构建h265的模块。

代码语言:javascript复制
struct obs_encoder_info hevc_nvenc_info = {
	.id = "hevc_nvenc",
	.codec = "hevc",
	.type = OBS_ENCODER_VIDEO,
	.caps = OBS_ENCODER_CAP_PASS_TEXTURE,
	.get_name = hevc_nvenc_get_name,
	.create = hevc_nvenc_create,
	.destroy = nvenc_destroy,
	.update = nvenc_update,
	.encode_texture = nvenc_encode_tex,
	.get_defaults = nvenc_defaults,
	.get_properties = nvenc_properties,
	.get_extra_data = nvenc_extra_data,
	.get_sei_data = nvenc_sei_data,
};

函数大部分都可以复用h264的,除了create和get_name。

create函数也基本和H264一样,里面把NV_ENC_CODEC_H264_GUID替换成NV_ENC_CODEC_HEVC_GUID,类似这种替换一下,

然后去obs_ffmpeg.c里面添加obs_register_encoder(&nvenc_encoder_info);进行注册。OBS即可使用这个编码器。当然最终没有成功,nVidia的驱动报错了,研究下去比较费劲,所以就剑走偏锋,找到外国友人提供的线索,OBS还有一个录像功能,可以选择FFMPEG自定义输出,可以在里面选择URL输出,即可进行推流。此时需要编译一个可以进行h265推流的FFMPEG,然后放到obs编译配置里面去,一起编译,就可以调用这个自定义的FFMPEG,最终实现H265的rtmp推流。

0 人点赞