随笔 - 936  文章 - 0  评论 - 3  阅读 - 30万

国标GB28181协议国标平台EasyGBS视频平台推送音视频复合流,播放视频黑屏是什么原因?

我们知道TSINGSEE青犀视频研发的全线视频流媒体云服务产品都是可以播放音视频复合流的,但是近期TSINGSEE青犀视频在EasyGBS进行摄像头复合流推送的时候,有些摄像头推送过来的音视频复合流有问题,导致播放视频的时候会出现黑屏现象。

经过排查,我们发现是设备音频的问题。做语音对讲的时候,摄像头只能识别g711a格式的音频,所以发送过去的音频必须要是g711a格式。但是EasyGBS只能播放aac格式的音频,所以就在摄像头发送过来g711a格式音频的时候转成了aac格式,而转换过后的音频用现有的播放器播放的时候就会出现间歇的黑屏了。

所以当设备注册上来,系统识别推送的是音视频复合流的时候,我们建立了一个选择丢弃音频的开关,这样就可以通过平台就禁用格式不支持的音频,而不需要在用户摄像机后台关闭音频。

我们设置了设备接入的时候默认禁用音频的按钮,然后在摄像机推流播放的时候识别是否是EasyGBS支持的格式,来判断是否丢弃音频。具体实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case av.AUDIO_CODEC_G711A:
            //目前支持G711A格式音频
            avf.Flag = av.FRAME_FLAG_AUDIO
            if !msess.Audio {
                return
            }
        case av.AUDIO_CODEC_AAC:
            //目前只支持AAC格式音频
            avf.Flag = av.FRAME_FLAG_AUDIO
            // if msess.MediaInfo != nil && msess.MediaInfo.AudioCodec == av.AUDIO_CODEC_AAC {
            //  avf.Flag = av.FRAME_FLAG_AUDIO
            // } else {
            //  err = fmt.Errorf("audio aac not support push to rtmp as media info not found")
            // }
            if !msess.Audio {
                return
            }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
channel := &models.Channel{}
    if len(streamidarr) == 4 {
        temp := models.GetChannel(streamidarr[2], streamidarr[1])
        if temp != nil {
            channel = temp
        }
    }
  
    mediaSession := &MediaSession{
        StreamID:            streamid,
        CDN:                 c.Req.HeaderMap["CDN"],
        MediaTransport:      transport,
        Subject:             subject,
        SIPSession:          sipSession,
        UseOriginalTS:       false,
        DumpStream:          false,
        MaxQueueSize:        300,
        IdleTimeoutSeconds:  int(cfg.RtpIdleTimeOut),
        LatestGetFrameTime:  time.Now(),
        LatestHandleRTPTime: time.Now(),
  
        Queue:     make([]*rtp.RTPInfo, 0),
        QueueCond: sync.NewCond(&sync.Mutex{}),
  
        Quit: make(chan bool),
  
        Audio: channel.Audio,
    }

  

如果音频是平台所支持的格式类型,则可以正常播放,如果平台不支持,就会自动丢弃音频。这样就不会因为格式不兼容而出现黑屏无法播放的问题。

posted on   EasyGBS  阅读(479)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示