SRS解决WebRTC黑屏问题,包括内网、公网环境黑屏

SRS搭建webrtc直播一条龙教学!!!!!!_srs webrtc_欣欣芜湖的博客-CSDN博客

利用SRS服务搭建WebRTC网页播放,推RTMP流,RTC拉流,上方网址是教程。

看不懂下方文章或不明配置原因可看上述教学链接!!!

接下来说一下我在开发环境进行WebRTC播放搭建成功后,但是测试环境却黑屏的排查历程,历经一个月,各种黑屏原因几乎都排查过了,最后通过研究源码解决了黑屏加载问题!

解决SRS的问题,看日志永远是第一位!!!解决不了就去源码里研究!!有奇效

黑屏原因1:UDP端口 8000不通

使用rtmp2rtc.conf 后 内网环境拉流无法播放,黑屏加载  看SRS日志:

 RTC: session STUN done, waiting DTLS handshake.
[2023-01-09 17:13:40.781][INFO][37497][51wk8811] <- RTC RECV #13, udp 1, pps 0/0, schedule 1
[2023-01-09 17:13:40.798][INFO][37497][7hdn7z9p] DTLS: State Passive RECV, done=0, arq=0/0, r0=1, r1=0, len=159, cnt=22, size=146, hs=1
[2023-01-09 17:13:40.799][INFO][37497][7hdn7z9p] DTLS: State Passive SEND, done=0, arq=0/0, r0=-1, r1=2, len=681, cnt=22, size=82, hs=2
[2023-01-09 17:13:40.818][INFO][37497][7hdn7z9p] DTLS: State Passive RECV, done=0, arq=0/0, r0=1, r1=0, len=579, cnt=22, size=300, hs=11
[2023-01-09 17:13:40.820][INFO][37497][7hdn7z9p] DTLS: State Passive SEND, done=1, arq=0/0, r0=1, r1=0, len=554, cnt=22, size=466, hs=4
[2023-01-09 17:13:40.820][INFO][37497][7hdn7z9p] RTC: DTLS handshake done.

如果SRS日志中没有打印DTLS握手,那一定是UDP端口未通,DTLS是UDP安全检测协议;

那就先把UDP端口弄通再说;ps:检测udp端口是否为通  用netcat命令  也就是nc命令!

黑屏原因2:candidate 配置不对

SRS官方文档也说明了 candidate 配置不对  基本上问题出在这儿!!

candidate 的配置,官方文档说明连接如下:

WebRTC | SRS (ossrs.net)https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidatecandidate的值对应了你的rtc_server 可以建立连接的IP地址,通常配置为 *或者0.0.0.0,这两个值作用相同,均为全部监听。也可以配置为指定IP地址 例如 candidate 182.xxx.xxx.xxx; 或者配置为candidate $CANDIDATE; 它会自动获取本机IP信息,然后传给SRS;

candidate配置完成,SRS启动以后,你在播放RTC视频的时候可以看到SRS日志有打印这一行:

RTC: Use candidates 192.168.2.xxx, 222.213.16.xxx, protocol=udp

上述日志中 192.168.2.xxx, 222.213.16.xxx 就是RTC可建立连接的IP地址;

一般配置为*或者0.0.0.0即可;

黑屏原因3:SRS版本太低

这种解决办法最直接就是去 下载 最新的源码来编译就好。

黑屏原因4:配置中http_api 端口不通

http_api {
    enabled         on;
    #listen          1985;
    listen          8127;
}

http_api是WebRTC中相当重要的一个配置,RTC播放的网页请求就通过这里配置的端口进行访问SRS服务,进行拉流,在播放器网页F12查看控制台,一定确保返回的是200OK,否则就对应排查这里的问题。

黑屏原因5: 浏览器问题

据SRS官方源码Issues有描述说google还是firefox浏览器无法播放,黑屏转圈。

这个问题需要在浏览器属性中添加设置,可自行查阅官方Issues,地址下:

Issues · ossrs/srs (github.com)https://github.com/ossrs/srs/issues

黑屏原因6:没有打开RTMP转RTC流配置

vhost __defaultVhost__ {
    rtc {
        enabled     on;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc
        rtmp_to_rtc on;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp
        rtc_to_rtmp on;
    }
}

配置中rtmp_to_rtc on;    与    rtc_to_rtmp on;   是rtmp与rtc流互转的开关,需要在配置中打开,否则不能从RTMP流桥接到RTC流或RTC桥接到RTMP;导致RTC播放没有流数据从而黑屏;并且如果成功桥接,在SRS日志中会有如下打印:

RTC bridge from RTMP, rtmp2rtc=1, keep_bframe=0, merge_nalus=0

表示了从RTMP流桥接RTC流。

黑屏原因7:source_id的值为/

这是我碰到的原因,source_id的值如果在日志中查看为/,例如下方

RTC: start play url=/live/0211774c929013a7500_MJ_ProtocolServer_1, source_id=/, realtime=1, mw_msgs=0

source_id值为/说明就是为空,在研究源码后发现,/只是为了分别前置source_id和现在的source_id,如果为/。说明根本没找到RTC流。

source_id对应是RTC_SERVER源码中在RTC流map中根据source url来查找对应的RTC流,如果没有找到,source_id就会为空。这个时候就需要排查为什么source_id为空。

上述原因6,如果没有打开桥接开关,也会导致source_id为空。这种打开了桥接开关即可成功播放。

在我的日志中,我看到了桥接流成功,但source_id仍然为空,这说明桥接已经成功,map中肯定有RTC流了,但是  RTC_SERVER 在读map的时候,没有取到。

那说明没有取到,就是source url有问题。经过我自己的各种排错,排除黑屏原因,最终研究源码发现是source url的问题。

再回去看日志,我看到推RTMP流时有如下打印:

new live source, stream_url=/域名/08101021122A3A03300_MJ_ProtocolServer_1
source url=/域名/08101021122A3A03300_MJ_ProtocolServer_1, ip=192.168.2.51, cache=1/2500, is_edge=0, source_id=/

推流时,RTMP桥接到RTC时,RTC流的url就是上面的source url= 后面的一截,那么在RTC_SERVER读map的时候应该读这个url才能取到流。

再看下方RTC播放的SRS日志,如下:

RTC: start play url=/live/0211774c929013a7500_MJ_ProtocolServer_1, source_id=/, realtime=1, mw_msgs=0

可以明显看到 start play url 与上述的source url明显不一致,这就导致了我自己的黑屏原因,推流的时候带了域名推流,但WebRTC不支持域名播放,所以播放时用了公网IP+端口形式,导致在拉流的时候,url与推流时url不一致,取不到RTC流,所以source_id为空。最后通过用IP端口形式推流,成功出图。

 至此就结束啦。

觉得有用记得点赞 收藏+关注。感谢感谢

在此附上SRS官方文档地址:

Introduction | SRS (ossrs.net)

猜你喜欢

转载自blog.csdn.net/Lemon_D1999/article/details/128702447