Skip to content

Commit e34e092

Browse files
MediaStreamer でエラーを返却する場合にも同じようにリトライするように修正
1 parent 9c4ff3f commit e34e092

4 files changed

Lines changed: 220 additions & 135 deletions

File tree

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/AbstractRTMPBroadcaster.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ public void onError(MediaEncoderException e) {
103103
if (mOnBroadcasterEventListener != null) {
104104
mOnBroadcasterEventListener.onError(e);
105105
}
106+
107+
AbstractRTMPBroadcaster.this.stop();
106108
}
107109

108110
@Override
@@ -111,7 +113,6 @@ public void onConnected() {
111113

112114
@Override
113115
public void onDisconnected() {
114-
AbstractRTMPBroadcaster.this.stop();
115116
}
116117

117118
@Override

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/AbstractSRTBroadcaster.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ public void onError(MediaEncoderException e) {
103103
if (mOnBroadcasterEventListener != null) {
104104
mOnBroadcasterEventListener.onError(e);
105105
}
106+
107+
AbstractSRTBroadcaster.this.stop();
106108
}
107109

108110
@Override
@@ -111,7 +113,6 @@ public void onConnected() {
111113

112114
@Override
113115
public void onDisconnected() {
114-
AbstractSRTBroadcaster.this.stop();
115116
}
116117

117118
@Override

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtmp/RtmpClient.java

Lines changed: 107 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.deviceconnect.android.libmedia.streaming.rtmp;
22

33
import android.os.Handler;
4-
import android.os.Looper;
4+
import android.os.HandlerThread;
55

66
import org.deviceconnect.android.libmedia.streaming.MediaEncoderException;
77
import 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

Comments
 (0)