shogo4405 / HaishinKit.swift

Camera and Microphone streaming library via RTMP and SRT for iOS, macOS, tvOS and visionOS.
BSD 3-Clause "New" or "Revised" License
2.78k stars 617 forks source link

再接続できない場合がある #860

Closed dazy1030 closed 3 years ago

dazy1030 commented 3 years ago

Describe the bug

To Reproduce

  1. ~requireNetworkFramework を trueに~
  2. 接続ができる環境で、RTMPConnection の connect(_:) を呼びRTMP接続を行う
  3. NetConnection.Connect.Success な状態になったらRTMPStreamの publish(_:) を呼びストリームを流し始める
  4. 機内モードで接続を遮断する
  5. NetConnection.Connect.Closed の状態になったら、RTMPConnection の connect(_:) を呼びRTMP接続を試みる
  6. (RTMPSocketと差分があり、接続できない状態で connect(_:) を呼ぶと接続できるまで繰り返す)
  7. 機内モードを解除する
  8. NetConnection.Connect.Success の状態になったらRTMPStreamの publish(_:) を呼ぶ
  9. 待っても NetStream.Publish.Start の状態にならず、ストリームも流れていない

Expected behavior

Smartphone:

Additional context Logboard で収集した役に立ちそうなログを記載します

shogo4405 commented 3 years ago

機内モードで接続を遮断する

1〜3 のときはスムーズにいって。機内モードで接続を遮断するとうまくいかないという理解で良いでしょうか? WiFi -> 4G -> WiFi のテストとiOS12/13のときのテストで終わっていました。

開発者も意図はしていないのでただのバグになり。解決方法は現在のところはなさそうです。

dazy1030 commented 3 years ago

遅くの時間にありがとうございます

1〜3 のときはスムーズにいって。機内モードで接続を遮断するとうまくいかないという理解で良いでしょうか?

そうですね。記載させていただいた問題をもっと利用者目線に言うと、配信中になんらかの原因で接続が切れてそこから復帰しづらい、といった感じです。確かに初回で失敗した試しはないですね。

dazy1030 commented 3 years ago

どうやらRTMPNWSocketの問題ではなかったようなので、タイトルと内容に一部変更を加えました。 RTMPの仕様をまだちゃんと把握できていませんが、おそらく切断前のストリームが削除されていない状態で同じ名前でストリームを作成しようとしているのが原因な気がします。

dazy1030 commented 3 years ago

徐々にRTMPの仕様を理解してきて、不具合でないことがわかりました。

処理が漏れていて気がついていなかったのですが、8. の NetConnection.Connect.Success の後に NetStream.Publish.BadName を受信していました。 これは同じ名前のストリームで公開しようとした時に起こるエラーのようで、前のストリームがサーバー目線でまだ生きているという判定の時に起こるエラーでした。前のストリームはタイムアウトで死んだとみなされるため、BadName を受信した場合は成功するまで Publish を繰り返せば良いというのが正しい再接続の方法のようでした。

理解不足のままissue化してしまい失礼しました。解決したためcloseさせていただきます。