11package org .deviceconnect .android .libmedia .streaming .rtmp ;
22
33import android .os .Handler ;
4- import android .os .Looper ;
4+ import android .os .HandlerThread ;
55
66import org .deviceconnect .android .libmedia .streaming .MediaEncoderException ;
77import org .deviceconnect .android .libmedia .streaming .MediaStreamer ;
@@ -23,7 +23,7 @@ public class RtmpClient {
2323 /**
2424 * ハンドラ.
2525 */
26- private final Handler mHandler = new Handler ( Looper . getMainLooper ()) ;
26+ private Handler mRetryHandler ;
2727
2828 /**
2929 * リトライ数.
@@ -33,12 +33,12 @@ public class RtmpClient {
3333 /**
3434 * リトライ回数.
3535 */
36- private int mMaxRetryCount = 3 ;
36+ private int mMaxRetryCount = 0 ;
3737
3838 /**
3939 * リトライを行うインターバル.
4040 */
41- private int mRetryInterval = 2000 ;
41+ private int mRetryInterval = 4000 ;
4242
4343 /**
4444 * リトライフラグ.
@@ -49,16 +49,100 @@ public class RtmpClient {
4949 private boolean mRetryFlag ;
5050
5151 /**
52- * 起動フラグ .
52+ * イベントを送信するリスナー .
5353 */
54- private boolean mRunnableFlag ;
54+ private OnEventListener mOnEventListener ;
5555
5656 /**
5757 * コンストラクタ.
5858 */
5959 public RtmpClient (String broadcastURI ) {
6060 mRtmpMuxer = new RtmpMuxer (broadcastURI );
61+ mRtmpMuxer .setOnEventListener (new RtmpMuxer .OnEventListener () {
62+ @ Override
63+ public void onConnected () {
64+ if (mOnEventListener != null ) {
65+ mOnEventListener .onConnected ();
66+ }
67+ }
68+
69+ @ Override
70+ public void onDisconnected () {
71+ if (mOnEventListener != null ) {
72+ mOnEventListener .onDisconnected ();
73+ }
74+ }
75+
76+ @ Override
77+ public void onNewBitrate (long bitrate ) {
78+ if (mOnEventListener != null ) {
79+ mOnEventListener .onNewBitrate (bitrate );
80+ }
81+ }
82+
83+ @ Override
84+ public void onError (MediaEncoderException e ) {
85+ error (e );
86+ }
87+ });
88+
6189 mMediaStreamer = new MediaStreamer (mRtmpMuxer );
90+ mMediaStreamer .setOnEventListener (new MediaStreamer .OnEventListener () {
91+ @ Override
92+ public void onStarted () {
93+ mRetryCount = 0 ;
94+
95+ if (mOnEventListener != null ) {
96+ mOnEventListener .onStarted ();
97+ }
98+ }
99+
100+ @ Override
101+ public void onStopped () {
102+ if (mOnEventListener != null ) {
103+ mOnEventListener .onStopped ();
104+ }
105+ }
106+
107+ @ Override
108+ public void onError (MediaEncoderException e ) {
109+ error (e );
110+ }
111+ });
112+ }
113+
114+ /**
115+ * エラー処理を行います.
116+ *
117+ * @param e エラー原因の例外
118+ */
119+ private synchronized void error (MediaEncoderException e ) {
120+ if (mRetryFlag ) {
121+ // リトライ処理中なので、連続で発生したエラーは無視する。
122+ return ;
123+ }
124+
125+ if (mRetryCount < mMaxRetryCount ) {
126+ mRetryCount ++;
127+ mRetryFlag = true ;
128+
129+ mMediaStreamer .stop ();
130+
131+ if (mRetryHandler != null ) {
132+ mRetryHandler .postDelayed (() -> {
133+ if (mRetryHandler != null ) {
134+ mMediaStreamer .start ();
135+ }
136+ mRetryFlag = false ;
137+ }, mRetryInterval );
138+ }
139+ } else {
140+ stop ();
141+
142+ if (mOnEventListener != null ) {
143+ mOnEventListener .onError (e );
144+ }
145+ }
62146 }
63147
64148 /**
@@ -103,63 +187,7 @@ public int getRetryInterval() {
103187 * @param listener リスナー
104188 */
105189 public void setOnEventListener (OnEventListener listener ) {
106- mMediaStreamer .setOnEventListener (listener );
107- mRtmpMuxer .setOnEventListener (new RtmpMuxer .OnEventListener () {
108- @ Override
109- public void onConnected () {
110- // 接続できたのでリトライ数を初期化
111- mRetryCount = 0 ;
112- if (listener != null ) {
113- listener .onConnected ();
114- }
115- }
116-
117- @ Override
118- public void onDisconnected () {
119- if (mRetryFlag ) {
120- // エラーが発生して切断された時も、このイベントが呼び出されるので
121- // リトライの処理を行っている間はリスナーに通知しないようにブロックする。
122- return ;
123- }
124-
125- if (listener != null ) {
126- listener .onDisconnected ();
127- }
128- }
129-
130- @ Override
131- public void onNewBitrate (long bitrate ) {
132- if (listener != null ) {
133- listener .onNewBitrate (bitrate );
134- }
135- }
136-
137- @ Override
138- public void onError (MediaEncoderException e ) {
139- if (mRetryFlag ) {
140- return ;
141- }
142-
143- mMediaStreamer .stop ();
144-
145- if (mRetryCount < mMaxRetryCount ) {
146- mRetryCount ++;
147- mRetryFlag = true ;
148-
149- mHandler .postDelayed (() -> {
150- mRetryFlag = false ;
151- if (mRunnableFlag ) {
152- mMediaStreamer .start ();
153- }
154- }, mRetryInterval );
155- } else {
156- mRunnableFlag = false ;
157- if (listener != null ) {
158- listener .onError (e );
159- }
160- }
161- }
162- });
190+ mOnEventListener = listener ;
163191 }
164192
165193 /**
@@ -168,23 +196,33 @@ public void onError(MediaEncoderException e) {
168196 * @return 動作中の場合は true、それ以外は false
169197 */
170198 public boolean isRunning () {
171- return mMediaStreamer . isRunning () ;
199+ return mRetryHandler != null ;
172200 }
173201
174202 /**
175203 * RTMP のセッションを開始します.
176204 */
177205 public synchronized void start () {
206+ if (mRetryHandler != null ) {
207+ return ;
208+ }
209+
210+ HandlerThread thread = new HandlerThread ("rtmp-retry-thread" );
211+ thread .start ();
212+ mRetryHandler = new Handler (thread .getLooper ());
178213 mRetryCount = mMaxRetryCount ;
179- mRunnableFlag = true ;
214+ mRetryFlag = false ;
180215 mMediaStreamer .start ();
181216 }
182217
183218 /**
184219 * RTMP のセッションを停止します.
185220 */
186221 public synchronized void stop () {
187- mRunnableFlag = false ;
222+ if (mRetryHandler != null ) {
223+ mRetryHandler .getLooper ().quit ();
224+ mRetryHandler = null ;
225+ }
188226 mMediaStreamer .stop ();
189227 }
190228
@@ -283,6 +321,9 @@ public void restartAudioEncoder() {
283321 }
284322 }
285323
324+ /**
325+ * RtmpClient で発生したイベントを通知するリスナー.
326+ */
286327 public interface OnEventListener extends MediaStreamer .OnEventListener , RtmpMuxer .OnEventListener {
287328 }
288329}
0 commit comments