LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了

Go语言流媒体开源项目 LAL 今天发布了v0.35.4版本。

LAL 项目地址:https://github.com/q191201771/lal

老规矩,简单介绍一下:

▦ 一. OBS支持RTMP H265推流

新出的标准,一般被称为enhanced RTMP,OBS新版(29.1+版本,点我去下载安装包)已经实现可以使用,LAL也做了相应的适配,换言之,你可以使用OBS推送H265的RTMP流给LAL了。

Tips: 使用H265的好处是相较于H264,占用更低的码率却拥有更高的图像质量。

值得注意的几点细节:

  1. LAL转换为其他封装协议(比如RTSP、HLS)后,输出的协议依然是标准协议,这点和之前没啥区别。
  2. LAL输出是RTMP/FLV时,依然保持enhanced RTMP格式,目前适配了enhanced RTMP的播放器只有mpegts.js,后续ffmpeg和VLC等播放器应该也会很快跟上支持。
  3. enhanced RTMP和之前金山云搞的HEVC over RTMP(就是codecid=12那个,国内大部分CDN产商都支持了)是两套东西,LAL两种格式都支持了,目前的策略是进来的RTMP/FLV是啥格式,出去的RTMP/FLV就是啥格式,后续可能会考虑转换(比如通过配置或url参数等)。

关于enhanced RTMP协议实现细节、OBS对应的使用方法可以看看我们的这篇文章: 《enhanced RTMP》

▦ 二. G711A/G711U

上个版本支持G711音频编码格式时留了个待完成的尾巴,RTSP转RTMP只有视频没有声音,这个版本支持了。

G711的整体情况我们正在整理中: https://www.yuque.com/pengrl/public/psxbp37r3yqopnxx

▦ 三. RTSP TCP/UDP 切换

一个优化: 有的RTSP源不支持TCP传输音视频数据,会在SETUP信令阶段给对端回复status code 461,用于表明自身不支持TCP,新版本的LAL收到461后会尝试切换UDP SETUP。反之UDP切TCP也是一样的道理。

▦ 更多

还有一些修改不逐个介绍了,大致如下:

  • [opt] mpegts根据编码格式打包patpmt(提高纯视频流的兼容性)
  • [opt] HTTP-API: 支持跨域
  • [fix] rtmp: 解析amf strict array
  • [fix] rtmp转mpegts处理时间戳错误,导致有b帧时ffplay播放hls报错
  • [fix] GetSamplingFrequency missing 24000
  • [fix] simplifing logic to enable fragment_duration_ms on configuration to be under thousands (but not below hundreds)
  • [fix] 解决CustomizePubSessionContext使用dumpFile空指针导致崩溃的问题
  • [test] unit test for base.DumpFile

以上内容摘取自 《lal CHANGELOG版本日志》 ,你可以通过源文档获取更详细的内容。

▦ 开发者

感谢参与这个版本的开源贡献者:yoko, ZSC714725, joaop, sanenchen, yang heng01~, penglh, LiH0820

▦ 进一步了解lal

微信扫码加我好友(进微信群):

wechat

本文完,祝你今天开心。

yoko, 202304

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴听到您想要使用Mmonibuca v4和golang的lal框架编写插件实现协议转换。下面是一些参考代码,希望对您有所帮助。 首先,你需要安装Mmonibuca v4和golang的lal框架。可以通过以下命令安装: ``` go get github.com/Monibuca/Monibuca go get github.com/q191201771/lal ``` 然后,你需要在Mmonibuca v4中编写一个插件来实现协议转换。以下是一个示例插件,它将GB28181转换为RTMP: ```go package main import ( "fmt" "github.com/Monibuca/Monibuca/engine" "github.com/Monibuca/plugins/rtmpflv" "github.com/q191201771/lal/pkg/base" "github.com/q191201771/lal/pkg/httpflv" "github.com/q191201771/lal/pkg/rtmp" "net" "strings" ) const ( APP_NAME = "live" ) var ( rtmpServer *rtmp.Server ) func init() { engine.InstallPlugin(&PluginGB28181ToRTMP{}) } type PluginGB28181ToRTMP struct { } func (p *PluginGB28181ToRTMP) PluginName() string { return "GB28181ToRTMP" } func (p *PluginGB28181ToRTMP) Handle(path string, conn net.Conn) { parts := strings.Split(path, "/") if len(parts) < 2 { return } appName := parts[0] streamName := parts[1] if appName != APP_NAME { return } // create a new rtmp connection rtmpConn := rtmpServer.NewConn(conn) defer rtmpConn.Close() // create a new httpflv publisher flvPublisher := httpflv.NewPublisher(streamName) defer flvPublisher.Close() // create a new rtmp publisher rtmpPublisher := rtmpflv.NewPublisher(fmt.Sprintf("%s/%s", appName, streamName)) defer rtmpPublisher.Close() // subscribe to the GB28181 stream err := base.Subscribe(fmt.Sprintf("gb28181:%s", streamName), func(packet []byte) { // publish the packet to the httpflv and rtmp publishers flvPublisher.Publish(packet) rtmpPublisher.Publish(packet) }) if err != nil { return } // wait for the rtmp conneciton to close rtmpConn.Wait() } ``` 在上面的代码中,我们创建了一个名为PluginGB28181ToRTMP的插件,并在其中实现了Handle函数来处理GB28181。首先,我们从URL路径中获取应用程序名称和名称。然后,我们创建了一个新的RTMP连接并订阅了GB28181。最后,我们创建了一个新的HTTP-FLV和RTMP发布者,并将GB28181数据包发布到这两个发布者中。 你可以使用类似的方法来实现其他协议之间的转换。希望这可以帮助到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值