Safari で WebRTC を使う時、受信用の ICE Candidate を得るには?
RTSP/RTP で H.264 を出力するカメラの映像を、Webページで表示するために WebRTC を組んでいます。
送信側は、GStreamer 1.14 の webrtcbin を使う予定ですが、実験のために単純なHTMLを使っています。
また受信側も単純なHTMLです。
受信側は以下のように組んでおり、Chrome, Firefox では onicecandidate で event.candidate に受信側の ICE Candidate が通知され、最後に event.candidate が null で通知されます。
let peer = new RTCPeerConnection(null);
...
peer.onicecandidate = e => {
progress("onicecandidate");
console.log(`ICE candidate:\n${event.candidate ? event.candidate.candidate : '(null)'}`);
}
...
peer.setRemoteDescription(desc);
...
peer.createAnswer().then(
onAnswerCreated,
e => console.log(`Failed to createAnswer: ${e()}`)
);
...
function onAnswerCreated(desc) {
peer.setLocalDescription(desc).then(
e => console.log('localDescription success.'),
e => console.log(`Failed to set setLocalDescription: ${e}`)
);
}
...
ところが Safari では onicecandidate には、いきなり event.candidate が null で通知されます。
それでも受信側にはちゃんと映像が現れているのですが、Safari でも onicecandidate で ICE Candidate が通知されるようにするにはどのように組んだら良いか教えてください。
環境は macOS Mojave, Safari 12.0.3 です。
なお、送信、受信ともSafariを使った場合、Offer, Answer はこのように出てきました。
Offer
v=0
o=- 2815307564197408858 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE video
a=msid-semantic: WMS 509909e8-78db-4cb7-9531-67df7cbd17c1
m=video 60226 UDP/TLS/RTP/SAVPF 96 97 98 99 100
c=IN IP4 192.168.39.18
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:1504533620 1 udp 2113937151 192.168.39.18 60226 typ host generation 0 network-cost 50
a=ice-ufrag:MbW2
a=ice-pwd:UktSO3UOMhEqgOkFSNXPUOYI
a=ice-options:trickle
a=fingerprint:sha-256 98:45:40:34:2D:F6:0A:BC:7F:A7:E9:A0:FE:CC:85:4E:65:16:3A:06:08:2C:9A:8A:59:A0:97:55:7C:FA:FC:15
a=setup:actpass
a=mid:video
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:4 urn:3gpp:video-orientation
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 H264/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 red/90000
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 ulpfec/90000
a=ssrc-group:FID 3450510881 3341259562
a=ssrc:3450510881 cname:ZCETmDCEejDy1+Bw
a=ssrc:3450510881 msid:509909e8-78db-4cb7-9531-67df7cbd17c1 a9e06b0a-eaf7-4f86-ae3e-bd54a40c3011
a=ssrc:3450510881 mslabel:509909e8-78db-4cb7-9531-67df7cbd17c1
a=ssrc:3450510881 label:a9e06b0a-eaf7-4f86-ae3e-bd54a40c3011
a=ssrc:3341259562 cname:ZCETmDCEejDy1+Bw
a=ssrc:3341259562 msid:509909e8-78db-4cb7-9531-67df7cbd17c1 a9e06b0a-eaf7-4f86-ae3e-bd54a40c3011
a=ssrc:3341259562 mslabel:509909e8-78db-4cb7-9531-67df7cbd17c1
a=ssrc:3341259562 label:a9e06b0a-eaf7-4f86-ae3e-bd54a40c3011
Answer
v=0
o=- 2142334565355646857 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE video
a=msid-semantic: WMS
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:A+n1
a=ice-pwd:Mw84V6hYzS81gN8PkPkT7Bf6
a=ice-options:trickle
a=fingerprint:sha-256 76:26:37:77:4B:55:15:7F:9B:63:68:4B:D7:C4:A2:07:29:45:01:F8:8C:77:D0:50:F8:FF:0A:7D:98:AA:4F:90
a=setup:active
a=mid:video
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:4 urn:3gpp:video-orientation
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 H264/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 red/90000
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 ulpfec/90000