解放されたvideo_idを使用時にクラッシュ
https://github.com/skyway/skyway-webrtc-gateway/tree/master/samples
を参考に試しているのですが
MediaConnectionをクローズした後に
使用していたvideo_idを再度answerで使用するとgateway_linux_armがクラッシュします。
クラッシュ(Aborted (core dumped))後すぐにgateway_linux_armを起動するとエラーで起動できません。
$ ./gateway_linux_arm
set port to 8000, log_level to 1
Aborted (core dumped)
$ ./gateway_linux_arm
set port to 8000, log_level to 1
e/SkyWay++: rest fail: bind: Address already in use
すこし待たないと起動に失敗します。
解放されたvideo_idを指定しなければいいのですが、事前にvideo_idなどが開放されたかわかる方法か、
指定してもクラッシュせずにAPIでエラーが返ってくるリクエストパラメータか、
gateway_linux_armが即復帰できる方法はありますでしょうか?
エラーメッセージから8000ポートが使えないとのことなので
クラッシュ時はconfig.tomファイルでポート番号をずらして起動する方法があるのかなと考えています。
よろしくお願いします。
util.rbは以下にあるソースを使用しています
https://github.com/skyway/skyway-webrtc-gateway/tree/master/samples
受け側のソース
require './util.rb'
SKYWAY_API_KEY = ENV["API_KEY"]
PEER_ID = "media_callee"
TARGET_ID = "media_caller"
RECV_ADDR = "127.0.0.1"
VIDEO_RECV_PORT = 20000
AUDIO_RECV_PORT = 20001
VIDEO_RTCP_RECV_PORT = 20010
AUDIO_RTCP_RECV_PORT = 20011
#connect to skyway server
peer_token = create_peer(SKYWAY_API_KEY, PEER_ID)
#port open request for sending data
(video_id, video_ip, video_port) = create_media(true)
(audio_id, audio_ip, audio_port) = create_media(false)
(video_rtcp_id, video_rtcp_ip, video_rtcp_port) = create_rtcp()
(audio_rtcp_id, audio_rtcp_ip, audio_rtcp_port) = create_rtcp()
media_connection_id = wait_call(PEER_ID, peer_token)
pp [video_rtcp_id, video_rtcp_ip, video_rtcp_port]
pp [audio_rtcp_id, audio_rtcp_ip, audio_rtcp_port]
video_redirect = [RECV_ADDR, VIDEO_RECV_PORT]
audio_redirect = [RECV_ADDR, AUDIO_RECV_PORT]
video_rtcp_redirect = [RECV_ADDR, VIDEO_RTCP_RECV_PORT]
audio_rtcp_redirect = [RECV_ADDR, AUDIO_RTCP_RECV_PORT]
answer(media_connection_id, video_id, video_redirect, audio_id, audio_redirect, video_rtcp_id, video_rtcp_redirect, audio_rtcp_id, audio_rtcp_redirect)
wait_ready(media_connection_id)
#now you can send stream form your app
puts "you can send video RTP packet to at #{video_ip}:#{video_port} as #{video_id}"
puts "you can send video RTCP packet to at #{video_rtcp_ip}:#{video_rtcp_port} as #{audio_rtcp_id}"
puts "you can send audio RTP packet to at #{audio_ip}:#{audio_port} as #{audio_id}"
puts "you can send audio RTCP packet to at #{audio_rtcp_ip}:#{audio_rtcp_port} as #{audio_rtcp_id}"
puts "video from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{VIDEO_RECV_PORT}"
puts "video RTCP from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{VIDEO_RTCP_RECV_PORT}"
puts "audio from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{AUDIO_RECV_PORT}"
puts "audio RTCP from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{AUDIO_RTCP_RECV_PORT}"
sleep(1)
#closing
request(:delete, "/media/connections/#{media_connection_id}")
puts "wait"
media_connection_id = wait_call(PEER_ID, peer_token)
answer(media_connection_id, video_id, video_redirect, audio_id, audio_redirect, video_rtcp_id, video_rtcp_redirect, audio_rtcp_id, audio_rtcp_redirect)
request(:delete, "/peers/#{PEER_ID}?token=#{peer_token}")
require './util.rb' SKYWAY_API_KEY = ENV["API_KEY"] PEER_ID = "media_caller" TARGET_ID = "media_callee" RECV_ADDR = "127.0.0.1" VIDEO_RECV_PORT = 20000 AUDIO_RECV_PORT = 20001 VIDEO_RTCP_RECV_PORT = 20010 AUDIO_RTCP_RECV_PORT = 20011 #connect to skyway server peer_token = create_peer(SKYWAY_API_KEY, PEER_ID) #port open request for sending data (video_id, video_ip, video_port) = create_media(true) (audio_id, audio_ip, audio_port) = create_media(false) (video_rtcp_id, video_rtcp_ip, video_rtcp_port) = create_rtcp() (audio_rtcp_id, audio_rtcp_ip, audio_rtcp_port) = create_rtcp() video_redirect = [RECV_ADDR, VIDEO_RECV_PORT] audio_redirect = [RECV_ADDR, AUDIO_RECV_PORT] video_rtcp_redirect = [RECV_ADDR, VIDEO_RTCP_RECV_PORT] audio_rtcp_redirect = [RECV_ADDR, AUDIO_RTCP_RECV_PORT] media_connection_id = call(PEER_ID, peer_token, TARGET_ID, video_id, video_redirect, audio_id, audio_redirect, video_rtcp_id, video_rtcp_redirect, audio_rtcp_id, audio_rtcp_redirect) wait_ready(media_connection_id) #now you can send stream form your app puts "you can send video RTP packet to at #{video_ip}:#{video_port} as #{video_id}" puts "you can send video RTCP packet to at #{video_rtcp_ip}:#{video_rtcp_port} as #{video_rtcp_id}" puts "you can send audio RTP packet to at #{audio_ip}:#{audio_port} as #{audio_id}" puts "you can send audio RTCP packet to at #{audio_rtcp_ip}:#{audio_rtcp_port} as #{audio_rtcp_id}" puts "video from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{VIDEO_RECV_PORT}" puts "video RTCP from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{VIDEO_RTCP_RECV_PORT}" puts "audio from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{AUDIO_RECV_PORT}" puts "audio RTCP from #{TARGET_ID} will redirect to #{RECV_ADDR}:#{AUDIO_RTCP_RECV_PORT}" sleep(1) #closing request(:delete, "/media/connections/#{media_connection_id}") request(:delete, "/peers/#{PEER_ID}?token=#{peer_token}")
set port to 8000, log_level to 1
Aborted (core dumped)
["rc-804d7580-58dd-419c-a734-5cb34f3774b5", "192.168.50.115", 50003]
["rc-d35a10a2-66f4-4290-a108-439f8a7bfc08", "192.168.50.115", 50004]
you can send video RTP packet to at 192.168.50.115:50001 as vi-a37dcc8c-8471-46ce-bd3b-3ff43b0bb43f
you can send video RTCP packet to at 192.168.50.115:50003 as rc-d35a10a2-66f4-4290-a108-439f8a7bfc08
you can send audio RTP packet to at 192.168.50.115:50002 as au-6660b37d-6c48-40ad-99c3-9637de3cad83
you can send audio RTCP packet to at 192.168.50.115:50004 as rc-d35a10a2-66f4-4290-a108-439f8a7bfc08
video from media_caller will redirect to 127.0.0.1:20000
video RTCP from media_caller will redirect to 127.0.0.1:20010
audio from media_caller will redirect to 127.0.0.1:20001
audio RTCP from media_caller will redirect to 127.0.0.1:20011
wait
Traceback (most recent call last):
16: from callee.rb:48:in `<main>'
15: from /home/pi/tes/util.rb:182:in `answer'
14: from /home/pi/tes/util.rb:24:in `request'
13: from /usr/lib/ruby/2.5.0/net/http.rb:609:in `start'
12: from /usr/lib/ruby/2.5.0/net/http.rb:910:in `start'
11: from /home/pi/tes/util.rb:25:in `block in request'
10: from /usr/lib/ruby/2.5.0/net/http.rb:1269:in `post'
9: from /usr/lib/ruby/2.5.0/net/http.rb:1481:in `send_entity'
8: from /usr/lib/ruby/2.5.0/net/http.rb:1467:in `request'
7: from /usr/lib/ruby/2.5.0/net/http.rb:1494:in `transport_request'
6: from /usr/lib/ruby/2.5.0/net/http.rb:1494:in `catch'
5: from /usr/lib/ruby/2.5.0/net/http.rb:1497:in `block in transport_request'
4: from /usr/lib/ruby/2.5.0/net/http/response.rb:29:in `read_new'
3: from /usr/lib/ruby/2.5.0/net/http/response.rb:40:in `read_status_line'
2: from /usr/lib/ruby/2.5.0/net/protocol.rb:167:in `readline'
1: from /usr/lib/ruby/2.5.0/net/protocol.rb:157:in `readuntil'
/usr/lib/ruby/2.5.0/net/protocol.rb:189:in `rbuf_fill': end of file reached (EOFError)
you can send video RTP packet to at 192.168.50.115:50005 as vi-b4f249fe-7fa8-4042-b4ff-3172ea5bb427
you can send video RTCP packet to at 192.168.50.115:50007 as rc-0ca7e24a-cf0d-4fd4-b6fa-3ef076a55fae
you can send audio RTP packet to at 192.168.50.115:50006 as au-9e9c7699-5603-47f2-9875-dab8d8f8e0d8
you can send audio RTCP packet to at 192.168.50.115:50008 as rc-170ebe0c-2735-4311-9253-3177897decca
video from media_callee will redirect to 127.0.0.1:20000
video RTCP from media_callee will redirect to 127.0.0.1:20010
audio from media_callee will redirect to 127.0.0.1:20001
audio RTCP from media_callee will redirect to 127.0.0.1:20011
pi@Dev:~/tes$ ruby caller.rb
#<Thread:0x00000055a7e38918@/home/pi/tes/util.rb:34 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
16: from /home/pi/tes/util.rb:36:in `block in wait_thread_for'
15: from /home/pi/tes/util.rb:24:in `request'
14: from /usr/lib/ruby/2.5.0/net/http.rb:609:in `start'
13: from /usr/lib/ruby/2.5.0/net/http.rb:910:in `start'
12: from /home/pi/tes/util.rb:25:in `block in request'
11: from /usr/lib/ruby/2.5.0/net/http.rb:1216:in `get'
10: from /usr/lib/ruby/2.5.0/net/http.rb:1467:in `request'
9: from /usr/lib/ruby/2.5.0/net/http.rb:1494:in `transport_request'
8: from /usr/lib/ruby/2.5.0/net/http.rb:1494:in `catch'
7: from /usr/lib/ruby/2.5.0/net/http.rb:1497:in `block in transport_request'
6: from /usr/lib/ruby/2.5.0/net/http/response.rb:29:in `read_new'
5: from /usr/lib/ruby/2.5.0/net/http/response.rb:40:in `read_status_line'
4: from /usr/lib/ruby/2.5.0/net/protocol.rb:167:in `readline'
3: from /usr/lib/ruby/2.5.0/net/protocol.rb:157:in `readuntil'
2: from /usr/lib/ruby/2.5.0/net/protocol.rb:175:in `rbuf_fill'
1: from /usr/lib/ruby/2.5.0/socket.rb:452:in `read_nonblock'
/usr/lib/ruby/2.5.0/socket.rb:452:in `__read_nonblock': Connection reset by peer (Errno::ECONNRESET)
Traceback (most recent call last):
16: from /home/pi/tes/util.rb:36:in `block in wait_thread_for'
15: from /home/pi/tes/util.rb:24:in `request'
14: from /usr/lib/ruby/2.5.0/net/http.rb:609:in `start'
13: from /usr/lib/ruby/2.5.0/net/http.rb:910:in `start'
12: from /home/pi/tes/util.rb:25:in `block in request'
11: from /usr/lib/ruby/2.5.0/net/http.rb:1216:in `get'
10: from /usr/lib/ruby/2.5.0/net/http.rb:1467:in `request'
9: from /usr/lib/ruby/2.5.0/net/http.rb:1494:in `transport_request'
8: from /usr/lib/ruby/2.5.0/net/http.rb:1494:in `catch'
7: from /usr/lib/ruby/2.5.0/net/http.rb:1497:in `block in transport_request'
6: from /usr/lib/ruby/2.5.0/net/http/response.rb:29:in `read_new'
5: from /usr/lib/ruby/2.5.0/net/http/response.rb:40:in `read_status_line'
4: from /usr/lib/ruby/2.5.0/net/protocol.rb:167:in `readline'
3: from /usr/lib/ruby/2.5.0/net/protocol.rb:157:in `readuntil'
2: from /usr/lib/ruby/2.5.0/net/protocol.rb:175:in `rbuf_fill'
1: from /usr/lib/ruby/2.5.0/socket.rb:452:in `read_nonblock'
/usr/lib/ruby/2.5.0/socket.rb:452:in `__read_nonblock': Connection reset by peer (Errno::ECONNRESET)
-
ご不便をおかけして申し訳ございません。
> MediaConnectionをクローズした後に使用していたvideo_idを再度answerで使用するとgateway_linux_armがクラッシュします。
MediaConnectionをクローズした際に、紐付いているMediaが他で利用されていない場合は解放する仕様になっています。
今回は、解放済みのMediaを指定した際の例外処理が漏れていたため、クラッシュしておりました。
v0.3.2でエラーを返却するように修正しております。
https://github.com/skyway/skyway-webrtc-gateway/releases/tag/0.3.2> e/SkyWay++: rest fail: bind: Address already in use
> すこし待たないと起動に失敗します。上記メッセージが出力され起動できない場合は、WebRTC Gateway関連のプロセスが別スレッドで実行中のまま残っている可能性があります。WebRTC Gatewayは起動時に関連するプロセスが実行中かどうかをチェックし、安全に起動できる状態になるまでは起動しないようになっています。
lsofで関連する残存プロセスを確認し、killすることで解決できる場合があります。
Please sign in to leave a comment.
Comments
1 comment