一、简介
WebRTC概念
WebRTC是由Google主导的,由一组规范、协定和JavaScript API组成,用于实现浏览器之间(端到端之间)的音频、视频及数据共享。WebRTC不须要装置任何插件,通过简略的JavaScript API就能够使得实时通信变成一种规范性能。
为什么应用webrtc
当初各大浏览器以及终曾经逐步加大对WebRTC技术的反对。下图是webrtc官网给出的当初曾经提供反对了的浏览器和平台。
二、srs启动
webrtc须要srs的最低版本:SRS4.0.14,为了拉取到最新版本的srs,咱们首先做的就是获取到最新的srs代码,装置git步骤如下:
centos装置git
#装置依赖yum install curl-devel expat-devel gettext-devel openssl-devel zlib-develyum install gcc-c++ perl-ExtUtils-MakeMaker#查看yum源仓库git信息yum info git#移除默认装置gityum remove git#装置gityum install git#查看git版本git --version
webrtc须要srs的最低版本:SRS4.0.14,所以咱们部署的srs的时候版本须要大于SRS4.0.14,如果应用git获取分支能够应用如下命令(进入到srs的git目录):
#查看以后git分支信息(默认分支*指定,以后为3.0)git branch -v#rtc在4.0或develop分支上能够拉取到,切换到4.0git checkout 4.0release#再次查看以后所处分支git branch -v#如果要查看所有公布的git版本能够应用git tag
webrtc是默认反对的(--rtc=on),所以间接编译即可:
./configure --with-hls --with-ssl --with-http-server --with-http-callback --with-http-api --with-ingest --with-stream-caster && make
而后,咱们能够应用默认的rtc配置(conf/rtc.conf)跑起来:
cd srs-4.0.39/trunk./objs -c conf/rtc.conf
默认rtc.conf配置如下
listen 1935;max_connections 1000;srs_log_tank console;srs_log_file ./objs/srs.log;daemon off;http_server { enabled on; listen 8080; dir ./objs/nginx/html;}#rtc用到的api服务端口http_api { enabled on; listen 1985;}stats { network 0;}#rtc的配置rtc_server { enabled on; # Listen at udp://8000 listen 8000; # # The $CANDIDATE means fetch from env, if not configed, use * as default. # # The * means retrieving server IP automatically, from all network interfaces, # @see https://github.com/ossrs/srs/issues/307#issuecomment-599028124 #拉取流地址:应用本机地址或如下配置 candidate $CANDIDATE;}vhost __defaultVhost__ { #vhost关上启用rtc rtc { enabled on; bframe discard; }}
启动后,能够看到rtc监听的端口信息
三、推送rtmp视频
启动后咱们须要采集本地的音视频,而后推送至srs中,srs通过协定转换生成webrtc协定
咱们推送rtmp的流到srs中
rtmp://192.168.12.187:1935/live/1
我这里应用obs,你也能够应用ffmpeg推送rtmp
ffmpeg -f dshow -i video="HD Camera":audio="麦克风阵列 (Realtek(R) Audio)" -vcodec libx264 -x264opts "bframes=0" -r 25 -g 25 -preset:v ultrafast -tune:v zerolatency -codec:a aac -ac 2 -ar 44100 -f flv rtmp://192.168.50.150:1935/live/1
推送流胜利之后,咱们能够应用srs自带的rtc_player播放器进行播放,间接申请srs服务的8080端口即可
http://192.168.12.187:8080/players/rtc_player.html
四、webrtc播放
能够看到咱们应用webrtc协定就能够播放该视频流了,视频流地址:webrtc://srs
webrtc://192.168.12.187/live/1
chrome的rtc调式模式关上(如调试黑屏问题candidate):
chrome://webrtc-internals
webrtc调试申请参数(能够看到是通过api接口的1985端口收回的,正式咱们启用的)
webrtc提供的播放接口为:
http://192.168.12.187:1985/rtc/v1/play/http://192.168.12.187:1985/rtc/v1/play/
申请参数:
{ "api": "http://192.168.12.187:1985/rtc/v1/play/", "streamurl": "webrtc://192.168.12.187/live/1", "clientip": null, "sdp": "v=0\r\no=- 8774286378837017703 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:BLet\r\na=ice-pwd:cbGk3IU+Qdmq87i4JEEp1KGk\r\na=ice-options:trickle\r\na=fingerprint:sha-256 22:2E:04:F1:E1:12:0F:35:7B:16:C2:51:FC:79:D6:B8:49:78:6E:FE:B5:1A:8E:0F:91:85:61:C4:50:47:14:18\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 102 121 127 120 125 107 108 109 124 119 123 118 114 115 116\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:BLet\r\na=ice-pwd:cbGk3IU+Qdmq87i4JEEp1KGk\r\na=ice-options:trickle\r\na=fingerprint:sha-256 22:2E:04:F1:E1:12:0F:35:7B:16:C2:51:FC:79:D6:B8:49:78:6E:FE:B5:1A:8E:0F:91:85:61:C4:50:47:14:18\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:122 VP9/90000\r\na=rtcp-fb:122 goog-remb\r\na=rtcp-fb:122 transport-cc\r\na=rtcp-fb:122 ccm fir\r\na=rtcp-fb:122 nack\r\na=rtcp-fb:122 nack pli\r\na=fmtp:122 profile-id=1\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f\r\na=rtpmap:118 rtx/90000\r\na=fmtp:118 apt=123\r\na=rtpmap:114 red/90000\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 ulpfec/90000\r\n"}
webrtc播放申请回复:
{ "code": 0, "server": 377766, "sdp": "v=0\r\no=SRS/4.0.39(Leo) 30292192 2 IN IP4 0.0.0.0\r\ns=SRSPlaySession\r\nt=0 0\r\na=ice-lite\r\na=group:BUNDLE 0 1\r\na=msid-semantic: WMS live/1\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:75m4425y\r\na=ice-pwd:5k49gz6h45c56i27f1ltb735z9667dad\r\na=fingerprint:sha-256 37:69:01:ED:46:E4:E4:CC:1F:8A:71:50:2D:27:57:C8:7E:E3:0E:F6:12:3D:F2:84:F9:28:56:39:3F:81:6E:13\r\na=setup:passive\r\na=mid:0\r\na=sendonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:111 opus/48000/2\r\na=ssrc:1271938135 cname:1wty44643861r274\r\na=ssrc:1271938135 label:audio-mt940p61\r\na=candidate:0 1 udp 2130706431 192.168.12.187 8000 typ host generation 0\r\na=candidate:1 1 udp 2130706431 172.17.0.1 8000 typ host generation 0\r\na=candidate:2 1 udp 2130706431 10.224.98.128 8000 typ host generation 0\r\nm=video 9 UDP/TLS/RTP/SAVPF 102\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:75m4425y\r\na=ice-pwd:5k49gz6h45c56i27f1ltb735z9667dad\r\na=fingerprint:sha-256 37:69:01:ED:46:E4:E4:CC:1F:8A:71:50:2D:27:57:C8:7E:E3:0E:F6:12:3D:F2:84:F9:28:56:39:3F:81:6E:13\r\na=setup:passive\r\na=mid:1\r\na=sendonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:102 H264/90000\r\na=ssrc:1271938136 cname:1wty44643861r274\r\na=ssrc:1271938136 label:video-lz539zd4\r\na=candidate:0 1 udp 2130706431 192.168.12.187 8000 typ host generation 0\r\na=candidate:1 1 udp 2130706431 172.17.0.1 8000 typ host generation 0\r\na=candidate:2 1 udp 2130706431 10.224.98.128 8000 typ host generation 0\r\n", "sessionid": "75m4425y:BLet"}
通过测试webrtc在动画场景下是呈现花屏的,这个应该不是udp导致的(我去掉bframe discard后不花屏,然而呈现杂音和卡顿),具体的webrtc配置咱们能够去srs的4.0版本上查看full.conf看具体阐明:
https://github.com/ossrs/srs/blob/4.0release/trunk/conf/full.conf
我截取了webrtc局部的配置和阐明,详见如下:
############################################################################################## WebRTC server section#############################################################################################rtc_server { # Whether enable WebRTC server. # default: off enabled on; # The udp listen port, we will reuse it for connections. # default: 8000 listen 8000; # The exposed candidate IPs, response in SDP candidate line. It can be: # * Retrieve server IP automatically, from all network interfaces. # eth0 Retrieve server IP by specified network interface name. # TODO: Implements it. # $CANDIDATE Read the IP from ENV variable, use * if not set, see https://github.com/ossrs/srs/issues/307#issuecomment-599028124 # x.x.x.x A specified IP address or DNS name, which can be access by client such as Chrome. # You can specific more than one interface name: # eth0 eth1 Use network interface eth0 and eth1. # TODO: Implements it. # Also by IP or DNS names: # 192.168.1.3 10.1.2.3 rtc.me # TODO: Implements it. # And by multiple ENV variables: # $CANDIDATE $EIP # TODO: Implements it. # default: * candidate *; # The IP family filter for candidate, it can be: # ipv4 Filter IP v4 candidates. # ipv6 Filter IP v6 candidates. # all Filter all IP v4 or v6 candidates. # For example, if set to ipv4, we only use the IPv4 address as candidate. # default: ipv4 ip_family ipv4; # Whether use ECDSA certificate. # If not, use RSA certificate. # default: on ecdsa on; # Whether encrypt RTP packet by SRTP. # @remark Should always turn it on, or Chrome will fail. # default: on encrypt on; # We listen multiple times at the same port, by REUSEPORT, to increase the UDP queue. # Note that you can set to 1 and increase the system UDP buffer size by net.core.rmem_max # and net.core.rmem_default or just increase this to get larger UDP recv and send buffer. # default: 1 reuseport 1; # Whether merge multiple NALUs into one. # @see https://github.com/ossrs/srs/issues/307#issuecomment-612806318 # default: off merge_nalus off; # Whether enable the perf stat at http://localhost:1985/api/v1/perf # default: on perf_stat on; # The queue length, in number of mmsghdr, in messages. # For example, 30 means we will cache 30K messages at most. # If exceed, we will drop messages. # @remark Each reuseport use a dedicated queue, if queue is 2000, reuseport is 4, # then system queue is 2000*4 = 8k, user can incrase reuseport to incrase the queue. # default: 2000 queue_length 2000; # The black-hole to copy packet to, for debugging. # For example, when debugging Chrome publish stream, the received packets are encrypted cipher, # we can set the publisher black-hole, SRS will copy the plaintext packets to black-hole, and # we are able to capture the plaintext packets by wireshark. black_hole { # Whether enable the black-hole. # default: off enabled off; # The black-hole address for session. addr 127.0.0.1:10000; }}
vhost下rtc启用配置:
vhost rtc.vhost.srs.com { rtc { # Whether enable WebRTC server. # default: off enabled on; # The strategy for bframe. # keep Keep bframe, which may make browser with playing problems. # discard Discard bframe, maybe cause browser with little problems. # default: keep bframe discard; # The strategy for aac audio. # transcode Transcode aac to opus. # discard Discard aac audio packet. # default: transcode aac transcode; # The timeout in seconds for session timeout. # Client will send ping(STUN binding request) to server, we use it as heartbeat. # default: 30 stun_timeout 30; # The strick check when process stun. # default: off stun_strict_check on; # The role of dtls when peer is actpass: passive or active # default: passive dtls_role passive; # The version of dtls, support dtls1.0, dtls1.2, and auto # default: auto dtls_version auto; # Drop the packet with the pt(payload type), 0 never drop. # default: 0 drop_for_pt 0; } # whether enable min delay mode for vhost. # default: on, for RTC. min_latency on; play { # set the MW(merged-write) latency in ms. # @remark For WebRTC, we enable pass-timestamp mode, so we ignore this config. # default: 0 (For WebRTC) mw_latency 0; # Set the MW(merged-write) min messages. # default: 0 (For Real-Time, min_latency on) # default: 1 (For WebRTC, min_latency off) mw_msgs 0; } # For NACK. nack { # Whether support NACK. # default: on enabled on; } # For TWCC. twcc { # Whether support TWCC. # default: on enabled on; }}
也能够在客户端指定webrtc服务器wlan的ip(如果docker获取不到ip能够通过设置环境变量形式$CANDIDATE):
webrtc://192.168.12.187/live/1?eip=192.168.12.187
如果应用docker测试能够应用拉取对应镜像
#查看公布的所有的版本git tag#通过查看到的版本拉取对应的docker镜像(也能够应用杭州的镜像)docker pull osrs/srs:v4.0.34
查看源码和对应文档能够进入srs-docker版本,切换到rts分支:
https://github.com/ossrs/srs-docker/tree/rtc
源码获取、单干、技术交换请获取如下联系方式:
QQ交换群:961179337
微信账号:lixiang6153
公众号:IT技术快餐
电子邮箱:lixx2048@163.com