From c11fb8081f19e9067229ef711eb3eee346730135 Mon Sep 17 00:00:00 2001 From: q191201771 <191201771@qq.com> Date: Sun, 10 Apr 2022 19:49:13 +0800 Subject: [PATCH] =?UTF-8?q?[patch]=20=E4=B8=BApr=20#142=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E4=B8=80=E4=BA=9B=E6=B3=A8=E9=87=8A=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/ConfigBrief.md | 20 +++++++++++++------- pkg/logic/group__core_streaming.go | 11 ++++++++--- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/conf/ConfigBrief.md b/conf/ConfigBrief.md index 04bec8a..afe2ed6 100644 --- a/conf/ConfigBrief.md +++ b/conf/ConfigBrief.md @@ -90,14 +90,20 @@ "gop_num": 0 //. 见rtmp.gop_num }, "rtsp": { - "enable": true, //. 是否开启rtsp服务的监听,目前只支持rtsp推流 - "addr": ":5544", //. rtsp推流地址 - "out_wait_key_frame_flag": true //. rtsp出包时是否等待视频关键帧 - // 音频和视频需要同时出,如果音频先出,而视频等待关键帧会导致音画不同步问题,两种情况: - // 1. 不等待视频关键帧,音视频包到了就转发 + "enable": true, //. 是否开启rtsp服务的监听 + "addr": ":5544", //. rtsp监听地址 + "out_wait_key_frame_flag": true //. rtsp发送数据时,是否等待视频关键帧数据再发送 // - // 2. 等待视频关键帧,视频关键帧到达之前,丢弃音频数据。 - // (存在音视频头,但是音频先到,视频晚到的场景等待关键帧会导致超时问题) + // 该配置项主要决定首帧、花屏、音视频同步等问题 + // + // 如果为true,则音频和视频都等待视频关键帧才开始发送。(也即,视频关键帧到来前,音频或视频全部丢弃不发送) + // + // 如果为false,则音频和视频都直接发送。(也即,音频和视频都不等待视频关键帧,都不等待任何数据) + // + // 注意,纯音频的流,如果该标志为true,理论上音频永远等不到视频关键帧,也即音频没有了发送机会, + // 为了应对这个问题,lalserver会尽最大可能判断是否为纯音频的流, + // 如果判断成功为纯音频的流,音频将直接发送。 + // 但是,如果有纯音频流,依然建议将该配置项设置为false }, "record": { "enable_flv": true, //. 是否开启flv录制 diff --git a/pkg/logic/group__core_streaming.go b/pkg/logic/group__core_streaming.go index 99745cb..7121a0c 100644 --- a/pkg/logic/group__core_streaming.go +++ b/pkg/logic/group__core_streaming.go @@ -381,7 +381,7 @@ func (group *Group) broadcastByRtmpMsg(msg base.RtmpMsg) { // --------------------------------------------------------------------------------------------------------------------- func (group *Group) feedRtpPacket(pkt rtprtcp.RtpPacket) { - // 出包时不等待视频关键帧 + // 如果配置项 OutWaitKeyFrameFlag 为false,则音频和视频都直接发送。(音频和视频都不等待视频关键帧,都不等待任何数据) if !group.config.RtspConfig.OutWaitKeyFrameFlag { for s := range group.rtspSubSessionSet { s.WriteRtpPacket(pkt) @@ -390,11 +390,16 @@ func (group *Group) feedRtpPacket(pkt rtprtcp.RtpPacket) { } var ( - boundary bool - boundaryChecked bool // 保证只检查0次或1次,减少性能开销 + boundary bool // 是否是视频GOP起始位置 + boundaryChecked bool // 保证遍历sub session时,只在必要时检查0次或1次,减少性能开销 ) for s := range group.rtspSubSessionSet { + // session的 ShouldWaitVideoKeyFrame 为false,那么可能有两种情况: + // 1. 对输入流做智能检测时,判定为流内没有视频 + // 2. 该输出流已经发送过了GOP起始数据 + // + // 这两种情况下,音频或视频数据都直接发送,不需要等了 if !s.ShouldWaitVideoKeyFrame { s.WriteRtpPacket(pkt) continue