From d5576daa653f2007eb37fe1bb33e217ddf84464b Mon Sep 17 00:00:00 2001 From: pedro Date: Thu, 12 Oct 2023 22:42:08 +0200 Subject: [PATCH 1/4] refactor base abstract methods --- .../streamer/customexample/RtmpActivity.java | 2 +- .../streamer/customexample/RtspActivity.java | 6 +- .../defaultexample/ExampleRtmpActivity.java | 2 +- .../defaultexample/ExampleRtspActivity.java | 2 +- .../defaultexample/ExampleSrtActivity.java | 2 +- .../SurfaceModeRtmpActivity.java | 2 +- .../SurfaceModeRtspActivity.java | 2 +- .../com/pedro/library/base/Camera1Base.java | 59 -------- .../com/pedro/library/base/Camera2Base.java | 59 -------- .../com/pedro/library/base/DisplayBase.java | 59 -------- .../com/pedro/library/base/FromFileBase.java | 59 -------- .../com/pedro/library/base/OnlyAudioBase.java | 58 -------- .../java/com/pedro/library/base/StreamBase.kt | 42 +----- .../library/multiple/MultiRtpCamera1.java | 33 ----- .../library/multiple/MultiRtpCamera2.java | 33 ----- .../library/multiple/MultiRtpDisplay.java | 36 ----- .../library/multiple/MultiRtpOnlyAudio.java | 33 ----- .../com/pedro/library/rtmp/RtmpCamera1.java | 139 +++--------------- .../com/pedro/library/rtmp/RtmpCamera2.java | 138 +++-------------- .../com/pedro/library/rtmp/RtmpDisplay.java | 134 +++-------------- .../com/pedro/library/rtmp/RtmpFromFile.java | 137 +++-------------- .../com/pedro/library/rtmp/RtmpOnlyAudio.java | 124 ++-------------- .../java/com/pedro/library/rtmp/RtmpStream.kt | 108 +++----------- .../com/pedro/library/rtsp/RtspCamera1.java | 111 +++----------- .../com/pedro/library/rtsp/RtspCamera2.java | 110 +++----------- .../com/pedro/library/rtsp/RtspDisplay.java | 107 +++----------- .../com/pedro/library/rtsp/RtspFromFile.java | 111 +++----------- .../com/pedro/library/rtsp/RtspOnlyAudio.java | 107 +++----------- .../java/com/pedro/library/rtsp/RtspStream.kt | 81 +++------- .../com/pedro/library/srt/SrtCamera1.java | 106 +++---------- .../com/pedro/library/srt/SrtCamera2.java | 106 +++---------- .../com/pedro/library/srt/SrtDisplay.java | 120 ++++----------- .../com/pedro/library/srt/SrtFromFile.java | 101 +++---------- .../com/pedro/library/srt/SrtOnlyAudio.java | 115 ++++----------- .../java/com/pedro/library/srt/SrtStream.kt | 71 +++------ .../library/util/client/RtmpStreamClient.kt | 98 ++++++++++++ .../library/util/client/RtspStreamClient.kt | 74 ++++++++++ .../library/util/client/SrtStreamClient.kt | 63 ++++++++ .../library/util/client/StreamBaseClient.kt | 31 ++++ .../java/com/pedro/rtmp/rtmp/RtmpClient.kt | 4 +- 40 files changed, 651 insertions(+), 2134 deletions(-) create mode 100644 library/src/main/java/com/pedro/library/util/client/RtmpStreamClient.kt create mode 100644 library/src/main/java/com/pedro/library/util/client/RtspStreamClient.kt create mode 100644 library/src/main/java/com/pedro/library/util/client/SrtStreamClient.kt create mode 100644 library/src/main/java/com/pedro/library/util/client/StreamBaseClient.kt diff --git a/app/src/main/java/com/pedro/streamer/customexample/RtmpActivity.java b/app/src/main/java/com/pedro/streamer/customexample/RtmpActivity.java index a12c7fefc..48279b2f5 100644 --- a/app/src/main/java/com/pedro/streamer/customexample/RtmpActivity.java +++ b/app/src/main/java/com/pedro/streamer/customexample/RtmpActivity.java @@ -228,7 +228,7 @@ public void onClick(View v) { String user = etWowzaUser.getText().toString(); String password = etWowzaPassword.getText().toString(); if (!user.isEmpty() && !password.isEmpty()) { - rtmpCamera1.setAuthorization(user, password); + rtmpCamera1.getStreamClient().setAuthorization(user, password); } if (rtmpCamera1.isRecording() || prepareEncoders()) { rtmpCamera1.startStream(etUrl.getText().toString()); diff --git a/app/src/main/java/com/pedro/streamer/customexample/RtspActivity.java b/app/src/main/java/com/pedro/streamer/customexample/RtspActivity.java index ad36b918e..ebdfe45e1 100644 --- a/app/src/main/java/com/pedro/streamer/customexample/RtspActivity.java +++ b/app/src/main/java/com/pedro/streamer/customexample/RtspActivity.java @@ -229,14 +229,14 @@ public void onClick(View v) { if (!rtspCamera1.isStreaming()) { bStartStop.setText(getResources().getString(R.string.stop_button)); if (rbTcp.isChecked()) { - rtspCamera1.setProtocol(Protocol.TCP); + rtspCamera1.getStreamClient().setProtocol(Protocol.TCP); } else { - rtspCamera1.setProtocol(Protocol.UDP); + rtspCamera1.getStreamClient().setProtocol(Protocol.UDP); } String user = etWowzaUser.getText().toString(); String password = etWowzaPassword.getText().toString(); if (!user.isEmpty() && !password.isEmpty()) { - rtspCamera1.setAuthorization(user, password); + rtspCamera1.getStreamClient().setAuthorization(user, password); } if (rtspCamera1.isRecording() || prepareEncoders()) { rtspCamera1.startStream(etUrl.getText().toString()); diff --git a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java index a126819eb..c7f0a0053 100644 --- a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java +++ b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java @@ -70,7 +70,7 @@ protected void onCreate(Bundle savedInstanceState) { etUrl = findViewById(R.id.et_rtp_url); etUrl.setHint(R.string.hint_rtmp); rtmpCamera1 = new RtmpCamera1(surfaceView, this); - rtmpCamera1.setReTries(10); + rtmpCamera1.getStreamClient().setReTries(10); surfaceView.getHolder().addCallback(this); } diff --git a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java index f832ec369..45d11b75a 100644 --- a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java +++ b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java @@ -72,7 +72,7 @@ protected void onCreate(Bundle savedInstanceState) { etUrl = findViewById(R.id.et_rtp_url); etUrl.setHint(R.string.hint_rtsp); rtspCamera1 = new RtspCamera1(surfaceView, this); - rtspCamera1.setReTries(10); + rtspCamera1.getStreamClient().setReTries(10); surfaceView.getHolder().addCallback(this); } diff --git a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java index 913ac45ce..d65bc5396 100644 --- a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java +++ b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java @@ -72,7 +72,7 @@ protected void onCreate(Bundle savedInstanceState) { etUrl = findViewById(R.id.et_rtp_url); etUrl.setHint(R.string.hint_srt); srtCamera1 = new SrtCamera1(surfaceView, this); - srtCamera1.setReTries(10); + srtCamera1.getStreamClient().setReTries(10); surfaceView.getHolder().addCallback(this); } diff --git a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java index 6e13552ab..09d6ac300 100644 --- a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java +++ b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java @@ -72,7 +72,7 @@ protected void onCreate(Bundle savedInstanceState) { etUrl = findViewById(R.id.et_rtp_url); etUrl.setHint(R.string.hint_rtmp); rtmpCamera2 = new RtmpCamera2(surfaceView, this); - rtmpCamera2.setReTries(10); + rtmpCamera2.getStreamClient().setReTries(10); surfaceView.getHolder().addCallback(this); } diff --git a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java index b1af0fef1..8b6b6894d 100644 --- a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java +++ b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java @@ -75,7 +75,7 @@ protected void onCreate(Bundle savedInstanceState) { etUrl = findViewById(R.id.et_rtp_url); etUrl.setHint(R.string.hint_rtsp); rtspCamera2 = new RtspCamera2(surfaceView, this); - rtspCamera2.setReTries(10); + rtspCamera2.getStreamClient().setReTries(10); surfaceView.getHolder().addCallback(this); } diff --git a/library/src/main/java/com/pedro/library/base/Camera1Base.java b/library/src/main/java/com/pedro/library/base/Camera1Base.java index 09b1716e2..21b8e9d93 100644 --- a/library/src/main/java/com/pedro/library/base/Camera1Base.java +++ b/library/src/main/java/com/pedro/library/base/Camera1Base.java @@ -261,14 +261,6 @@ public boolean isAutoFocusEnabled() { return cameraManager.isAutoFocusEnabled(); } - /** - * Basic auth developed to work with Wowza. No tested with other server - * - * @param user auth. - * @param password auth. - */ - public abstract void setAuthorization(String user, String password); - /** * Call this method before use @startStream. If not you will do a stream without video. NOTE: * Rotation with encoder is silence ignored in some devices. @@ -780,53 +772,6 @@ public void stopStream() { } } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = shouldRetry(reason); - if (result) { - requestKeyFrame(); - reConnect(delay, backupUrl); - } - return result; - } - - public boolean reTry(long delay, String reason) { - return reTry(delay, reason, null); - } - - protected abstract boolean shouldRetry(String reason); - - public abstract void setReTries(int reTries); - - protected abstract void reConnect(long delay, @Nullable String backupUrl); - - //cache control - public abstract boolean hasCongestion(); - - public abstract void resizeCache(int newSize) throws RuntimeException; - - public abstract int getCacheSize(); - - public abstract long getSentAudioFrames(); - - public abstract long getSentVideoFrames(); - - public abstract long getDroppedAudioFrames(); - - public abstract long getDroppedVideoFrames(); - - public abstract void resetSentAudioFrames(); - - public abstract void resetSentVideoFrames(); - - public abstract void resetDroppedAudioFrames(); - - public abstract void resetDroppedVideoFrames(); - /** * Get supported preview resolutions of back camera in px. * @@ -1017,10 +962,6 @@ public void setRecordController(BaseRecordController recordController) { if (!isRecording()) this.recordController = recordController; } - public abstract void setLogs(boolean enable); - - public abstract void setCheckServerAlive(boolean enable); - private final GetCameraData getCameraData = frame -> { videoEncoder.inputYUVData(frame); }; diff --git a/library/src/main/java/com/pedro/library/base/Camera2Base.java b/library/src/main/java/com/pedro/library/base/Camera2Base.java index e7ac521e9..4674c0f47 100644 --- a/library/src/main/java/com/pedro/library/base/Camera2Base.java +++ b/library/src/main/java/com/pedro/library/base/Camera2Base.java @@ -301,14 +301,6 @@ public void setFocusDistance(float distance) { cameraManager.setFocusDistance(distance); } - /** - * Basic auth developed to work with Wowza. No tested with other server - * - * @param user auth. - * @param password auth. - */ - public abstract void setAuthorization(String user, String password); - /** * Call this method before use @startStream. If not you will do a stream without video. * @@ -725,53 +717,6 @@ public void stopStream() { } } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = shouldRetry(reason); - if (result) { - requestKeyFrame(); - reConnect(delay, backupUrl); - } - return result; - } - - public boolean reTry(long delay, String reason) { - return reTry(delay, reason, null); - } - - protected abstract boolean shouldRetry(String reason); - - public abstract void setReTries(int reTries); - - protected abstract void reConnect(long delay, @Nullable String backupUrl); - - //cache control - public abstract boolean hasCongestion(); - - public abstract void resizeCache(int newSize) throws RuntimeException; - - public abstract int getCacheSize(); - - public abstract long getSentAudioFrames(); - - public abstract long getSentVideoFrames(); - - public abstract long getDroppedAudioFrames(); - - public abstract long getDroppedVideoFrames(); - - public abstract void resetSentAudioFrames(); - - public abstract void resetSentVideoFrames(); - - public abstract void resetDroppedAudioFrames(); - - public abstract void resetDroppedVideoFrames(); - /** * Get supported preview resolutions of back camera in px. * @@ -1072,10 +1017,6 @@ public void setRecordController(BaseRecordController recordController) { if (!isRecording()) this.recordController = recordController; } - public abstract void setLogs(boolean enable); - - public abstract void setCheckServerAlive(boolean enable); - private final GetMicrophoneData getMicrophoneData = frame -> { audioEncoder.inputPCMData(frame); }; diff --git a/library/src/main/java/com/pedro/library/base/DisplayBase.java b/library/src/main/java/com/pedro/library/base/DisplayBase.java index bcf3ef381..cf6138884 100644 --- a/library/src/main/java/com/pedro/library/base/DisplayBase.java +++ b/library/src/main/java/com/pedro/library/base/DisplayBase.java @@ -147,14 +147,6 @@ public void setFpsListener(FpsListener.Callback callback) { fpsListener.setCallback(callback); } - /** - * Basic auth developed to work with Wowza. No tested with other server - * - * @param user auth. - * @param password auth. - */ - public abstract void setAuthorization(String user, String password); - /** * Call this method before use @startStream. If not you will do a stream without video. * @@ -458,53 +450,6 @@ public void stopStream() { } } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = shouldRetry(reason); - if (result) { - requestKeyFrame(); - reConnect(delay, backupUrl); - } - return result; - } - - public boolean reTry(long delay, String reason) { - return reTry(delay, reason, null); - } - - protected abstract boolean shouldRetry(String reason); - - public abstract void setReTries(int reTries); - - protected abstract void reConnect(long delay, @Nullable String backupUrl); - - //cache control - public abstract boolean hasCongestion(); - - public abstract void resizeCache(int newSize) throws RuntimeException; - - public abstract int getCacheSize(); - - public abstract long getSentAudioFrames(); - - public abstract long getSentVideoFrames(); - - public abstract long getDroppedAudioFrames(); - - public abstract long getDroppedVideoFrames(); - - public abstract void resetSentAudioFrames(); - - public abstract void resetSentVideoFrames(); - - public abstract void resetDroppedAudioFrames(); - - public abstract void resetDroppedVideoFrames(); - public GlInterface getGlInterface() { if (glInterface != null) { return glInterface; @@ -622,10 +567,6 @@ public void setRecordController(BaseRecordController recordController) { if (!isRecording()) this.recordController = recordController; } - public abstract void setLogs(boolean enable); - - public abstract void setCheckServerAlive(boolean enable); - private final GetMicrophoneData getMicrophoneData = frame -> { audioEncoder.inputPCMData(frame); }; diff --git a/library/src/main/java/com/pedro/library/base/FromFileBase.java b/library/src/main/java/com/pedro/library/base/FromFileBase.java index 49aa6a6bf..0e88535da 100644 --- a/library/src/main/java/com/pedro/library/base/FromFileBase.java +++ b/library/src/main/java/com/pedro/library/base/FromFileBase.java @@ -128,14 +128,6 @@ public void setFpsListener(FpsListener.Callback callback) { fpsListener.setCallback(callback); } - /** - * Basic auth developed to work with Wowza. No tested with other server - * - * @param user auth. - * @param password auth. - */ - public abstract void setAuthorization(String user, String password); - /** * @param filePath to video MP4 file. * @param bitRate H264 in bps. @@ -421,53 +413,6 @@ public void requestKeyFrame() { protected abstract void stopStreamRtp(); - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = shouldRetry(reason); - if (result) { - requestKeyFrame(); - reConnect(delay, backupUrl); - } - return result; - } - - public boolean reTry(long delay, String reason) { - return reTry(delay, reason, null); - } - - protected abstract boolean shouldRetry(String reason); - - public abstract void setReTries(int reTries); - - protected abstract void reConnect(long delay, @Nullable String backupUrl); - - //cache control - public abstract boolean hasCongestion(); - - public abstract void resizeCache(int newSize) throws RuntimeException; - - public abstract int getCacheSize(); - - public abstract long getSentAudioFrames(); - - public abstract long getSentVideoFrames(); - - public abstract long getDroppedAudioFrames(); - - public abstract long getDroppedVideoFrames(); - - public abstract void resetSentAudioFrames(); - - public abstract void resetSentVideoFrames(); - - public abstract void resetDroppedAudioFrames(); - - public abstract void resetDroppedVideoFrames(); - /** * Stop stream started with @startStream. */ @@ -632,10 +577,6 @@ public void setRecordController(BaseRecordController recordController) { if (!isRecording()) this.recordController = recordController; } - public abstract void setLogs(boolean enable); - - public abstract void setCheckServerAlive(boolean enable); - private final GetMicrophoneData getMicrophoneData = frame -> { if (audioTrackPlayer != null) { audioTrackPlayer.write(frame.getBuffer(), frame.getOffset(), frame.getSize()); diff --git a/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java b/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java index ab6ad259e..14f006ed4 100644 --- a/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java +++ b/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java @@ -102,14 +102,6 @@ public void setCustomAudioEffect(CustomAudioEffect customAudioEffect) { microphoneManager.setCustomAudioEffect(customAudioEffect); } - /** - * Basic auth developed to work with Wowza. No tested with other server - * - * @param user auth. - * @param password auth. - */ - public abstract void setAuthorization(String user, String password); - protected abstract void prepareAudioRtp(boolean isStereo, int sampleRate); /** @@ -267,52 +259,6 @@ public RecordController.Status getRecordStatus() { return recordController.getStatus(); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = shouldRetry(reason); - if (result) { - reConnect(delay, backupUrl); - } - return result; - } - - public boolean reTry(long delay, String reason) { - return reTry(delay, reason, null); - } - - protected abstract boolean shouldRetry(String reason); - - public abstract void setReTries(int reTries); - - protected abstract void reConnect(long delay, @Nullable String backupUrl); - - //cache control - public abstract boolean hasCongestion(); - - public abstract void resizeCache(int newSize) throws RuntimeException; - - public abstract int getCacheSize(); - - public abstract long getSentAudioFrames(); - - public abstract long getSentVideoFrames(); - - public abstract long getDroppedAudioFrames(); - - public abstract long getDroppedVideoFrames(); - - public abstract void resetSentAudioFrames(); - - public abstract void resetSentVideoFrames(); - - public abstract void resetDroppedAudioFrames(); - - public abstract void resetDroppedVideoFrames(); - /** * Set a custom size of audio buffer input. * If you set 0 or less you can disable it to use library default value. @@ -362,10 +308,6 @@ public void setRecordController(BaseRecordController recordController) { if (!isRecording()) this.recordController = recordController; } - public abstract void setLogs(boolean enable); - - public abstract void setCheckServerAlive(boolean enable); - private final GetMicrophoneData getMicrophoneData = frame -> { audioEncoder.inputPCMData(frame); }; diff --git a/library/src/main/java/com/pedro/library/base/StreamBase.kt b/library/src/main/java/com/pedro/library/base/StreamBase.kt index e238ca64e..180d0c884 100644 --- a/library/src/main/java/com/pedro/library/base/StreamBase.kt +++ b/library/src/main/java/com/pedro/library/base/StreamBase.kt @@ -112,9 +112,14 @@ abstract class StreamBase( isStreaming = true rtpStartStream(endPoint) if (!isRecording) startSources() - else videoEncoder.requestKeyframe() + else requestKeyframe() } + fun requestKeyframe() { + if (videoEncoder.isRunning) { + videoEncoder.requestKeyframe() + } + } /** * Stop stream. * @@ -141,7 +146,7 @@ abstract class StreamBase( fun startRecord(path: String, listener: RecordController.Listener) { recordController.startRecord(path, listener) if (!isStreaming) startSources() - else videoEncoder.requestKeyframe() + else requestKeyframe() } /** @@ -443,21 +448,6 @@ abstract class StreamBase( glInterface.setCameraOrientation(orientation) } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - @JvmOverloads - fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { - val result = shouldRetry(reason) - if (result) { - videoEncoder.requestKeyframe() - reConnect(delay, backupUrl) - } - return result - } - /** * Get glInterface used to render video. * This is useful to send filters to stream. @@ -549,25 +539,7 @@ abstract class StreamBase( protected abstract fun audioInfo(sampleRate: Int, isStereo: Boolean) protected abstract fun rtpStartStream(endPoint: String) protected abstract fun rtpStopStream() - protected abstract fun setAuthorization(user: String?, password: String?) protected abstract fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer, vps: ByteBuffer?) protected abstract fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) protected abstract fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) - protected abstract fun shouldRetry(reason: String): Boolean - protected abstract fun reConnect(delay: Long, backupUrl: String?) - abstract fun setReTries(reTries: Int) - abstract fun hasCongestion(): Boolean - abstract fun setLogs(enabled: Boolean) - abstract fun setCheckServerAlive(enabled: Boolean) - @Throws(RuntimeException::class) - abstract fun resizeCache(newSize: Int) - abstract fun getCacheSize(): Int - abstract fun getSentAudioFrames(): Long - abstract fun getSentVideoFrames(): Long - abstract fun getDroppedAudioFrames(): Long - abstract fun getDroppedVideoFrames(): Long - abstract fun resetSentAudioFrames() - abstract fun resetSentVideoFrames() - abstract fun resetDroppedAudioFrames() - abstract fun resetDroppedVideoFrames() } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera1.java b/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera1.java index fa8cbbd60..b127054dd 100644 --- a/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera1.java +++ b/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera1.java @@ -179,7 +179,6 @@ public void resizeCache(RtpType rtpType, int index, int newSize) { } } - @Override public void resizeCache(int newSize) throws RuntimeException { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resizeCache(newSize); @@ -197,12 +196,6 @@ public int getCacheSize(RtpType rtpType, int index) { } } - @Override - public int getCacheSize() { - return 0; - } - - @Override public long getSentAudioFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -214,7 +207,6 @@ public long getSentAudioFrames() { return number; } - @Override public long getSentVideoFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -226,7 +218,6 @@ public long getSentVideoFrames() { return number; } - @Override public long getDroppedAudioFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -238,7 +229,6 @@ public long getDroppedAudioFrames() { return number; } - @Override public long getDroppedVideoFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -250,7 +240,6 @@ public long getDroppedVideoFrames() { return number; } - @Override public void resetSentAudioFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetSentAudioFrames(); @@ -260,7 +249,6 @@ public void resetSentAudioFrames() { } } - @Override public void resetSentVideoFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetSentVideoFrames(); @@ -270,7 +258,6 @@ public void resetSentVideoFrames() { } } - @Override public void resetDroppedAudioFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetDroppedAudioFrames(); @@ -280,7 +267,6 @@ public void resetDroppedAudioFrames() { } } - @Override public void resetDroppedVideoFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetDroppedVideoFrames(); @@ -298,7 +284,6 @@ public void setAuthorization(RtpType rtpType, int index, String user, String pas } } - @Override public void setAuthorization(String user, String password) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setAuthorization(user, password); @@ -393,7 +378,6 @@ public void stopStream(RtpType rtpType, int index) { protected void stopStreamRtp() { } - @Override public void setReTries(int reTries) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setReTries(reTries); @@ -421,16 +405,6 @@ public boolean reTry(RtpType rtpType, int index, long delay, String reason, @Nul return result; } - @Override - protected boolean shouldRetry(String reason) { - return false; - } - - @Override - protected void reConnect(long delay, @Nullable String backupUrl) { - - } - public boolean hasCongestion(RtpType rtpType, int index) { if (rtpType == RtpType.RTMP) { return rtmpClients[index].hasCongestion(); @@ -439,11 +413,6 @@ public boolean hasCongestion(RtpType rtpType, int index) { } } - @Override - public boolean hasCongestion() { - return false; - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { for (RtmpClient rtmpClient: rtmpClients) { @@ -474,7 +443,6 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) } } - @Override public void setLogs(boolean enable) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setLogs(enable); @@ -484,7 +452,6 @@ public void setLogs(boolean enable) { } } - @Override public void setCheckServerAlive(boolean enable) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setCheckServerAlive(enable); diff --git a/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera2.java b/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera2.java index 954d74a8f..9f231ec4e 100644 --- a/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera2.java +++ b/library/src/main/java/com/pedro/library/multiple/MultiRtpCamera2.java @@ -179,7 +179,6 @@ public void resizeCache(RtpType rtpType, int index, int newSize) { } } - @Override public void resizeCache(int newSize) throws RuntimeException { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resizeCache(newSize); @@ -197,12 +196,6 @@ public int getCacheSize(RtpType rtpType, int index) { } } - @Override - public int getCacheSize() { - return 0; - } - - @Override public long getSentAudioFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -214,7 +207,6 @@ public long getSentAudioFrames() { return number; } - @Override public long getSentVideoFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -226,7 +218,6 @@ public long getSentVideoFrames() { return number; } - @Override public long getDroppedAudioFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -238,7 +229,6 @@ public long getDroppedAudioFrames() { return number; } - @Override public long getDroppedVideoFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -250,7 +240,6 @@ public long getDroppedVideoFrames() { return number; } - @Override public void resetSentAudioFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetSentAudioFrames(); @@ -260,7 +249,6 @@ public void resetSentAudioFrames() { } } - @Override public void resetSentVideoFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetSentVideoFrames(); @@ -270,7 +258,6 @@ public void resetSentVideoFrames() { } } - @Override public void resetDroppedAudioFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetDroppedAudioFrames(); @@ -280,7 +267,6 @@ public void resetDroppedAudioFrames() { } } - @Override public void resetDroppedVideoFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetDroppedVideoFrames(); @@ -298,7 +284,6 @@ public void setAuthorization(RtpType rtpType, int index, String user, String pas } } - @Override public void setAuthorization(String user, String password) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setAuthorization(user, password); @@ -393,7 +378,6 @@ public void stopStream(RtpType rtpType, int index) { protected void stopStreamRtp() { } - @Override public void setReTries(int reTries) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setReTries(reTries); @@ -421,16 +405,6 @@ public boolean reTry(RtpType rtpType, int index, long delay, String reason, @Nul return result; } - @Override - protected boolean shouldRetry(String reason) { - return false; - } - - @Override - protected void reConnect(long delay, @Nullable String backupUrl) { - - } - public boolean hasCongestion(RtpType rtpType, int index) { if (rtpType == RtpType.RTMP) { return rtmpClients[index].hasCongestion(); @@ -439,11 +413,6 @@ public boolean hasCongestion(RtpType rtpType, int index) { } } - @Override - public boolean hasCongestion() { - return false; - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { for (RtmpClient rtmpClient: rtmpClients) { @@ -474,7 +443,6 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) } } - @Override public void setLogs(boolean enable) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setLogs(enable); @@ -484,7 +452,6 @@ public void setLogs(boolean enable) { } } - @Override public void setCheckServerAlive(boolean enable) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setCheckServerAlive(enable); diff --git a/library/src/main/java/com/pedro/library/multiple/MultiRtpDisplay.java b/library/src/main/java/com/pedro/library/multiple/MultiRtpDisplay.java index 4405d0ee2..f22f22272 100644 --- a/library/src/main/java/com/pedro/library/multiple/MultiRtpDisplay.java +++ b/library/src/main/java/com/pedro/library/multiple/MultiRtpDisplay.java @@ -126,7 +126,6 @@ public void setAuthorization(RtpType rtpType, int index, String user, String pas } } - @Override public void setAuthorization(String user, String password) { for (RtmpClient rtmpClient : rtmpClients) { rtmpClient.setAuthorization(user, password); @@ -226,12 +225,6 @@ public boolean reTry(RtpType rtpType, int index, long delay, String reason, @Nul return result; } - @Override - protected boolean shouldRetry(String reason) { - return false; - } - - @Override public void setReTries(int reTries) { for (RtmpClient rtmpClient : rtmpClients) { rtmpClient.setReTries(reTries); @@ -241,10 +234,6 @@ public void setReTries(int reTries) { } } - @Override - protected void reConnect(long delay, @Nullable String backupUrl) { - - } public boolean hasCongestion(RtpType rtpType, int index) { if (rtpType == RtpType.RTMP) { @@ -254,11 +243,6 @@ public boolean hasCongestion(RtpType rtpType, int index) { } } - @Override - public boolean hasCongestion() { - return false; - } - public void resizeCache(RtpType rtpType, int index, int newSize) { if (rtpType == RtpType.RTMP) { rtmpClients[index].resizeCache(newSize); @@ -267,11 +251,6 @@ public void resizeCache(RtpType rtpType, int index, int newSize) { } } - @Override - public void resizeCache(int newSize) throws RuntimeException { - - } - public int getCacheSize(RtpType rtpType, int index) { if (rtpType == RtpType.RTMP) { return rtmpClients[index].getCacheSize(); @@ -280,12 +259,6 @@ public int getCacheSize(RtpType rtpType, int index) { } } - @Override - public int getCacheSize() { - return 0; - } - - @Override public long getSentAudioFrames() { long number = 0; for (RtmpClient rtmpClient : rtmpClients) { @@ -297,7 +270,6 @@ public long getSentAudioFrames() { return number; } - @Override public long getSentVideoFrames() { long number = 0; for (RtmpClient rtmpClient : rtmpClients) { @@ -309,7 +281,6 @@ public long getSentVideoFrames() { return number; } - @Override public long getDroppedAudioFrames() { long number = 0; for (RtmpClient rtmpClient : rtmpClients) { @@ -321,7 +292,6 @@ public long getDroppedAudioFrames() { return number; } - @Override public long getDroppedVideoFrames() { long number = 0; for (RtmpClient rtmpClient : rtmpClients) { @@ -333,7 +303,6 @@ public long getDroppedVideoFrames() { return number; } - @Override public void resetSentAudioFrames() { for (RtmpClient rtmpClient : rtmpClients) { rtmpClient.resetSentAudioFrames(); @@ -343,7 +312,6 @@ public void resetSentAudioFrames() { } } - @Override public void resetSentVideoFrames() { for (RtmpClient rtmpClient : rtmpClients) { rtmpClient.resetSentVideoFrames(); @@ -353,7 +321,6 @@ public void resetSentVideoFrames() { } } - @Override public void resetDroppedAudioFrames() { for (RtmpClient rtmpClient : rtmpClients) { rtmpClient.resetDroppedAudioFrames(); @@ -363,7 +330,6 @@ public void resetDroppedAudioFrames() { } } - @Override public void resetDroppedVideoFrames() { for (RtmpClient rtmpClient : rtmpClients) { rtmpClient.resetDroppedVideoFrames(); @@ -403,7 +369,6 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) } } - @Override public void setLogs(boolean enable) { for (RtmpClient rtmpClient : rtmpClients) { rtmpClient.setLogs(enable); @@ -413,7 +378,6 @@ public void setLogs(boolean enable) { } } - @Override public void setCheckServerAlive(boolean enable) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setCheckServerAlive(enable); diff --git a/library/src/main/java/com/pedro/library/multiple/MultiRtpOnlyAudio.java b/library/src/main/java/com/pedro/library/multiple/MultiRtpOnlyAudio.java index 1e3311db6..3b1c7d25b 100644 --- a/library/src/main/java/com/pedro/library/multiple/MultiRtpOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/multiple/MultiRtpOnlyAudio.java @@ -109,7 +109,6 @@ public void resizeCache(RtpType rtpType, int index, int newSize) { } } - @Override public void resizeCache(int newSize) throws RuntimeException { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resizeCache(newSize); @@ -127,12 +126,6 @@ public int getCacheSize(RtpType rtpType, int index) { } } - @Override - public int getCacheSize() { - return 0; - } - - @Override public long getSentAudioFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -144,7 +137,6 @@ public long getSentAudioFrames() { return number; } - @Override public long getSentVideoFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -156,7 +148,6 @@ public long getSentVideoFrames() { return number; } - @Override public long getDroppedAudioFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -168,7 +159,6 @@ public long getDroppedAudioFrames() { return number; } - @Override public long getDroppedVideoFrames() { long number = 0; for (RtmpClient rtmpClient: rtmpClients) { @@ -180,7 +170,6 @@ public long getDroppedVideoFrames() { return number; } - @Override public void resetSentAudioFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetSentAudioFrames(); @@ -190,7 +179,6 @@ public void resetSentAudioFrames() { } } - @Override public void resetSentVideoFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetSentVideoFrames(); @@ -200,7 +188,6 @@ public void resetSentVideoFrames() { } } - @Override public void resetDroppedAudioFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetDroppedAudioFrames(); @@ -210,7 +197,6 @@ public void resetDroppedAudioFrames() { } } - @Override public void resetDroppedVideoFrames() { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.resetDroppedVideoFrames(); @@ -228,7 +214,6 @@ public void setAuthorization(RtpType rtpType, int index, String user, String pas } } - @Override public void setAuthorization(String user, String password) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setAuthorization(user, password); @@ -317,7 +302,6 @@ public void stopStream(RtpType rtpType, int index) { protected void stopStreamRtp() { } - @Override public void setReTries(int reTries) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setReTries(reTries); @@ -343,16 +327,6 @@ public boolean reTry(RtpType rtpType, int index, long delay, String reason, @Nul return result; } - @Override - protected boolean shouldRetry(String reason) { - return false; - } - - @Override - protected void reConnect(long delay, @Nullable String backupUrl) { - - } - public boolean hasCongestion(RtpType rtpType, int index) { if (rtpType == RtpType.RTMP) { return rtmpClients[index].hasCongestion(); @@ -361,11 +335,6 @@ public boolean hasCongestion(RtpType rtpType, int index) { } } - @Override - public boolean hasCongestion() { - return false; - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { for (RtmpClient rtmpClient: rtmpClients) { @@ -376,7 +345,6 @@ protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { } } - @Override public void setLogs(boolean enable) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setLogs(enable); @@ -386,7 +354,6 @@ public void setLogs(boolean enable) { } } - @Override public void setCheckServerAlive(boolean enable) { for (RtmpClient rtmpClient: rtmpClients) { rtmpClient.setCheckServerAlive(enable); diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java index ed207861d..e5ee699ee 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java @@ -27,6 +27,8 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera1Base; +import com.pedro.library.util.client.RtmpStreamClient; +import com.pedro.library.util.client.SrtStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.rtmp.flv.video.ProfileIop; @@ -46,42 +48,43 @@ public class RtmpCamera1 extends Camera1Base { private final RtmpClient rtmpClient; + private final RtmpStreamClient streamClient; public RtmpCamera1(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { super(surfaceView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } public RtmpCamera1(TextureView textureView, ConnectCheckerRtmp connectChecker) { super(textureView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { super(openGlView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { super(lightOpenGlView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(Context context, ConnectCheckerRtmp connectChecker) { super(context); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } - /** - * H264 profile. - * - * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED - */ - public void setProfileIop(ProfileIop profileIop) { - rtmpClient.setProfileIop(profileIop); + public RtmpStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -91,88 +94,6 @@ public void setVideoCodec(VideoCodec videoCodec) { rtmpClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtmpClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtmpClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtmpClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtmpClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtmpClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtmpClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtmpClient.setAuthorization(user, password); - } - - /** - * Some Livestream hosts use Akamai auth that requires RTMP packets to be sent with increasing - * timestamp order regardless of packet type. - * Necessary with Servers like Dacast. - * More info here: - * https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-encoder-compatibility-testing-and-qualification-guide-v4.0/GUID-F941C88B-9128-4BF4-A81B-C2E5CFD35BBF.html - */ - public void forceAkamaiTs(boolean enabled) { - rtmpClient.forceAkamaiTs(enabled); - } - - /** - * Must be called before start stream. - * - * Default value 128 - * Range value: 1 to 16777215. - * - * The most common values example: 128, 4096, 65535 - * - * @param chunkSize packet's chunk size send to server - */ - public void setWriteChunkSize(int chunkSize) { - if (!isStreaming()) { - rtmpClient.setWriteChunkSize(chunkSize); - } - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtmpClient.setAudioInfo(sampleRate, isStereo); @@ -195,26 +116,6 @@ protected void stopStreamRtp() { rtmpClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtmpClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtmpClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtmpClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtmpClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); @@ -230,13 +131,17 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtmpClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - rtmpClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtmpClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java index 8bcaf570b..cd535b40e 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java @@ -27,6 +27,7 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera2Base; +import com.pedro.library.util.client.RtmpStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.rtmp.flv.video.ProfileIop; @@ -46,6 +47,7 @@ public class RtmpCamera2 extends Camera2Base { private final RtmpClient rtmpClient; + private final RtmpStreamClient streamClient; /** * @deprecated This view produce rotations problems and could be unsupported in future versions. @@ -56,6 +58,7 @@ public class RtmpCamera2 extends Camera2Base { public RtmpCamera2(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { super(surfaceView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } /** @@ -67,30 +70,29 @@ public RtmpCamera2(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { public RtmpCamera2(TextureView textureView, ConnectCheckerRtmp connectChecker) { super(textureView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } public RtmpCamera2(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { super(openGlView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } public RtmpCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { super(lightOpenGlView); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } public RtmpCamera2(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { super(context, useOpengl); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } - /** - * H264 profile. - * - * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED - */ - public void setProfileIop(ProfileIop profileIop) { - rtmpClient.setProfileIop(profileIop); + public RtmpStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -100,88 +102,6 @@ public void setVideoCodec(VideoCodec videoCodec) { rtmpClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtmpClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtmpClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtmpClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtmpClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtmpClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtmpClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtmpClient.setAuthorization(user, password); - } - - /** - * Some Livestream hosts use Akamai auth that requires RTMP packets to be sent with increasing - * timestamp order regardless of packet type. - * Necessary with Servers like Dacast. - * More info here: - * https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-encoder-compatibility-testing-and-qualification-guide-v4.0/GUID-F941C88B-9128-4BF4-A81B-C2E5CFD35BBF.html - */ - public void forceAkamaiTs(boolean enabled) { - rtmpClient.forceAkamaiTs(enabled); - } - - /** - * Must be called before start stream. - * - * Default value 128 - * Range value: 1 to 16777215. - * - * The most common values example: 128, 4096, 65535 - * - * @param chunkSize packet's chunk size send to server - */ - public void setWriteChunkSize(int chunkSize) { - if (!isStreaming()) { - rtmpClient.setWriteChunkSize(chunkSize); - } - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtmpClient.setAudioInfo(sampleRate, isStereo); @@ -204,26 +124,6 @@ protected void stopStreamRtp() { rtmpClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtmpClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtmpClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtmpClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtmpClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); @@ -239,14 +139,18 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtmpClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - rtmpClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtmpClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java index fcb67fdc9..412767907 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java @@ -25,6 +25,8 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.DisplayBase; +import com.pedro.library.util.client.RtmpStreamClient; +import com.pedro.library.util.client.StreamBaseClient; import com.pedro.rtmp.flv.video.ProfileIop; import com.pedro.rtmp.rtmp.RtmpClient; import com.pedro.rtmp.rtmp.VideoCodec; @@ -42,19 +44,16 @@ public class RtmpDisplay extends DisplayBase { private final RtmpClient rtmpClient; + private final RtmpStreamClient streamClient; public RtmpDisplay(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { super(context, useOpengl); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } - /** - * H264 profile. - * - * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED - */ - public void setProfileIop(ProfileIop profileIop) { - rtmpClient.setProfileIop(profileIop); + public RtmpStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -64,88 +63,6 @@ public void setVideoCodec(VideoCodec videoCodec) { rtmpClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtmpClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtmpClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtmpClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtmpClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtmpClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtmpClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtmpClient.setAuthorization(user, password); - } - - /** - * Some Livestream hosts use Akamai auth that requires RTMP packets to be sent with increasing - * timestamp order regardless of packet type. - * Necessary with Servers like Dacast. - * More info here: - * https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-encoder-compatibility-testing-and-qualification-guide-v4.0/GUID-F941C88B-9128-4BF4-A81B-C2E5CFD35BBF.html - */ - public void forceAkamaiTs(boolean enabled) { - rtmpClient.forceAkamaiTs(enabled); - } - - /** - * Must be called before start stream. - * - * Default value 128 - * Range value: 1 to 16777215. - * - * The most common values example: 128, 4096, 65535 - * - * @param chunkSize packet's chunk size send to server - */ - public void setWriteChunkSize(int chunkSize) { - if (!isStreaming()) { - rtmpClient.setWriteChunkSize(chunkSize); - } - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtmpClient.setAudioInfo(sampleRate, isStereo); @@ -167,26 +84,6 @@ protected void stopStreamRtp() { rtmpClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtmpClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtmpClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtmpClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtmpClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); @@ -202,13 +99,18 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtmpClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - rtmpClient.setLogs(enable); - } - @Override - public void setCheckServerAlive(boolean enable) { - rtmpClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java index 36e5b6e4e..e72aa8cb8 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java @@ -27,6 +27,7 @@ import com.pedro.encoder.input.decoder.VideoDecoderInterface; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.FromFileBase; +import com.pedro.library.util.client.RtmpStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.rtmp.flv.video.ProfileIop; @@ -46,38 +47,38 @@ public class RtmpFromFile extends FromFileBase { private final RtmpClient rtmpClient; + private final RtmpStreamClient streamClient; public RtmpFromFile(ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } public RtmpFromFile(Context context, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } public RtmpFromFile(OpenGlView openGlView, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } public RtmpFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); + streamClient = new RtmpStreamClient(rtmpClient); } - /** - * H264 profile. - * - * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED - */ - public void setProfileIop(ProfileIop profileIop) { - rtmpClient.setProfileIop(profileIop); + public RtmpStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -87,88 +88,6 @@ public void setVideoCodec(VideoCodec videoCodec) { rtmpClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtmpClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtmpClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtmpClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtmpClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtmpClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtmpClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtmpClient.setAuthorization(user, password); - } - - /** - * Some Livestream hosts use Akamai auth that requires RTMP packets to be sent with increasing - * timestamp order regardless of packet type. - * Necessary with Servers like Dacast. - * More info here: - * https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-encoder-compatibility-testing-and-qualification-guide-v4.0/GUID-F941C88B-9128-4BF4-A81B-C2E5CFD35BBF.html - */ - public void forceAkamaiTs(boolean enabled) { - rtmpClient.forceAkamaiTs(enabled); - } - - /** - * Must be called before start stream. - * - * Default value 128 - * Range value: 1 to 16777215. - * - * The most common values example: 128, 4096, 65535 - * - * @param chunkSize packet's chunk size send to server - */ - public void setWriteChunkSize(int chunkSize) { - if (!isStreaming()) { - rtmpClient.setWriteChunkSize(chunkSize); - } - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtmpClient.setAudioInfo(sampleRate, isStereo); @@ -190,26 +109,6 @@ protected void stopStreamRtp() { rtmpClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtmpClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtmpClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtmpClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtmpClient.hasCongestion(); - } - @Override protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { rtmpClient.setVideoInfo(sps, pps, vps); @@ -225,13 +124,17 @@ protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); } - @Override - public void setLogs(boolean enable) { - rtmpClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtmpClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java index 1978bdb40..2cda2aea6 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java @@ -21,6 +21,7 @@ import androidx.annotation.Nullable; import com.pedro.library.base.OnlyAudioBase; +import com.pedro.library.util.client.RtmpStreamClient; import com.pedro.rtmp.rtmp.RtmpClient; import com.pedro.rtmp.utils.ConnectCheckerRtmp; @@ -35,93 +36,17 @@ public class RtmpOnlyAudio extends OnlyAudioBase { private final RtmpClient rtmpClient; + private final RtmpStreamClient streamClient; public RtmpOnlyAudio(ConnectCheckerRtmp connectChecker) { super(); rtmpClient = new RtmpClient(connectChecker); rtmpClient.setOnlyAudio(true); + streamClient = new RtmpStreamClient(rtmpClient); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtmpClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtmpClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtmpClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtmpClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtmpClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtmpClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtmpClient.setAuthorization(user, password); - } - - /** - * Some Livestream hosts use Akamai auth that requires RTMP packets to be sent with increasing - * timestamp order regardless of packet type. - * Necessary with Servers like Dacast. - * More info here: - * https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-encoder-compatibility-testing-and-qualification-guide-v4.0/GUID-F941C88B-9128-4BF4-A81B-C2E5CFD35BBF.html - */ - public void forceAkamaiTs(boolean enabled) { - rtmpClient.forceAkamaiTs(enabled); - } - - /** - * Must be called before start stream. - * - * Default value 128 - * Range value: 1 to 16777215. - * - * The most common values example: 128, 4096, 65535 - * - * @param chunkSize packet's chunk size send to server - */ - public void setWriteChunkSize(int chunkSize) { - if (!isStreaming()) { - rtmpClient.setWriteChunkSize(chunkSize); - } + public RtmpStreamClient getStreamClient() { + return streamClient; } @Override @@ -139,38 +64,21 @@ protected void stopStreamRtp() { rtmpClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtmpClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtmpClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtmpClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtmpClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); } - @Override - public void setLogs(boolean enable) { - rtmpClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtmpClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt index 2d44f44ec..6754cbfc1 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt @@ -6,6 +6,8 @@ import android.os.Build import androidx.annotation.RequiresApi import com.pedro.encoder.utils.CodecUtil import com.pedro.library.base.StreamBase +import com.pedro.library.util.client.RtmpStreamClient +import com.pedro.library.util.client.RtspStreamClient import com.pedro.library.util.sources.AudioManager import com.pedro.library.util.sources.VideoManager import com.pedro.rtmp.flv.video.ProfileIop @@ -25,19 +27,11 @@ import java.nio.ByteBuffer class RtmpStream(context: Context, connectCheckerRtmp: ConnectCheckerRtmp, videoSource: VideoManager.Source, audioSource: AudioManager.Source): StreamBase(context, videoSource, audioSource) { - constructor(context: Context, connectCheckerRtmp: ConnectCheckerRtmp): - this(context, connectCheckerRtmp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) - private val rtmpClient = RtmpClient(connectCheckerRtmp) + val streamClient = RtmpStreamClient(rtmpClient) - /** - * H264 profile. - * - * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED - */ - fun setProfileIop(profileIop: ProfileIop?) { - rtmpClient.setProfileIop(profileIop!!) - } + constructor(context: Context, connectCheckerRtmp: ConnectCheckerRtmp): + this(context, connectCheckerRtmp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) fun setVideoCodec(videoCodec: VideoCodec) { val mime = if (videoCodec === VideoCodec.H265) CodecUtil.H265_MIME else CodecUtil.H264_MIME @@ -45,33 +39,6 @@ class RtmpStream(context: Context, connectCheckerRtmp: ConnectCheckerRtmp, video rtmpClient.setVideoCodec(videoCodec) } - /** - * Some Livestream hosts use Akamai auth that requires RTMP packets to be sent with increasing - * timestamp order regardless of packet type. - * Necessary with Servers like Dacast. - * More info here: - * https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-encoder-compatibility-testing-and-qualification-guide-v4.0/GUID-F941C88B-9128-4BF4-A81B-C2E5CFD35BBF.html - */ - fun forceAkamaiTs(enabled: Boolean) { - rtmpClient.forceAkamaiTs(enabled) - } - - /** - * Must be called before start stream. - * - * Default value 128 - * Range value: 1 to 16777215. - * - * The most common values example: 128, 4096, 65535 - * - * @param chunkSize packet's chunk size send to server - */ - fun setWriteChunkSize(chunkSize: Int) { - if (!isStreaming) { - rtmpClient.setWriteChunkSize(chunkSize) - } - } - override fun audioInfo(sampleRate: Int, isStereo: Boolean) { rtmpClient.setAudioInfo(sampleRate, isStereo) } @@ -87,10 +54,6 @@ class RtmpStream(context: Context, connectCheckerRtmp: ConnectCheckerRtmp, video rtmpClient.disconnect() } - override fun setAuthorization(user: String?, password: String?) { - rtmpClient.setAuthorization(user, password) - } - override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer, vps: ByteBuffer?) { rtmpClient.setVideoInfo(sps, pps, vps) } @@ -103,53 +66,18 @@ class RtmpStream(context: Context, connectCheckerRtmp: ConnectCheckerRtmp, video rtmpClient.sendAudio(aacBuffer, info) } - override fun setReTries(reTries: Int) { - rtmpClient.setReTries(reTries) - } - - override fun shouldRetry(reason: String): Boolean = rtmpClient.shouldRetry(reason) - - override fun reConnect(delay: Long, backupUrl: String?) { - rtmpClient.reConnect(delay, backupUrl) - } - - override fun hasCongestion(): Boolean = rtmpClient.hasCongestion() - - override fun setLogs(enabled: Boolean) { - rtmpClient.setLogs(enabled) - } - - override fun setCheckServerAlive(enabled: Boolean) { - rtmpClient.setCheckServerAlive(enabled) - } - - override fun resizeCache(newSize: Int) { - rtmpClient.resizeCache(newSize) - } - - override fun getCacheSize(): Int = rtmpClient.cacheSize - - override fun getSentAudioFrames(): Long = rtmpClient.sentAudioFrames - - override fun getSentVideoFrames(): Long = rtmpClient.sentVideoFrames - - override fun getDroppedAudioFrames(): Long = rtmpClient.droppedAudioFrames - - override fun getDroppedVideoFrames(): Long = rtmpClient.droppedVideoFrames - - override fun resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames() - } - - override fun resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames() - } - - override fun resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames() - } - - override fun resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames() + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + @JvmOverloads + fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { + val result = streamClient.shouldRetry(reason) + if (result) { + requestKeyframe() + streamClient.reConnect(delay, backupUrl) + } + return result } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java index af1fdaeaa..ae6a3bcf3 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java @@ -27,6 +27,8 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera1Base; +import com.pedro.library.util.client.RtmpStreamClient; +import com.pedro.library.util.client.RtspStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.rtsp.rtsp.Protocol; @@ -46,93 +48,45 @@ public class RtspCamera1 extends Camera1Base { private final RtspClient rtspClient; + private final RtspStreamClient streamClient; public RtspCamera1(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { super(surfaceView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } public RtspCamera1(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { super(textureView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(openGlView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(lightOpenGlView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(Context context, ConnectCheckerRtsp connectCheckerRtsp) { super(context); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } - /** - * Internet protocol used. - * - * @param protocol Could be Protocol.TCP or Protocol.UDP. - */ - public void setProtocol(Protocol protocol) { - rtspClient.setProtocol(protocol); - } - - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtspClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtspClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtspClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtspClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtspClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtspClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtspClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtspClient.resetSentVideoFrames(); + public RtspStreamClient getStreamClient() { + return streamClient; } - @Override - public void resetDroppedAudioFrames() { - rtspClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtspClient.resetDroppedVideoFrames(); - } public void setVideoCodec(VideoCodec videoCodec) { recordController.setVideoMime( @@ -140,11 +94,6 @@ public void setVideoCodec(VideoCodec videoCodec) { videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); } - @Override - public void setAuthorization(String user, String password) { - rtspClient.setAuthorization(user, password); - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtspClient.setAudioInfo(sampleRate, isStereo); @@ -161,26 +110,6 @@ protected void stopStreamRtp() { rtspClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtspClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtspClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtspClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtspClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); @@ -196,13 +125,17 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtspClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - rtspClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtspClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java index 19859ff73..388666aa1 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java @@ -27,6 +27,7 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera2Base; +import com.pedro.library.util.client.RtspStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.rtsp.rtsp.Protocol; @@ -46,6 +47,7 @@ public class RtspCamera2 extends Camera2Base { private final RtspClient rtspClient; + private final RtspStreamClient streamClient; /** * @deprecated This view produce rotations problems and could be unsupported in future versions. @@ -56,6 +58,7 @@ public class RtspCamera2 extends Camera2Base { public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { super(surfaceView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } /** @@ -67,80 +70,29 @@ public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRts public RtspCamera2(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { super(textureView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } public RtspCamera2(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(openGlView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } public RtspCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(lightOpenGlView); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } public RtspCamera2(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { super(context, useOpengl); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } - /** - * Internet protocol used. - * - * @param protocol Could be Protocol.TCP or Protocol.UDP. - */ - public void setProtocol(Protocol protocol) { - rtspClient.setProtocol(protocol); - } - - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtspClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtspClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtspClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtspClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtspClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtspClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtspClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtspClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtspClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtspClient.resetDroppedVideoFrames(); + public RtspStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -149,11 +101,6 @@ public void setVideoCodec(VideoCodec videoCodec) { videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); } - @Override - public void setAuthorization(String user, String password) { - rtspClient.setAuthorization(user, password); - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtspClient.setAudioInfo(sampleRate, isStereo); @@ -170,26 +117,6 @@ protected void stopStreamRtp() { rtspClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtspClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtspClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtspClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtspClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); @@ -205,14 +132,19 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtspClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - rtspClient.setLogs(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } - @Override - public void setCheckServerAlive(boolean enable) { - rtspClient.setCheckServerAlive(enable); - } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java index 5534e349b..81b5466d9 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java @@ -25,6 +25,7 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.DisplayBase; +import com.pedro.library.util.client.RtspStreamClient; import com.pedro.rtsp.rtsp.Protocol; import com.pedro.rtsp.rtsp.RtspClient; import com.pedro.rtsp.rtsp.VideoCodec; @@ -42,69 +43,16 @@ public class RtspDisplay extends DisplayBase { private final RtspClient rtspClient; + private final RtspStreamClient streamClient; public RtspDisplay(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { super(context, useOpengl); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } - /** - * Internet protocol used. - * - * @param protocol Could be Protocol.TCP or Protocol.UDP. - */ - public void setProtocol(Protocol protocol) { - rtspClient.setProtocol(protocol); - } - - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtspClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtspClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtspClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtspClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtspClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtspClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtspClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtspClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtspClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtspClient.resetDroppedVideoFrames(); + public RtspStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -113,11 +61,6 @@ public void setVideoCodec(VideoCodec videoCodec) { videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); } - @Override - public void setAuthorization(String user, String password) { - rtspClient.setAuthorization(user, password); - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtspClient.setAudioInfo(sampleRate, isStereo); @@ -133,26 +76,6 @@ protected void stopStreamRtp() { rtspClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtspClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtspClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtspClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtspClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); @@ -168,13 +91,17 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtspClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - rtspClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtspClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java index d52ed0043..01b630998 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java @@ -27,9 +27,9 @@ import com.pedro.encoder.input.decoder.VideoDecoderInterface; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.FromFileBase; +import com.pedro.library.util.client.RtspStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; -import com.pedro.rtsp.rtsp.Protocol; import com.pedro.rtsp.rtsp.RtspClient; import com.pedro.rtsp.rtsp.VideoCodec; import com.pedro.rtsp.utils.ConnectCheckerRtsp; @@ -46,88 +46,38 @@ public class RtspFromFile extends FromFileBase { private final RtspClient rtspClient; + private final RtspStreamClient streamClient; public RtspFromFile(ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } public RtspFromFile(Context context, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } public RtspFromFile(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } public RtspFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); + streamClient = new RtspStreamClient(rtspClient); } - /** - * Internet protocol used. - * - * @param protocol Could be Protocol.TCP or Protocol.UDP. - */ - public void setProtocol(Protocol protocol) { - rtspClient.setProtocol(protocol); - } - - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtspClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtspClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtspClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtspClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtspClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtspClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtspClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtspClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtspClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtspClient.resetDroppedVideoFrames(); + public RtspStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -136,11 +86,6 @@ public void setVideoCodec(VideoCodec videoCodec) { videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); } - @Override - public void setAuthorization(String user, String password) { - rtspClient.setAuthorization(user, password); - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { rtspClient.setAudioInfo(sampleRate, isStereo); @@ -157,26 +102,6 @@ protected void stopStreamRtp() { rtspClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtspClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtspClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtspClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtspClient.hasCongestion(); - } - @Override protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { rtspClient.setVideoInfo(sps, pps, vps); @@ -192,14 +117,18 @@ protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); } - @Override - public void setLogs(boolean enable) { - rtspClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtspClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java index 06fc3ea5a..eb9e54cbf 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java @@ -21,6 +21,8 @@ import androidx.annotation.Nullable; import com.pedro.library.base.OnlyAudioBase; +import com.pedro.library.util.client.RtmpStreamClient; +import com.pedro.library.util.client.RtspStreamClient; import com.pedro.rtsp.rtsp.Protocol; import com.pedro.rtsp.rtsp.RtspClient; import com.pedro.rtsp.utils.ConnectCheckerRtsp; @@ -36,75 +38,17 @@ public class RtspOnlyAudio extends OnlyAudioBase { private final RtspClient rtspClient; + private final RtspStreamClient streamClient; public RtspOnlyAudio(ConnectCheckerRtsp connectCheckerRtsp) { super(); rtspClient = new RtspClient(connectCheckerRtsp); rtspClient.setOnlyAudio(true); + streamClient = new RtspStreamClient(rtspClient); } - /** - * Internet protocol used. - * - * @param protocol Could be Protocol.TCP or Protocol.UDP. - */ - public void setProtocol(Protocol protocol) { - rtspClient.setProtocol(protocol); - } - - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtspClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtspClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtspClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtspClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtspClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtspClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtspClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtspClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtspClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtspClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtspClient.setAuthorization(user, password); + public RtspStreamClient getStreamClient() { + return streamClient; } @Override @@ -122,38 +66,21 @@ protected void stopStreamRtp() { rtspClient.disconnect(); } - @Override - public void setReTries(int reTries) { - rtspClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtspClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtspClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtspClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); } - @Override - public void setLogs(boolean enable) { - rtspClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtspClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + streamClient.reConnect(delay, backupUrl); + } + return result; } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt b/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt index 5aef08fd7..c4ef296b1 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt +++ b/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt @@ -6,6 +6,8 @@ import android.os.Build import androidx.annotation.RequiresApi import com.pedro.encoder.utils.CodecUtil import com.pedro.library.base.StreamBase +import com.pedro.library.util.client.RtspStreamClient +import com.pedro.library.util.client.SrtStreamClient import com.pedro.library.util.sources.AudioManager import com.pedro.library.util.sources.VideoManager import com.pedro.rtsp.rtsp.Protocol @@ -25,19 +27,11 @@ import java.nio.ByteBuffer class RtspStream(context: Context, connectCheckerRtsp: ConnectCheckerRtsp, videoSource: VideoManager.Source, audioSource: AudioManager.Source): StreamBase(context, videoSource, audioSource) { - constructor(context: Context, connectCheckerRtsp: ConnectCheckerRtsp): - this(context, connectCheckerRtsp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) - private val rtspClient = RtspClient(connectCheckerRtsp) + val streamClient = RtspStreamClient(rtspClient) - /** - * Internet protocol used. - * - * @param protocol Could be Protocol.TCP or Protocol.UDP. - */ - fun setProtocol(protocol: Protocol?) { - rtspClient.setProtocol(protocol!!) - } + constructor(context: Context, connectCheckerRtsp: ConnectCheckerRtsp): + this(context, connectCheckerRtsp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) fun setVideoCodec(videoCodec: VideoCodec) { val mime = if (videoCodec === VideoCodec.H265) CodecUtil.H265_MIME else CodecUtil.H264_MIME @@ -56,10 +50,6 @@ class RtspStream(context: Context, connectCheckerRtsp: ConnectCheckerRtsp, video rtspClient.disconnect() } - override fun setAuthorization(user: String?, password: String?) { - rtspClient.setAuthorization(user, password) - } - override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer, vps: ByteBuffer?) { rtspClient.setVideoInfo(sps, pps, vps) } @@ -72,53 +62,18 @@ class RtspStream(context: Context, connectCheckerRtsp: ConnectCheckerRtsp, video rtspClient.sendAudio(aacBuffer, info) } - override fun setReTries(reTries: Int) { - rtspClient.setReTries(reTries) - } - - override fun shouldRetry(reason: String): Boolean = rtspClient.shouldRetry(reason) - - override fun reConnect(delay: Long, backupUrl: String?) { - rtspClient.reConnect(delay, backupUrl) - } - - override fun hasCongestion(): Boolean = rtspClient.hasCongestion() - - override fun setLogs(enabled: Boolean) { - rtspClient.setLogs(enabled) - } - - override fun setCheckServerAlive(enabled: Boolean) { - rtspClient.setCheckServerAlive(enabled) - } - - override fun resizeCache(newSize: Int) { - rtspClient.resizeCache(newSize) - } - - override fun getCacheSize(): Int = rtspClient.cacheSize - - override fun getSentAudioFrames(): Long = rtspClient.sentAudioFrames - - override fun getSentVideoFrames(): Long = rtspClient.sentVideoFrames - - override fun getDroppedAudioFrames(): Long = rtspClient.droppedAudioFrames - - override fun getDroppedVideoFrames(): Long = rtspClient.droppedVideoFrames - - override fun resetSentAudioFrames() { - rtspClient.resetSentAudioFrames() - } - - override fun resetSentVideoFrames() { - rtspClient.resetSentVideoFrames() - } - - override fun resetDroppedAudioFrames() { - rtspClient.resetDroppedAudioFrames() - } - - override fun resetDroppedVideoFrames() { - rtspClient.resetDroppedVideoFrames() + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + @JvmOverloads + fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { + val result = streamClient.shouldRetry(reason) + if (result) { + requestKeyframe() + streamClient.reConnect(delay, backupUrl) + } + return result } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java b/library/src/main/java/com/pedro/library/srt/SrtCamera1.java index e71be3cf6..16986a5c8 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera1.java @@ -27,6 +27,7 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera1Base; +import com.pedro.library.util.client.SrtStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.srt.srt.SrtClient; @@ -45,33 +46,43 @@ public class SrtCamera1 extends Camera1Base { private final SrtClient srtClient; + private final SrtStreamClient streamClient; public SrtCamera1(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { super(surfaceView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public SrtCamera1(TextureView textureView, ConnectCheckerSrt connectChecker) { super(textureView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(OpenGlView openGlView, ConnectCheckerSrt connectChecker) { super(openGlView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker) { super(lightOpenGlView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(Context context, ConnectCheckerSrt connectChecker) { super(context); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); + } + + public SrtStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -81,61 +92,6 @@ public void setVideoCodec(VideoCodec videoCodec) { srtClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - srtClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return srtClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return srtClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return srtClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return srtClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return srtClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - srtClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - srtClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - srtClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - srtClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - srtClient.setAuthorization(user, password); - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { srtClient.setAudioInfo(sampleRate, isStereo); @@ -152,26 +108,6 @@ protected void stopStreamRtp() { srtClient.disconnect(); } - @Override - public void setReTries(int reTries) { - srtClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return srtClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - srtClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return srtClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { srtClient.sendAudio(aacBuffer, info); @@ -187,13 +123,17 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) srtClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - srtClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - srtClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java b/library/src/main/java/com/pedro/library/srt/SrtCamera2.java index 11a2fa8d0..03ca51f0f 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera2.java @@ -27,6 +27,7 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera2Base; +import com.pedro.library.util.client.SrtStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.srt.srt.SrtClient; @@ -45,6 +46,7 @@ public class SrtCamera2 extends Camera2Base { private final SrtClient srtClient; + private final SrtStreamClient streamClient; /** * @deprecated This view produce rotations problems and could be unsupported in future versions. @@ -55,6 +57,7 @@ public class SrtCamera2 extends Camera2Base { public SrtCamera2(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { super(surfaceView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } /** @@ -66,21 +69,29 @@ public SrtCamera2(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { public SrtCamera2(TextureView textureView, ConnectCheckerSrt connectChecker) { super(textureView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public SrtCamera2(OpenGlView openGlView, ConnectCheckerSrt connectChecker) { super(openGlView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public SrtCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker) { super(lightOpenGlView); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public SrtCamera2(Context context, boolean useOpengl, ConnectCheckerSrt connectChecker) { super(context, useOpengl); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); + } + + public SrtStreamClient getStreamClient() { + return streamClient; } public void setVideoCodec(VideoCodec videoCodec) { @@ -90,61 +101,6 @@ public void setVideoCodec(VideoCodec videoCodec) { srtClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - srtClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return srtClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return srtClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return srtClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return srtClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return srtClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - srtClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - srtClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - srtClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - srtClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - srtClient.setAuthorization(user, password); - } - @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { srtClient.setAudioInfo(sampleRate, isStereo); @@ -161,26 +117,6 @@ protected void stopStreamRtp() { srtClient.disconnect(); } - @Override - public void setReTries(int reTries) { - srtClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return srtClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - srtClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return srtClient.hasCongestion(); - } - @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { srtClient.sendAudio(aacBuffer, info); @@ -196,14 +132,18 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) srtClient.sendVideo(h264Buffer, info); } - @Override - public void setLogs(boolean enable) { - srtClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - srtClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java b/library/src/main/java/com/pedro/library/srt/SrtDisplay.java index 517f958d4..8d2917fc9 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java +++ b/library/src/main/java/com/pedro/library/srt/SrtDisplay.java @@ -25,6 +25,7 @@ import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.DisplayBase; +import com.pedro.library.util.client.SrtStreamClient; import com.pedro.srt.srt.SrtClient; import com.pedro.srt.srt.VideoCodec; import com.pedro.srt.utils.ConnectCheckerSrt; @@ -40,132 +41,67 @@ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public class SrtDisplay extends DisplayBase { - private final SrtClient rtmpClient; + private final SrtClient srtClient; + private final SrtStreamClient streamClient; public SrtDisplay(Context context, boolean useOpengl, ConnectCheckerSrt connectChecker) { super(context, useOpengl); - rtmpClient = new SrtClient(connectChecker); + srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public void setVideoCodec(VideoCodec videoCodec) { recordController.setVideoMime( videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); - rtmpClient.setVideoCodec(videoCodec); + srtClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtmpClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtmpClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtmpClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtmpClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtmpClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtmpClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtmpClient.setAuthorization(user, password); + public SrtStreamClient getStreamClient() { + return streamClient; } @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtmpClient.setAudioInfo(sampleRate, isStereo); + srtClient.setAudioInfo(sampleRate, isStereo); } @Override protected void startStreamRtp(String url) { - rtmpClient.connect(url); + srtClient.connect(url); } @Override protected void stopStreamRtp() { - rtmpClient.disconnect(); - } - - @Override - public void setReTries(int reTries) { - rtmpClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtmpClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtmpClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtmpClient.hasCongestion(); + srtClient.disconnect(); } @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtmpClient.sendAudio(aacBuffer, info); + srtClient.sendAudio(aacBuffer, info); } @Override protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtmpClient.setVideoInfo(sps, pps, vps); + srtClient.setVideoInfo(sps, pps, vps); } @Override protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtmpClient.sendVideo(h264Buffer, info); - } - - @Override - public void setLogs(boolean enable) { - rtmpClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtmpClient.setCheckServerAlive(enable); + srtClient.sendVideo(h264Buffer, info); + } + + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java b/library/src/main/java/com/pedro/library/srt/SrtFromFile.java index ce9207269..c9a66cf74 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java +++ b/library/src/main/java/com/pedro/library/srt/SrtFromFile.java @@ -27,6 +27,7 @@ import com.pedro.encoder.input.decoder.VideoDecoderInterface; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.FromFileBase; +import com.pedro.library.util.client.SrtStreamClient; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.srt.srt.SrtClient; @@ -45,29 +46,34 @@ public class SrtFromFile extends FromFileBase { private final SrtClient srtClient; + private final SrtStreamClient streamClient; public SrtFromFile(ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public SrtFromFile(Context context, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public SrtFromFile(OpenGlView openGlView, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public SrtFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); + streamClient = new SrtStreamClient(srtClient); } public void setVideoCodec(VideoCodec videoCodec) { @@ -77,59 +83,8 @@ public void setVideoCodec(VideoCodec videoCodec) { srtClient.setVideoCodec(videoCodec); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - srtClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return srtClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return srtClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return srtClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return srtClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return srtClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - srtClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - srtClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - srtClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - srtClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - srtClient.setAuthorization(user, password); + public SrtStreamClient getStreamClient() { + return streamClient; } @Override @@ -147,26 +102,6 @@ protected void stopStreamRtp() { srtClient.disconnect(); } - @Override - public void setReTries(int reTries) { - srtClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return srtClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - srtClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return srtClient.hasCongestion(); - } - @Override protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { srtClient.setVideoInfo(sps, pps, vps); @@ -182,13 +117,17 @@ protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { srtClient.sendAudio(aacBuffer, info); } - @Override - public void setLogs(boolean enable) { - srtClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - srtClient.setCheckServerAlive(enable); + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + requestKeyFrame(); + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java index 0d04dd717..28a9d8fe7 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java @@ -21,6 +21,7 @@ import androidx.annotation.Nullable; import com.pedro.library.base.OnlyAudioBase; +import com.pedro.library.util.client.SrtStreamClient; import com.pedro.srt.srt.SrtClient; import com.pedro.srt.utils.ConnectCheckerSrt; @@ -34,116 +35,50 @@ */ public class SrtOnlyAudio extends OnlyAudioBase { - private final SrtClient rtmpClient; + private final SrtClient srtClient; + private final SrtStreamClient streamClient; public SrtOnlyAudio(ConnectCheckerSrt connectChecker) { super(); - rtmpClient = new SrtClient(connectChecker); - rtmpClient.setOnlyAudio(true); + srtClient = new SrtClient(connectChecker); + srtClient.setOnlyAudio(true); + streamClient = new SrtStreamClient(srtClient); } - @Override - public void resizeCache(int newSize) throws RuntimeException { - rtmpClient.resizeCache(newSize); - } - - @Override - public int getCacheSize() { - return rtmpClient.getCacheSize(); - } - - @Override - public long getSentAudioFrames() { - return rtmpClient.getSentAudioFrames(); - } - - @Override - public long getSentVideoFrames() { - return rtmpClient.getSentVideoFrames(); - } - - @Override - public long getDroppedAudioFrames() { - return rtmpClient.getDroppedAudioFrames(); - } - - @Override - public long getDroppedVideoFrames() { - return rtmpClient.getDroppedVideoFrames(); - } - - @Override - public void resetSentAudioFrames() { - rtmpClient.resetSentAudioFrames(); - } - - @Override - public void resetSentVideoFrames() { - rtmpClient.resetSentVideoFrames(); - } - - @Override - public void resetDroppedAudioFrames() { - rtmpClient.resetDroppedAudioFrames(); - } - - @Override - public void resetDroppedVideoFrames() { - rtmpClient.resetDroppedVideoFrames(); - } - - @Override - public void setAuthorization(String user, String password) { - rtmpClient.setAuthorization(user, password); + public SrtStreamClient getStreamClient() { + return streamClient; } @Override protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtmpClient.setAudioInfo(sampleRate, isStereo); + srtClient.setAudioInfo(sampleRate, isStereo); } @Override protected void startStreamRtp(String url) { - rtmpClient.connect(url); + srtClient.connect(url); } @Override protected void stopStreamRtp() { - rtmpClient.disconnect(); - } - - @Override - public void setReTries(int reTries) { - rtmpClient.setReTries(reTries); - } - - @Override - protected boolean shouldRetry(String reason) { - return rtmpClient.shouldRetry(reason); - } - - @Override - public void reConnect(long delay, @Nullable String backupUrl) { - rtmpClient.reConnect(delay, backupUrl); - } - - @Override - public boolean hasCongestion() { - return rtmpClient.hasCongestion(); + srtClient.disconnect(); } @Override protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtmpClient.sendAudio(aacBuffer, info); - } - - @Override - public void setLogs(boolean enable) { - rtmpClient.setLogs(enable); - } - - @Override - public void setCheckServerAlive(boolean enable) { - rtmpClient.setCheckServerAlive(enable); + srtClient.sendAudio(aacBuffer, info); + } + + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + public boolean reTry(long delay, String reason, @Nullable String backupUrl) { + boolean result = streamClient.shouldRetry(reason); + if (result) { + streamClient.reConnect(delay, backupUrl); + } + return result; } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtStream.kt b/library/src/main/java/com/pedro/library/srt/SrtStream.kt index 0e5b2e455..802255262 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtStream.kt +++ b/library/src/main/java/com/pedro/library/srt/SrtStream.kt @@ -22,6 +22,7 @@ import android.os.Build import androidx.annotation.RequiresApi import com.pedro.encoder.utils.CodecUtil import com.pedro.library.base.StreamBase +import com.pedro.library.util.client.SrtStreamClient import com.pedro.library.util.sources.AudioManager import com.pedro.library.util.sources.VideoManager import com.pedro.srt.srt.SrtClient @@ -40,11 +41,12 @@ import java.nio.ByteBuffer class SrtStream(context: Context, connectCheckerRtmp: ConnectCheckerSrt, videoSource: VideoManager.Source, audioSource: AudioManager.Source): StreamBase(context, videoSource, audioSource) { + private val srtClient = SrtClient(connectCheckerRtmp) + val streamClient = SrtStreamClient(srtClient) + constructor(context: Context, connectCheckerRtmp: ConnectCheckerSrt): this(context, connectCheckerRtmp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) - private val srtClient = SrtClient(connectCheckerRtmp) - fun setVideoCodec(videoCodec: VideoCodec) { val mime = if (videoCodec === VideoCodec.H265) CodecUtil.H265_MIME else CodecUtil.H264_MIME super.setVideoMime(mime) @@ -63,10 +65,6 @@ class SrtStream(context: Context, connectCheckerRtmp: ConnectCheckerSrt, videoSo srtClient.disconnect() } - override fun setAuthorization(user: String?, password: String?) { - srtClient.setAuthorization(user, password) - } - override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer, vps: ByteBuffer?) { srtClient.setVideoInfo(sps, pps, vps) } @@ -79,53 +77,18 @@ class SrtStream(context: Context, connectCheckerRtmp: ConnectCheckerSrt, videoSo srtClient.sendAudio(aacBuffer, info) } - override fun setReTries(reTries: Int) { - srtClient.setReTries(reTries) - } - - override fun shouldRetry(reason: String): Boolean = srtClient.shouldRetry(reason) - - override fun reConnect(delay: Long, backupUrl: String?) { - srtClient.reConnect(delay, backupUrl) - } - - override fun hasCongestion(): Boolean = srtClient.hasCongestion() - - override fun setLogs(enabled: Boolean) { - srtClient.setLogs(enabled) - } - - override fun setCheckServerAlive(enabled: Boolean) { - srtClient.setCheckServerAlive(enabled) - } - - override fun resizeCache(newSize: Int) { - srtClient.resizeCache(newSize) - } - - override fun getCacheSize(): Int = srtClient.cacheSize - - override fun getSentAudioFrames(): Long = srtClient.sentAudioFrames - - override fun getSentVideoFrames(): Long = srtClient.sentVideoFrames - - override fun getDroppedAudioFrames(): Long = srtClient.droppedAudioFrames - - override fun getDroppedVideoFrames(): Long = srtClient.droppedVideoFrames - - override fun resetSentAudioFrames() { - srtClient.resetSentAudioFrames() - } - - override fun resetSentVideoFrames() { - srtClient.resetSentVideoFrames() - } - - override fun resetDroppedAudioFrames() { - srtClient.resetDroppedAudioFrames() - } - - override fun resetDroppedVideoFrames() { - srtClient.resetDroppedVideoFrames() + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + @JvmOverloads + fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { + val result = streamClient.shouldRetry(reason) + if (result) { + requestKeyframe() + streamClient.reConnect(delay, backupUrl) + } + return result } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/util/client/RtmpStreamClient.kt b/library/src/main/java/com/pedro/library/util/client/RtmpStreamClient.kt new file mode 100644 index 000000000..092467dc4 --- /dev/null +++ b/library/src/main/java/com/pedro/library/util/client/RtmpStreamClient.kt @@ -0,0 +1,98 @@ +package com.pedro.library.util.client + +import com.pedro.rtmp.flv.video.ProfileIop +import com.pedro.rtmp.rtmp.RtmpClient + +/** + * Created by pedro on 12/10/23. + */ +class RtmpStreamClient(private val rtmpClient: RtmpClient): StreamBaseClient() { + + /** + * H264 profile. + * + * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED + */ + fun setProfileIop(profileIop: ProfileIop?) { + rtmpClient.setProfileIop(profileIop!!) + } + + /** + * Some Livestream hosts use Akamai auth that requires RTMP packets to be sent with increasing + * timestamp order regardless of packet type. + * Necessary with Servers like Dacast. + * More info here: + * https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-encoder-compatibility-testing-and-qualification-guide-v4.0/GUID-F941C88B-9128-4BF4-A81B-C2E5CFD35BBF.html + */ + fun forceAkamaiTs(enabled: Boolean) { + rtmpClient.forceAkamaiTs(enabled) + } + + /** + * Must be called before start stream or will be ignored. + * + * Default value 128 + * Range value: 1 to 16777215. + * + * The most common values example: 128, 4096, 65535 + * + * @param chunkSize packet's chunk size send to server + */ + fun setWriteChunkSize(chunkSize: Int) { + rtmpClient.setWriteChunkSize(chunkSize) + } + + override fun setAuthorization(user: String?, password: String?) { + rtmpClient.setAuthorization(user, password) + } + + override fun setReTries(reTries: Int) { + rtmpClient.setReTries(reTries) + } + + override fun shouldRetry(reason: String): Boolean = rtmpClient.shouldRetry(reason) + + override fun reConnect(delay: Long, backupUrl: String?) { + rtmpClient.reConnect(delay, backupUrl) + } + + override fun hasCongestion(): Boolean = rtmpClient.hasCongestion() + + override fun setLogs(enabled: Boolean) { + rtmpClient.setLogs(enabled) + } + + override fun setCheckServerAlive(enabled: Boolean) { + rtmpClient.setCheckServerAlive(enabled) + } + + override fun resizeCache(newSize: Int) { + rtmpClient.resizeCache(newSize) + } + + override fun getCacheSize(): Int = rtmpClient.cacheSize + + override fun getSentAudioFrames(): Long = rtmpClient.sentAudioFrames + + override fun getSentVideoFrames(): Long = rtmpClient.sentVideoFrames + + override fun getDroppedAudioFrames(): Long = rtmpClient.droppedAudioFrames + + override fun getDroppedVideoFrames(): Long = rtmpClient.droppedVideoFrames + + override fun resetSentAudioFrames() { + rtmpClient.resetSentAudioFrames() + } + + override fun resetSentVideoFrames() { + rtmpClient.resetSentVideoFrames() + } + + override fun resetDroppedAudioFrames() { + rtmpClient.resetDroppedAudioFrames() + } + + override fun resetDroppedVideoFrames() { + rtmpClient.resetDroppedVideoFrames() + } +} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/util/client/RtspStreamClient.kt b/library/src/main/java/com/pedro/library/util/client/RtspStreamClient.kt new file mode 100644 index 000000000..c8d1fdbd8 --- /dev/null +++ b/library/src/main/java/com/pedro/library/util/client/RtspStreamClient.kt @@ -0,0 +1,74 @@ +package com.pedro.library.util.client + +import com.pedro.rtsp.rtsp.Protocol +import com.pedro.rtsp.rtsp.RtspClient + +/** + * Created by pedro on 12/10/23. + */ +class RtspStreamClient(private val rtspClient: RtspClient): StreamBaseClient() { + + + /** + * Internet protocol used. + * + * @param protocol Could be Protocol.TCP or Protocol.UDP. + */ + fun setProtocol(protocol: Protocol?) { + rtspClient.setProtocol(protocol!!) + } + + override fun setAuthorization(user: String?, password: String?) { + rtspClient.setAuthorization(user, password) + } + + override fun setReTries(reTries: Int) { + rtspClient.setReTries(reTries) + } + + override fun shouldRetry(reason: String): Boolean = rtspClient.shouldRetry(reason) + + override fun reConnect(delay: Long, backupUrl: String?) { + rtspClient.reConnect(delay, backupUrl) + } + + override fun hasCongestion(): Boolean = rtspClient.hasCongestion() + + override fun setLogs(enabled: Boolean) { + rtspClient.setLogs(enabled) + } + + override fun setCheckServerAlive(enabled: Boolean) { + rtspClient.setCheckServerAlive(enabled) + } + + override fun resizeCache(newSize: Int) { + rtspClient.resizeCache(newSize) + } + + override fun getCacheSize(): Int = rtspClient.cacheSize + + override fun getSentAudioFrames(): Long = rtspClient.sentAudioFrames + + override fun getSentVideoFrames(): Long = rtspClient.sentVideoFrames + + override fun getDroppedAudioFrames(): Long = rtspClient.droppedAudioFrames + + override fun getDroppedVideoFrames(): Long = rtspClient.droppedVideoFrames + + override fun resetSentAudioFrames() { + rtspClient.resetSentAudioFrames() + } + + override fun resetSentVideoFrames() { + rtspClient.resetSentVideoFrames() + } + + override fun resetDroppedAudioFrames() { + rtspClient.resetDroppedAudioFrames() + } + + override fun resetDroppedVideoFrames() { + rtspClient.resetDroppedVideoFrames() + } +} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/util/client/SrtStreamClient.kt b/library/src/main/java/com/pedro/library/util/client/SrtStreamClient.kt new file mode 100644 index 000000000..19c3b8c39 --- /dev/null +++ b/library/src/main/java/com/pedro/library/util/client/SrtStreamClient.kt @@ -0,0 +1,63 @@ +package com.pedro.library.util.client + +import com.pedro.srt.srt.SrtClient + +/** + * Created by pedro on 12/10/23. + */ +class SrtStreamClient(private val srtClient: SrtClient): StreamBaseClient() { + + override fun setAuthorization(user: String?, password: String?) { + srtClient.setAuthorization(user, password) + } + + override fun setReTries(reTries: Int) { + srtClient.setReTries(reTries) + } + + override fun shouldRetry(reason: String): Boolean = srtClient.shouldRetry(reason) + + override fun reConnect(delay: Long, backupUrl: String?) { + srtClient.reConnect(delay, backupUrl) + } + + override fun hasCongestion(): Boolean = srtClient.hasCongestion() + + override fun setLogs(enabled: Boolean) { + srtClient.setLogs(enabled) + } + + override fun setCheckServerAlive(enabled: Boolean) { + srtClient.setCheckServerAlive(enabled) + } + + override fun resizeCache(newSize: Int) { + srtClient.resizeCache(newSize) + } + + override fun getCacheSize(): Int = srtClient.cacheSize + + override fun getSentAudioFrames(): Long = srtClient.sentAudioFrames + + override fun getSentVideoFrames(): Long = srtClient.sentVideoFrames + + override fun getDroppedAudioFrames(): Long = srtClient.droppedAudioFrames + + override fun getDroppedVideoFrames(): Long = srtClient.droppedVideoFrames + + override fun resetSentAudioFrames() { + srtClient.resetSentAudioFrames() + } + + override fun resetSentVideoFrames() { + srtClient.resetSentVideoFrames() + } + + override fun resetDroppedAudioFrames() { + srtClient.resetDroppedAudioFrames() + } + + override fun resetDroppedVideoFrames() { + srtClient.resetDroppedVideoFrames() + } +} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/util/client/StreamBaseClient.kt b/library/src/main/java/com/pedro/library/util/client/StreamBaseClient.kt new file mode 100644 index 000000000..e44979977 --- /dev/null +++ b/library/src/main/java/com/pedro/library/util/client/StreamBaseClient.kt @@ -0,0 +1,31 @@ +package com.pedro.library.util.client + +/** + * Created by pedro on 12/10/23. + */ +abstract class StreamBaseClient { + + /** + * + * @param user auth. + * @param password auth. + */ + abstract fun setAuthorization(user: String?, password: String?) + abstract fun shouldRetry(reason: String): Boolean + abstract fun reConnect(delay: Long, backupUrl: String?) + abstract fun setReTries(reTries: Int) + abstract fun hasCongestion(): Boolean + abstract fun setLogs(enabled: Boolean) + abstract fun setCheckServerAlive(enabled: Boolean) + @Throws(RuntimeException::class) + abstract fun resizeCache(newSize: Int) + abstract fun getCacheSize(): Int + abstract fun getSentAudioFrames(): Long + abstract fun getSentVideoFrames(): Long + abstract fun getDroppedAudioFrames(): Long + abstract fun getDroppedVideoFrames(): Long + abstract fun resetSentAudioFrames() + abstract fun resetSentVideoFrames() + abstract fun resetDroppedAudioFrames() + abstract fun resetDroppedVideoFrames() +} \ No newline at end of file diff --git a/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt b/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt index 6634341fa..1e7090224 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt @@ -131,7 +131,9 @@ class RtmpClient(private val connectCheckerRtmp: ConnectCheckerRtmp) { } fun setWriteChunkSize(chunkSize: Int) { - RtmpConfig.writeChunkSize = chunkSize + if (!isStreaming) { + RtmpConfig.writeChunkSize = chunkSize + } } fun setAuthorization(user: String?, password: String?) { From 8fec4e97f7d0d3346f9dc9c8f985eeda057009ff Mon Sep 17 00:00:00 2001 From: pedro Date: Thu, 12 Oct 2023 23:11:38 +0200 Subject: [PATCH 2/4] move retry to streamclient --- .../defaultexample/ExampleRtmpActivity.java | 2 +- .../defaultexample/ExampleRtspActivity.java | 2 +- .../defaultexample/ExampleSrtActivity.java | 2 +- .../SurfaceModeRtmpActivity.java | 2 +- .../SurfaceModeRtspActivity.java | 2 +- .../com/pedro/library/base/DisplayBase.java | 1 - .../com/pedro/library/base/FromFileBase.java | 1 - .../com/pedro/library/base/OnlyAudioBase.java | 1 - .../java/com/pedro/library/base/StreamBase.kt | 1 - .../com/pedro/library/rtmp/RtmpCamera1.java | 33 +++++++------------ .../com/pedro/library/rtmp/RtmpCamera2.java | 32 +++++++----------- .../com/pedro/library/rtmp/RtmpDisplay.java | 26 ++++----------- .../com/pedro/library/rtmp/RtmpFromFile.java | 30 ++++++----------- .../com/pedro/library/rtmp/RtmpOnlyAudio.java | 4 +-- .../java/com/pedro/library/rtmp/RtmpStream.kt | 28 +++++----------- .../com/pedro/library/rtsp/RtspCamera1.java | 33 +++++++------------ .../com/pedro/library/rtsp/RtspCamera2.java | 33 +++++++------------ .../com/pedro/library/rtsp/RtspDisplay.java | 24 ++++---------- .../com/pedro/library/rtsp/RtspFromFile.java | 29 ++++++---------- .../com/pedro/library/rtsp/RtspOnlyAudio.java | 6 ++-- .../java/com/pedro/library/rtsp/RtspStream.kt | 28 +++++----------- .../com/pedro/library/srt/SrtCamera1.java | 31 +++++++---------- .../com/pedro/library/srt/SrtCamera2.java | 31 +++++++---------- .../com/pedro/library/srt/SrtDisplay.java | 23 ++++--------- .../com/pedro/library/srt/SrtFromFile.java | 29 ++++++---------- .../com/pedro/library/srt/SrtOnlyAudio.java | 4 +-- .../java/com/pedro/library/srt/SrtStream.kt | 26 +++++---------- .../RtmpStreamClient.kt | 7 ++-- .../RtspStreamClient.kt | 7 ++-- .../SrtStreamClient.kt | 7 ++-- .../StreamBaseClient.kt | 21 ++++++++++-- .../util/streamclient/StreamClientListener.kt | 8 +++++ 32 files changed, 197 insertions(+), 317 deletions(-) rename library/src/main/java/com/pedro/library/util/{client => streamclient}/RtmpStreamClient.kt (92%) rename library/src/main/java/com/pedro/library/util/{client => streamclient}/RtspStreamClient.kt (89%) rename library/src/main/java/com/pedro/library/util/{client => streamclient}/SrtStreamClient.kt (88%) rename library/src/main/java/com/pedro/library/util/{client => streamclient}/StreamBaseClient.kt (59%) create mode 100644 library/src/main/java/com/pedro/library/util/streamclient/StreamClientListener.kt diff --git a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java index c7f0a0053..019e33302 100644 --- a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java +++ b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtmpActivity.java @@ -85,7 +85,7 @@ public void onConnectionSuccessRtmp() { @Override public void onConnectionFailedRtmp(final String reason) { - if (rtmpCamera1.reTry(5000, reason, null)) { + if (rtmpCamera1.getStreamClient().reTry(5000, reason, null)) { Toast.makeText(ExampleRtmpActivity.this, "Retry", Toast.LENGTH_SHORT) .show(); } else { diff --git a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java index 45d11b75a..dfb2f4833 100644 --- a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java +++ b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleRtspActivity.java @@ -87,7 +87,7 @@ public void onConnectionSuccessRtsp() { @Override public void onConnectionFailedRtsp(final String reason) { - if (rtspCamera1.reTry(5000, reason, null)) { + if (rtspCamera1.getStreamClient().reTry(5000, reason, null)) { Toast.makeText(ExampleRtspActivity.this, "Retry", Toast.LENGTH_SHORT) .show(); } else { diff --git a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java index d65bc5396..053f01e7b 100644 --- a/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java +++ b/app/src/main/java/com/pedro/streamer/defaultexample/ExampleSrtActivity.java @@ -87,7 +87,7 @@ public void onConnectionSuccessSrt() { @Override public void onConnectionFailedSrt(final String reason) { - if (srtCamera1.reTry(5000, reason, null)) { + if (srtCamera1.getStreamClient().reTry(5000, reason, null)) { Toast.makeText(ExampleSrtActivity.this, "Retry", Toast.LENGTH_SHORT) .show(); } else { diff --git a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java index 09d6ac300..d2dc771a3 100644 --- a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java +++ b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtmpActivity.java @@ -87,7 +87,7 @@ public void onConnectionSuccessRtmp() { @Override public void onConnectionFailedRtmp(final String reason) { - if (rtmpCamera2.reTry(5000, reason, null)) { + if (rtmpCamera2.getStreamClient().reTry(5000, reason, null)) { Toast.makeText(SurfaceModeRtmpActivity.this, "Retry", Toast.LENGTH_SHORT) .show(); } else { diff --git a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java index 8b6b6894d..0d428632e 100644 --- a/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java +++ b/app/src/main/java/com/pedro/streamer/surfacemodeexample/SurfaceModeRtspActivity.java @@ -91,7 +91,7 @@ public void onConnectionSuccessRtsp() { @Override public void onConnectionFailedRtsp(final String reason) { //Wait 5s and retry connect stream - if (rtspCamera2.reTry(5000, reason, null)) { + if (rtspCamera2.getStreamClient().reTry(5000, reason, null)) { Toast.makeText(SurfaceModeRtspActivity.this, "Retry", Toast.LENGTH_SHORT) .show(); } else { diff --git a/library/src/main/java/com/pedro/library/base/DisplayBase.java b/library/src/main/java/com/pedro/library/base/DisplayBase.java index cf6138884..56fd1440b 100644 --- a/library/src/main/java/com/pedro/library/base/DisplayBase.java +++ b/library/src/main/java/com/pedro/library/base/DisplayBase.java @@ -37,7 +37,6 @@ import androidx.annotation.RequiresApi; import com.pedro.encoder.EncoderErrorCallback; -import com.pedro.encoder.Frame; import com.pedro.encoder.audio.AudioEncoder; import com.pedro.encoder.audio.GetAacData; import com.pedro.encoder.input.audio.CustomAudioEffect; diff --git a/library/src/main/java/com/pedro/library/base/FromFileBase.java b/library/src/main/java/com/pedro/library/base/FromFileBase.java index 0e88535da..5e116289a 100644 --- a/library/src/main/java/com/pedro/library/base/FromFileBase.java +++ b/library/src/main/java/com/pedro/library/base/FromFileBase.java @@ -29,7 +29,6 @@ import androidx.annotation.RequiresApi; import com.pedro.encoder.EncoderErrorCallback; -import com.pedro.encoder.Frame; import com.pedro.encoder.audio.AudioEncoder; import com.pedro.encoder.audio.GetAacData; import com.pedro.encoder.input.audio.GetMicrophoneData; diff --git a/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java b/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java index 14f006ed4..884f69555 100644 --- a/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java +++ b/library/src/main/java/com/pedro/library/base/OnlyAudioBase.java @@ -26,7 +26,6 @@ import androidx.annotation.RequiresApi; import com.pedro.encoder.EncoderErrorCallback; -import com.pedro.encoder.Frame; import com.pedro.encoder.audio.AudioEncoder; import com.pedro.encoder.audio.GetAacData; import com.pedro.encoder.input.audio.CustomAudioEffect; diff --git a/library/src/main/java/com/pedro/library/base/StreamBase.kt b/library/src/main/java/com/pedro/library/base/StreamBase.kt index 180d0c884..6b82165d4 100644 --- a/library/src/main/java/com/pedro/library/base/StreamBase.kt +++ b/library/src/main/java/com/pedro/library/base/StreamBase.kt @@ -19,7 +19,6 @@ import com.pedro.encoder.audio.AudioEncoder import com.pedro.encoder.audio.GetAacData import com.pedro.encoder.input.audio.GetMicrophoneData import com.pedro.encoder.input.video.CameraHelper -import com.pedro.encoder.input.video.GetCameraData import com.pedro.encoder.video.FormatVideoEncoder import com.pedro.encoder.video.GetVideoData import com.pedro.encoder.video.VideoEncoder diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java index e5ee699ee..e2a989bbc 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java @@ -22,16 +22,14 @@ import android.view.SurfaceView; import android.view.TextureView; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera1Base; -import com.pedro.library.util.client.RtmpStreamClient; -import com.pedro.library.util.client.SrtStreamClient; +import com.pedro.library.util.streamclient.RtmpStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; -import com.pedro.rtmp.flv.video.ProfileIop; import com.pedro.rtmp.rtmp.RtmpClient; import com.pedro.rtmp.rtmp.VideoCodec; import com.pedro.rtmp.utils.ConnectCheckerRtmp; @@ -45,7 +43,7 @@ * Created by pedro on 25/01/17. */ -public class RtmpCamera1 extends Camera1Base { +public class RtmpCamera1 extends Camera1Base implements StreamClientListener { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; @@ -53,34 +51,34 @@ public class RtmpCamera1 extends Camera1Base { public RtmpCamera1(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { super(surfaceView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpCamera1(TextureView textureView, ConnectCheckerRtmp connectChecker) { super(textureView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { super(openGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { super(lightOpenGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(Context context, ConnectCheckerRtmp connectChecker) { super(context); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpStreamClient getStreamClient() { @@ -131,17 +129,8 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtmpClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java index cd535b40e..cc50ea590 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java @@ -22,15 +22,14 @@ import android.view.SurfaceView; import android.view.TextureView; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera2Base; -import com.pedro.library.util.client.RtmpStreamClient; +import com.pedro.library.util.streamclient.RtmpStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; -import com.pedro.rtmp.flv.video.ProfileIop; import com.pedro.rtmp.rtmp.RtmpClient; import com.pedro.rtmp.rtmp.VideoCodec; import com.pedro.rtmp.utils.ConnectCheckerRtmp; @@ -44,7 +43,7 @@ * Created by pedro on 6/07/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtmpCamera2 extends Camera2Base { +public class RtmpCamera2 extends Camera2Base implements StreamClientListener { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; @@ -58,7 +57,7 @@ public class RtmpCamera2 extends Camera2Base { public RtmpCamera2(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { super(surfaceView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } /** @@ -70,25 +69,25 @@ public RtmpCamera2(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { public RtmpCamera2(TextureView textureView, ConnectCheckerRtmp connectChecker) { super(textureView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpCamera2(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { super(openGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { super(lightOpenGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpCamera2(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { super(context, useOpengl); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpStreamClient getStreamClient() { @@ -139,18 +138,9 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtmpClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java index 412767907..b10f3a9d3 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java @@ -20,14 +20,12 @@ import android.media.MediaCodec; import android.os.Build; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.DisplayBase; -import com.pedro.library.util.client.RtmpStreamClient; -import com.pedro.library.util.client.StreamBaseClient; -import com.pedro.rtmp.flv.video.ProfileIop; +import com.pedro.library.util.streamclient.RtmpStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.rtmp.rtmp.RtmpClient; import com.pedro.rtmp.rtmp.VideoCodec; import com.pedro.rtmp.utils.ConnectCheckerRtmp; @@ -41,7 +39,7 @@ * Created by pedro on 9/08/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtmpDisplay extends DisplayBase { +public class RtmpDisplay extends DisplayBase implements StreamClientListener { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; @@ -49,7 +47,7 @@ public class RtmpDisplay extends DisplayBase { public RtmpDisplay(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { super(context, useOpengl); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpStreamClient getStreamClient() { @@ -99,18 +97,8 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtmpClient.sendVideo(h264Buffer, info); } - - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java index e72aa8cb8..17a428630 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java @@ -20,17 +20,16 @@ import android.media.MediaCodec; import android.os.Build; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.input.decoder.AudioDecoderInterface; import com.pedro.encoder.input.decoder.VideoDecoderInterface; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.FromFileBase; -import com.pedro.library.util.client.RtmpStreamClient; +import com.pedro.library.util.streamclient.RtmpStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; -import com.pedro.rtmp.flv.video.ProfileIop; import com.pedro.rtmp.rtmp.RtmpClient; import com.pedro.rtmp.rtmp.VideoCodec; import com.pedro.rtmp.utils.ConnectCheckerRtmp; @@ -44,7 +43,7 @@ * Created by pedro on 26/06/17. */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class RtmpFromFile extends FromFileBase { +public class RtmpFromFile extends FromFileBase implements StreamClientListener { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; @@ -53,28 +52,28 @@ public RtmpFromFile(ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpFromFile(Context context, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpFromFile(OpenGlView openGlView, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, this); } public RtmpStreamClient getStreamClient() { @@ -124,17 +123,8 @@ protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java index 2cda2aea6..f7c626336 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java @@ -21,7 +21,7 @@ import androidx.annotation.Nullable; import com.pedro.library.base.OnlyAudioBase; -import com.pedro.library.util.client.RtmpStreamClient; +import com.pedro.library.util.streamclient.RtmpStreamClient; import com.pedro.rtmp.rtmp.RtmpClient; import com.pedro.rtmp.utils.ConnectCheckerRtmp; @@ -42,7 +42,7 @@ public RtmpOnlyAudio(ConnectCheckerRtmp connectChecker) { super(); rtmpClient = new RtmpClient(connectChecker); rtmpClient.setOnlyAudio(true); - streamClient = new RtmpStreamClient(rtmpClient); + streamClient = new RtmpStreamClient(rtmpClient, null); } public RtmpStreamClient getStreamClient() { diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt index 6754cbfc1..51ada3ec2 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt @@ -6,11 +6,10 @@ import android.os.Build import androidx.annotation.RequiresApi import com.pedro.encoder.utils.CodecUtil import com.pedro.library.base.StreamBase -import com.pedro.library.util.client.RtmpStreamClient -import com.pedro.library.util.client.RtspStreamClient import com.pedro.library.util.sources.AudioManager import com.pedro.library.util.sources.VideoManager -import com.pedro.rtmp.flv.video.ProfileIop +import com.pedro.library.util.streamclient.RtmpStreamClient +import com.pedro.library.util.streamclient.StreamClientListener import com.pedro.rtmp.rtmp.RtmpClient import com.pedro.rtmp.rtmp.VideoCodec import com.pedro.rtmp.utils.ConnectCheckerRtmp @@ -24,11 +23,13 @@ import java.nio.ByteBuffer */ @RequiresApi(Build.VERSION_CODES.LOLLIPOP) -class RtmpStream(context: Context, connectCheckerRtmp: ConnectCheckerRtmp, videoSource: VideoManager.Source, - audioSource: AudioManager.Source): StreamBase(context, videoSource, audioSource) { +class RtmpStream( + context: Context, connectCheckerRtmp: ConnectCheckerRtmp, videoSource: VideoManager.Source, + audioSource: AudioManager.Source +): StreamBase(context, videoSource, audioSource), StreamClientListener { private val rtmpClient = RtmpClient(connectCheckerRtmp) - val streamClient = RtmpStreamClient(rtmpClient) + val streamClient = RtmpStreamClient(rtmpClient, this) constructor(context: Context, connectCheckerRtmp: ConnectCheckerRtmp): this(context, connectCheckerRtmp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) @@ -66,18 +67,7 @@ class RtmpStream(context: Context, connectCheckerRtmp: ConnectCheckerRtmp, video rtmpClient.sendAudio(aacBuffer, info) } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - @JvmOverloads - fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { - val result = streamClient.shouldRetry(reason) - if (result) { - requestKeyframe() - streamClient.reConnect(delay, backupUrl) - } - return result + override fun onRequestKeyframe() { + requestKeyframe() } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java index ae6a3bcf3..3d83722bb 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java @@ -22,16 +22,14 @@ import android.view.SurfaceView; import android.view.TextureView; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera1Base; -import com.pedro.library.util.client.RtmpStreamClient; -import com.pedro.library.util.client.RtspStreamClient; +import com.pedro.library.util.streamclient.RtspStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; -import com.pedro.rtsp.rtsp.Protocol; import com.pedro.rtsp.rtsp.RtspClient; import com.pedro.rtsp.rtsp.VideoCodec; import com.pedro.rtsp.utils.ConnectCheckerRtsp; @@ -45,7 +43,7 @@ * Created by pedro on 10/02/17. */ -public class RtspCamera1 extends Camera1Base { +public class RtspCamera1 extends Camera1Base implements StreamClientListener { private final RtspClient rtspClient; private final RtspStreamClient streamClient; @@ -53,34 +51,34 @@ public class RtspCamera1 extends Camera1Base { public RtspCamera1(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { super(surfaceView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspCamera1(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { super(textureView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(openGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(lightOpenGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(Context context, ConnectCheckerRtsp connectCheckerRtsp) { super(context); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspStreamClient getStreamClient() { @@ -125,17 +123,8 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtspClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java index 388666aa1..263aaef14 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java @@ -22,15 +22,14 @@ import android.view.SurfaceView; import android.view.TextureView; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera2Base; -import com.pedro.library.util.client.RtspStreamClient; +import com.pedro.library.util.streamclient.RtspStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; -import com.pedro.rtsp.rtsp.Protocol; import com.pedro.rtsp.rtsp.RtspClient; import com.pedro.rtsp.rtsp.VideoCodec; import com.pedro.rtsp.utils.ConnectCheckerRtsp; @@ -44,7 +43,7 @@ * Created by pedro on 4/06/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtspCamera2 extends Camera2Base { +public class RtspCamera2 extends Camera2Base implements StreamClientListener { private final RtspClient rtspClient; private final RtspStreamClient streamClient; @@ -58,7 +57,7 @@ public class RtspCamera2 extends Camera2Base { public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { super(surfaceView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } /** @@ -70,25 +69,25 @@ public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRts public RtspCamera2(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { super(textureView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspCamera2(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(openGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(lightOpenGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspCamera2(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { super(context, useOpengl); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspStreamClient getStreamClient() { @@ -132,19 +131,9 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtspClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } - } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java index 81b5466d9..1ee60b131 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java @@ -20,13 +20,12 @@ import android.media.MediaCodec; import android.os.Build; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.DisplayBase; -import com.pedro.library.util.client.RtspStreamClient; -import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.library.util.streamclient.RtspStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.rtsp.rtsp.RtspClient; import com.pedro.rtsp.rtsp.VideoCodec; import com.pedro.rtsp.utils.ConnectCheckerRtsp; @@ -40,7 +39,7 @@ * Created by pedro on 9/08/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtspDisplay extends DisplayBase { +public class RtspDisplay extends DisplayBase implements StreamClientListener { private final RtspClient rtspClient; private final RtspStreamClient streamClient; @@ -48,7 +47,7 @@ public class RtspDisplay extends DisplayBase { public RtspDisplay(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { super(context, useOpengl); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspStreamClient getStreamClient() { @@ -91,17 +90,8 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) rtspClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java index 01b630998..ae55ce5b1 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java @@ -20,14 +20,14 @@ import android.media.MediaCodec; import android.os.Build; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.input.decoder.AudioDecoderInterface; import com.pedro.encoder.input.decoder.VideoDecoderInterface; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.FromFileBase; -import com.pedro.library.util.client.RtspStreamClient; +import com.pedro.library.util.streamclient.RtspStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.rtsp.rtsp.RtspClient; @@ -43,7 +43,7 @@ * Created by pedro on 4/06/17. */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class RtspFromFile extends FromFileBase { +public class RtspFromFile extends FromFileBase implements StreamClientListener { private final RtspClient rtspClient; private final RtspStreamClient streamClient; @@ -52,28 +52,28 @@ public RtspFromFile(ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspFromFile(Context context, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspFromFile(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, this); } public RtspStreamClient getStreamClient() { @@ -117,18 +117,9 @@ protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java index eb9e54cbf..1819a8895 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java @@ -21,9 +21,7 @@ import androidx.annotation.Nullable; import com.pedro.library.base.OnlyAudioBase; -import com.pedro.library.util.client.RtmpStreamClient; -import com.pedro.library.util.client.RtspStreamClient; -import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.library.util.streamclient.RtspStreamClient; import com.pedro.rtsp.rtsp.RtspClient; import com.pedro.rtsp.utils.ConnectCheckerRtsp; @@ -44,7 +42,7 @@ public RtspOnlyAudio(ConnectCheckerRtsp connectCheckerRtsp) { super(); rtspClient = new RtspClient(connectCheckerRtsp); rtspClient.setOnlyAudio(true); - streamClient = new RtspStreamClient(rtspClient); + streamClient = new RtspStreamClient(rtspClient, null); } public RtspStreamClient getStreamClient() { diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt b/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt index c4ef296b1..28a4d5e62 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt +++ b/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt @@ -6,11 +6,10 @@ import android.os.Build import androidx.annotation.RequiresApi import com.pedro.encoder.utils.CodecUtil import com.pedro.library.base.StreamBase -import com.pedro.library.util.client.RtspStreamClient -import com.pedro.library.util.client.SrtStreamClient import com.pedro.library.util.sources.AudioManager import com.pedro.library.util.sources.VideoManager -import com.pedro.rtsp.rtsp.Protocol +import com.pedro.library.util.streamclient.RtspStreamClient +import com.pedro.library.util.streamclient.StreamClientListener import com.pedro.rtsp.rtsp.RtspClient import com.pedro.rtsp.rtsp.VideoCodec import com.pedro.rtsp.utils.ConnectCheckerRtsp @@ -24,11 +23,13 @@ import java.nio.ByteBuffer */ @RequiresApi(Build.VERSION_CODES.LOLLIPOP) -class RtspStream(context: Context, connectCheckerRtsp: ConnectCheckerRtsp, videoSource: VideoManager.Source, - audioSource: AudioManager.Source): StreamBase(context, videoSource, audioSource) { +class RtspStream( + context: Context, connectCheckerRtsp: ConnectCheckerRtsp, videoSource: VideoManager.Source, + audioSource: AudioManager.Source +): StreamBase(context, videoSource, audioSource), StreamClientListener { private val rtspClient = RtspClient(connectCheckerRtsp) - val streamClient = RtspStreamClient(rtspClient) + val streamClient = RtspStreamClient(rtspClient, this) constructor(context: Context, connectCheckerRtsp: ConnectCheckerRtsp): this(context, connectCheckerRtsp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) @@ -62,18 +63,7 @@ class RtspStream(context: Context, connectCheckerRtsp: ConnectCheckerRtsp, video rtspClient.sendAudio(aacBuffer, info) } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - @JvmOverloads - fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { - val result = streamClient.shouldRetry(reason) - if (result) { - requestKeyframe() - streamClient.reConnect(delay, backupUrl) - } - return result + override fun onRequestKeyframe() { + requestKeyframe() } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java b/library/src/main/java/com/pedro/library/srt/SrtCamera1.java index 16986a5c8..d8d554688 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera1.java @@ -22,12 +22,12 @@ import android.view.SurfaceView; import android.view.TextureView; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera1Base; -import com.pedro.library.util.client.SrtStreamClient; +import com.pedro.library.util.streamclient.SrtStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.srt.srt.SrtClient; @@ -43,7 +43,7 @@ * Created by pedro on 8/9/23. */ -public class SrtCamera1 extends Camera1Base { +public class SrtCamera1 extends Camera1Base implements StreamClientListener { private final SrtClient srtClient; private final SrtStreamClient streamClient; @@ -51,34 +51,34 @@ public class SrtCamera1 extends Camera1Base { public SrtCamera1(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { super(surfaceView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtCamera1(TextureView textureView, ConnectCheckerSrt connectChecker) { super(textureView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(OpenGlView openGlView, ConnectCheckerSrt connectChecker) { super(openGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker) { super(lightOpenGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(Context context, ConnectCheckerSrt connectChecker) { super(context); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtStreamClient getStreamClient() { @@ -123,17 +123,8 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) srtClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java b/library/src/main/java/com/pedro/library/srt/SrtCamera2.java index 03ca51f0f..b53268d74 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera2.java @@ -22,12 +22,12 @@ import android.view.SurfaceView; import android.view.TextureView; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.Camera2Base; -import com.pedro.library.util.client.SrtStreamClient; +import com.pedro.library.util.streamclient.SrtStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.srt.srt.SrtClient; @@ -43,7 +43,7 @@ * Created by pedro on 8/9/23. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class SrtCamera2 extends Camera2Base { +public class SrtCamera2 extends Camera2Base implements StreamClientListener { private final SrtClient srtClient; private final SrtStreamClient streamClient; @@ -57,7 +57,7 @@ public class SrtCamera2 extends Camera2Base { public SrtCamera2(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { super(surfaceView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } /** @@ -69,25 +69,25 @@ public SrtCamera2(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { public SrtCamera2(TextureView textureView, ConnectCheckerSrt connectChecker) { super(textureView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtCamera2(OpenGlView openGlView, ConnectCheckerSrt connectChecker) { super(openGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker) { super(lightOpenGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtCamera2(Context context, boolean useOpengl, ConnectCheckerSrt connectChecker) { super(context, useOpengl); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtStreamClient getStreamClient() { @@ -132,18 +132,9 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) srtClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java b/library/src/main/java/com/pedro/library/srt/SrtDisplay.java index 8d2917fc9..ab6007ebe 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java +++ b/library/src/main/java/com/pedro/library/srt/SrtDisplay.java @@ -20,12 +20,12 @@ import android.media.MediaCodec; import android.os.Build; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.DisplayBase; -import com.pedro.library.util.client.SrtStreamClient; +import com.pedro.library.util.streamclient.SrtStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.srt.srt.SrtClient; import com.pedro.srt.srt.VideoCodec; import com.pedro.srt.utils.ConnectCheckerSrt; @@ -39,7 +39,7 @@ * Created by pedro on 8/9/23. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class SrtDisplay extends DisplayBase { +public class SrtDisplay extends DisplayBase implements StreamClientListener { private final SrtClient srtClient; private final SrtStreamClient streamClient; @@ -47,7 +47,7 @@ public class SrtDisplay extends DisplayBase { public SrtDisplay(Context context, boolean useOpengl, ConnectCheckerSrt connectChecker) { super(context, useOpengl); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public void setVideoCodec(VideoCodec videoCodec) { @@ -91,17 +91,8 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) srtClient.sendVideo(h264Buffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java b/library/src/main/java/com/pedro/library/srt/SrtFromFile.java index c9a66cf74..55f1161fb 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java +++ b/library/src/main/java/com/pedro/library/srt/SrtFromFile.java @@ -20,14 +20,14 @@ import android.media.MediaCodec; import android.os.Build; -import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.pedro.encoder.input.decoder.AudioDecoderInterface; import com.pedro.encoder.input.decoder.VideoDecoderInterface; import com.pedro.encoder.utils.CodecUtil; import com.pedro.library.base.FromFileBase; -import com.pedro.library.util.client.SrtStreamClient; +import com.pedro.library.util.streamclient.SrtStreamClient; +import com.pedro.library.util.streamclient.StreamClientListener; import com.pedro.library.view.LightOpenGlView; import com.pedro.library.view.OpenGlView; import com.pedro.srt.srt.SrtClient; @@ -43,7 +43,7 @@ * Created by pedro on 8/9/23. */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class SrtFromFile extends FromFileBase { +public class SrtFromFile extends FromFileBase implements StreamClientListener { private final SrtClient srtClient; private final SrtStreamClient streamClient; @@ -52,28 +52,28 @@ public SrtFromFile(ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtFromFile(Context context, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtFromFile(OpenGlView openGlView, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public SrtFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, this); } public void setVideoCodec(VideoCodec videoCodec) { @@ -117,17 +117,8 @@ protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { srtClient.sendAudio(aacBuffer, info); } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - requestKeyFrame(); - streamClient.reConnect(delay, backupUrl); - } - return result; + @Override + public void onRequestKeyframe() { + requestKeyFrame(); } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java index 28a9d8fe7..9c03831a6 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java @@ -21,7 +21,7 @@ import androidx.annotation.Nullable; import com.pedro.library.base.OnlyAudioBase; -import com.pedro.library.util.client.SrtStreamClient; +import com.pedro.library.util.streamclient.SrtStreamClient; import com.pedro.srt.srt.SrtClient; import com.pedro.srt.utils.ConnectCheckerSrt; @@ -42,7 +42,7 @@ public SrtOnlyAudio(ConnectCheckerSrt connectChecker) { super(); srtClient = new SrtClient(connectChecker); srtClient.setOnlyAudio(true); - streamClient = new SrtStreamClient(srtClient); + streamClient = new SrtStreamClient(srtClient, null); } public SrtStreamClient getStreamClient() { diff --git a/library/src/main/java/com/pedro/library/srt/SrtStream.kt b/library/src/main/java/com/pedro/library/srt/SrtStream.kt index 802255262..672800544 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtStream.kt +++ b/library/src/main/java/com/pedro/library/srt/SrtStream.kt @@ -22,9 +22,10 @@ import android.os.Build import androidx.annotation.RequiresApi import com.pedro.encoder.utils.CodecUtil import com.pedro.library.base.StreamBase -import com.pedro.library.util.client.SrtStreamClient import com.pedro.library.util.sources.AudioManager import com.pedro.library.util.sources.VideoManager +import com.pedro.library.util.streamclient.SrtStreamClient +import com.pedro.library.util.streamclient.StreamClientListener import com.pedro.srt.srt.SrtClient import com.pedro.srt.srt.VideoCodec import com.pedro.srt.utils.ConnectCheckerSrt @@ -38,11 +39,13 @@ import java.nio.ByteBuffer */ @RequiresApi(Build.VERSION_CODES.LOLLIPOP) -class SrtStream(context: Context, connectCheckerRtmp: ConnectCheckerSrt, videoSource: VideoManager.Source, - audioSource: AudioManager.Source): StreamBase(context, videoSource, audioSource) { +class SrtStream( + context: Context, connectCheckerRtmp: ConnectCheckerSrt, videoSource: VideoManager.Source, + audioSource: AudioManager.Source +): StreamBase(context, videoSource, audioSource), StreamClientListener { private val srtClient = SrtClient(connectCheckerRtmp) - val streamClient = SrtStreamClient(srtClient) + val streamClient = SrtStreamClient(srtClient, this) constructor(context: Context, connectCheckerRtmp: ConnectCheckerSrt): this(context, connectCheckerRtmp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) @@ -77,18 +80,7 @@ class SrtStream(context: Context, connectCheckerRtmp: ConnectCheckerSrt, videoSo srtClient.sendAudio(aacBuffer, info) } - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - @JvmOverloads - fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { - val result = streamClient.shouldRetry(reason) - if (result) { - requestKeyframe() - streamClient.reConnect(delay, backupUrl) - } - return result + override fun onRequestKeyframe() { + requestKeyframe() } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/util/client/RtmpStreamClient.kt b/library/src/main/java/com/pedro/library/util/streamclient/RtmpStreamClient.kt similarity index 92% rename from library/src/main/java/com/pedro/library/util/client/RtmpStreamClient.kt rename to library/src/main/java/com/pedro/library/util/streamclient/RtmpStreamClient.kt index 092467dc4..ca44639bc 100644 --- a/library/src/main/java/com/pedro/library/util/client/RtmpStreamClient.kt +++ b/library/src/main/java/com/pedro/library/util/streamclient/RtmpStreamClient.kt @@ -1,4 +1,4 @@ -package com.pedro.library.util.client +package com.pedro.library.util.streamclient import com.pedro.rtmp.flv.video.ProfileIop import com.pedro.rtmp.rtmp.RtmpClient @@ -6,7 +6,10 @@ import com.pedro.rtmp.rtmp.RtmpClient /** * Created by pedro on 12/10/23. */ -class RtmpStreamClient(private val rtmpClient: RtmpClient): StreamBaseClient() { +class RtmpStreamClient( + private val rtmpClient: RtmpClient, + streamClientListener: StreamClientListener? +): StreamBaseClient(streamClientListener) { /** * H264 profile. diff --git a/library/src/main/java/com/pedro/library/util/client/RtspStreamClient.kt b/library/src/main/java/com/pedro/library/util/streamclient/RtspStreamClient.kt similarity index 89% rename from library/src/main/java/com/pedro/library/util/client/RtspStreamClient.kt rename to library/src/main/java/com/pedro/library/util/streamclient/RtspStreamClient.kt index c8d1fdbd8..d7ae77f75 100644 --- a/library/src/main/java/com/pedro/library/util/client/RtspStreamClient.kt +++ b/library/src/main/java/com/pedro/library/util/streamclient/RtspStreamClient.kt @@ -1,4 +1,4 @@ -package com.pedro.library.util.client +package com.pedro.library.util.streamclient import com.pedro.rtsp.rtsp.Protocol import com.pedro.rtsp.rtsp.RtspClient @@ -6,7 +6,10 @@ import com.pedro.rtsp.rtsp.RtspClient /** * Created by pedro on 12/10/23. */ -class RtspStreamClient(private val rtspClient: RtspClient): StreamBaseClient() { +class RtspStreamClient( + private val rtspClient: RtspClient, + streamClientListener: StreamClientListener? +): StreamBaseClient(streamClientListener) { /** diff --git a/library/src/main/java/com/pedro/library/util/client/SrtStreamClient.kt b/library/src/main/java/com/pedro/library/util/streamclient/SrtStreamClient.kt similarity index 88% rename from library/src/main/java/com/pedro/library/util/client/SrtStreamClient.kt rename to library/src/main/java/com/pedro/library/util/streamclient/SrtStreamClient.kt index 19c3b8c39..e3f983445 100644 --- a/library/src/main/java/com/pedro/library/util/client/SrtStreamClient.kt +++ b/library/src/main/java/com/pedro/library/util/streamclient/SrtStreamClient.kt @@ -1,11 +1,14 @@ -package com.pedro.library.util.client +package com.pedro.library.util.streamclient import com.pedro.srt.srt.SrtClient /** * Created by pedro on 12/10/23. */ -class SrtStreamClient(private val srtClient: SrtClient): StreamBaseClient() { +class SrtStreamClient( + private val srtClient: SrtClient, + streamClientListener: StreamClientListener? +): StreamBaseClient(streamClientListener) { override fun setAuthorization(user: String?, password: String?) { srtClient.setAuthorization(user, password) diff --git a/library/src/main/java/com/pedro/library/util/client/StreamBaseClient.kt b/library/src/main/java/com/pedro/library/util/streamclient/StreamBaseClient.kt similarity index 59% rename from library/src/main/java/com/pedro/library/util/client/StreamBaseClient.kt rename to library/src/main/java/com/pedro/library/util/streamclient/StreamBaseClient.kt index e44979977..165dc04e3 100644 --- a/library/src/main/java/com/pedro/library/util/client/StreamBaseClient.kt +++ b/library/src/main/java/com/pedro/library/util/streamclient/StreamBaseClient.kt @@ -1,9 +1,26 @@ -package com.pedro.library.util.client +package com.pedro.library.util.streamclient /** * Created by pedro on 12/10/23. */ -abstract class StreamBaseClient { +abstract class StreamBaseClient( + private val streamClientListener: StreamClientListener? +) { + + /** + * Retries to connect with the given delay. You can pass an optional backupUrl + * if you'd like to connect to your backup server instead of the original one. + * Given backupUrl replaces the original one. + */ + @JvmOverloads + fun reTry(delay: Long, reason: String, backupUrl: String? = null): Boolean { + val result = shouldRetry(reason) + if (result) { + streamClientListener?.onRequestKeyframe() + reConnect(delay, backupUrl) + } + return result + } /** * diff --git a/library/src/main/java/com/pedro/library/util/streamclient/StreamClientListener.kt b/library/src/main/java/com/pedro/library/util/streamclient/StreamClientListener.kt new file mode 100644 index 000000000..cb3a5800e --- /dev/null +++ b/library/src/main/java/com/pedro/library/util/streamclient/StreamClientListener.kt @@ -0,0 +1,8 @@ +package com.pedro.library.util.streamclient + +/** + * Created by pedro on 12/10/23. + */ +interface StreamClientListener { + fun onRequestKeyframe() +} \ No newline at end of file From 806dd6310405235a84eea47b9912f01e1c76701c Mon Sep 17 00:00:00 2001 From: pedro Date: Thu, 12 Oct 2023 23:19:22 +0200 Subject: [PATCH 3/4] hide unnecesary methods --- .../pedro/library/util/streamclient/StreamBaseClient.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/pedro/library/util/streamclient/StreamBaseClient.kt b/library/src/main/java/com/pedro/library/util/streamclient/StreamBaseClient.kt index 165dc04e3..e18271103 100644 --- a/library/src/main/java/com/pedro/library/util/streamclient/StreamBaseClient.kt +++ b/library/src/main/java/com/pedro/library/util/streamclient/StreamBaseClient.kt @@ -2,6 +2,9 @@ package com.pedro.library.util.streamclient /** * Created by pedro on 12/10/23. + * + * Provide access to rtmp/rtsp/srt client methods that is expected to be used. + * This way we can hide method that should be handled only by the library. */ abstract class StreamBaseClient( private val streamClientListener: StreamClientListener? @@ -28,8 +31,8 @@ abstract class StreamBaseClient( * @param password auth. */ abstract fun setAuthorization(user: String?, password: String?) - abstract fun shouldRetry(reason: String): Boolean - abstract fun reConnect(delay: Long, backupUrl: String?) + protected abstract fun shouldRetry(reason: String): Boolean + protected abstract fun reConnect(delay: Long, backupUrl: String?) abstract fun setReTries(reTries: Int) abstract fun hasCongestion(): Boolean abstract fun setLogs(enabled: Boolean) From d07a9bbece49943afc3697994af5667ef29f5149 Mon Sep 17 00:00:00 2001 From: pedro Date: Thu, 12 Oct 2023 23:35:37 +0200 Subject: [PATCH 4/4] hide onRequestKeyframe --- .../com/pedro/library/rtmp/RtmpCamera1.java | 18 +++++++----------- .../com/pedro/library/rtmp/RtmpCamera2.java | 18 +++++++----------- .../com/pedro/library/rtmp/RtmpDisplay.java | 10 +++------- .../com/pedro/library/rtmp/RtmpFromFile.java | 16 ++++++---------- .../com/pedro/library/rtmp/RtmpOnlyAudio.java | 13 ------------- .../java/com/pedro/library/rtmp/RtmpStream.kt | 13 +++++++------ .../com/pedro/library/rtsp/RtspCamera1.java | 18 +++++++----------- .../com/pedro/library/rtsp/RtspCamera2.java | 18 +++++++----------- .../com/pedro/library/rtsp/RtspDisplay.java | 10 +++------- .../com/pedro/library/rtsp/RtspFromFile.java | 16 ++++++---------- .../com/pedro/library/rtsp/RtspOnlyAudio.java | 13 ------------- .../java/com/pedro/library/rtsp/RtspStream.kt | 13 +++++++------ .../java/com/pedro/library/srt/SrtCamera1.java | 18 +++++++----------- .../java/com/pedro/library/srt/SrtCamera2.java | 18 +++++++----------- .../java/com/pedro/library/srt/SrtDisplay.java | 10 +++------- .../com/pedro/library/srt/SrtFromFile.java | 16 ++++++---------- .../com/pedro/library/srt/SrtOnlyAudio.java | 13 ------------- .../java/com/pedro/library/srt/SrtStream.kt | 13 +++++++------ 18 files changed, 90 insertions(+), 174 deletions(-) diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java index e2a989bbc..5b5e91f36 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java @@ -43,42 +43,43 @@ * Created by pedro on 25/01/17. */ -public class RtmpCamera1 extends Camera1Base implements StreamClientListener { +public class RtmpCamera1 extends Camera1Base { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public RtmpCamera1(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { super(surfaceView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpCamera1(TextureView textureView, ConnectCheckerRtmp connectChecker) { super(textureView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { super(openGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { super(lightOpenGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtmpCamera1(Context context, ConnectCheckerRtmp connectChecker) { super(context); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpStreamClient getStreamClient() { @@ -128,9 +129,4 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { rtmpClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java index cc50ea590..da69f3216 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java @@ -43,10 +43,11 @@ * Created by pedro on 6/07/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtmpCamera2 extends Camera2Base implements StreamClientListener { +public class RtmpCamera2 extends Camera2Base { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; /** * @deprecated This view produce rotations problems and could be unsupported in future versions. @@ -57,7 +58,7 @@ public class RtmpCamera2 extends Camera2Base implements StreamClientListener { public RtmpCamera2(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { super(surfaceView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } /** @@ -69,25 +70,25 @@ public RtmpCamera2(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { public RtmpCamera2(TextureView textureView, ConnectCheckerRtmp connectChecker) { super(textureView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpCamera2(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { super(openGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { super(lightOpenGlView); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpCamera2(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { super(context, useOpengl); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpStreamClient getStreamClient() { @@ -137,10 +138,5 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { rtmpClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java index b10f3a9d3..861931102 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java @@ -39,15 +39,16 @@ * Created by pedro on 9/08/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtmpDisplay extends DisplayBase implements StreamClientListener { +public class RtmpDisplay extends DisplayBase { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public RtmpDisplay(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { super(context, useOpengl); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpStreamClient getStreamClient() { @@ -96,9 +97,4 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { rtmpClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java index 17a428630..668d56425 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java @@ -43,37 +43,38 @@ * Created by pedro on 26/06/17. */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class RtmpFromFile extends FromFileBase implements StreamClientListener { +public class RtmpFromFile extends FromFileBase { private final RtmpClient rtmpClient; private final RtmpStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public RtmpFromFile(ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpFromFile(Context context, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpFromFile(OpenGlView openGlView, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, this); + streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); } public RtmpStreamClient getStreamClient() { @@ -122,9 +123,4 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java index f7c626336..52432e42d 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java @@ -68,17 +68,4 @@ protected void stopStreamRtp() { protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtmpClient.sendAudio(aacBuffer, info); } - - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - streamClient.reConnect(delay, backupUrl); - } - return result; - } } diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt index 51ada3ec2..462cc5aef 100644 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpStream.kt @@ -26,10 +26,15 @@ import java.nio.ByteBuffer class RtmpStream( context: Context, connectCheckerRtmp: ConnectCheckerRtmp, videoSource: VideoManager.Source, audioSource: AudioManager.Source -): StreamBase(context, videoSource, audioSource), StreamClientListener { +): StreamBase(context, videoSource, audioSource) { private val rtmpClient = RtmpClient(connectCheckerRtmp) - val streamClient = RtmpStreamClient(rtmpClient, this) + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyframe() + } + } + val streamClient = RtmpStreamClient(rtmpClient, streamClientListener) constructor(context: Context, connectCheckerRtmp: ConnectCheckerRtmp): this(context, connectCheckerRtmp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) @@ -66,8 +71,4 @@ class RtmpStream( override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { rtmpClient.sendAudio(aacBuffer, info) } - - override fun onRequestKeyframe() { - requestKeyframe() - } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java index 3d83722bb..bf10cf2fa 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java @@ -43,42 +43,43 @@ * Created by pedro on 10/02/17. */ -public class RtspCamera1 extends Camera1Base implements StreamClientListener { +public class RtspCamera1 extends Camera1Base { private final RtspClient rtspClient; private final RtspStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public RtspCamera1(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { super(surfaceView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspCamera1(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { super(textureView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(openGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(lightOpenGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public RtspCamera1(Context context, ConnectCheckerRtsp connectCheckerRtsp) { super(context); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspStreamClient getStreamClient() { @@ -122,9 +123,4 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { rtspClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java index 263aaef14..98ef67aaf 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java @@ -43,10 +43,11 @@ * Created by pedro on 4/06/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtspCamera2 extends Camera2Base implements StreamClientListener { +public class RtspCamera2 extends Camera2Base { private final RtspClient rtspClient; private final RtspStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; /** * @deprecated This view produce rotations problems and could be unsupported in future versions. @@ -57,7 +58,7 @@ public class RtspCamera2 extends Camera2Base implements StreamClientListener { public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { super(surfaceView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } /** @@ -69,25 +70,25 @@ public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRts public RtspCamera2(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { super(textureView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspCamera2(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(openGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { super(lightOpenGlView); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspCamera2(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { super(context, useOpengl); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspStreamClient getStreamClient() { @@ -130,10 +131,5 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { rtspClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java index 1ee60b131..bb109a257 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java @@ -39,15 +39,16 @@ * Created by pedro on 9/08/17. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtspDisplay extends DisplayBase implements StreamClientListener { +public class RtspDisplay extends DisplayBase { private final RtspClient rtspClient; private final RtspStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public RtspDisplay(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { super(context, useOpengl); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspStreamClient getStreamClient() { @@ -89,9 +90,4 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { rtspClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java index ae55ce5b1..a97ca3303 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java @@ -43,37 +43,38 @@ * Created by pedro on 4/06/17. */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class RtspFromFile extends FromFileBase implements StreamClientListener { +public class RtspFromFile extends FromFileBase { private final RtspClient rtspClient; private final RtspStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public RtspFromFile(ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspFromFile(Context context, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspFromFile(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); rtspClient = new RtspClient(connectCheckerRtsp); - streamClient = new RtspStreamClient(rtspClient, this); + streamClient = new RtspStreamClient(rtspClient, streamClientListener); } public RtspStreamClient getStreamClient() { @@ -116,10 +117,5 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java index 1819a8895..3bfd99d97 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java @@ -68,17 +68,4 @@ protected void stopStreamRtp() { protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { rtspClient.sendAudio(aacBuffer, info); } - - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - streamClient.reConnect(delay, backupUrl); - } - return result; - } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt b/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt index 28a4d5e62..81018f4e2 100644 --- a/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt +++ b/library/src/main/java/com/pedro/library/rtsp/RtspStream.kt @@ -26,10 +26,15 @@ import java.nio.ByteBuffer class RtspStream( context: Context, connectCheckerRtsp: ConnectCheckerRtsp, videoSource: VideoManager.Source, audioSource: AudioManager.Source -): StreamBase(context, videoSource, audioSource), StreamClientListener { +): StreamBase(context, videoSource, audioSource) { private val rtspClient = RtspClient(connectCheckerRtsp) - val streamClient = RtspStreamClient(rtspClient, this) + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyframe() + } + } + val streamClient = RtspStreamClient(rtspClient, streamClientListener) constructor(context: Context, connectCheckerRtsp: ConnectCheckerRtsp): this(context, connectCheckerRtsp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) @@ -62,8 +67,4 @@ class RtspStream( override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { rtspClient.sendAudio(aacBuffer, info) } - - override fun onRequestKeyframe() { - requestKeyframe() - } } \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java b/library/src/main/java/com/pedro/library/srt/SrtCamera1.java index d8d554688..7d91a7456 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera1.java @@ -43,42 +43,43 @@ * Created by pedro on 8/9/23. */ -public class SrtCamera1 extends Camera1Base implements StreamClientListener { +public class SrtCamera1 extends Camera1Base { private final SrtClient srtClient; private final SrtStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public SrtCamera1(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { super(surfaceView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtCamera1(TextureView textureView, ConnectCheckerSrt connectChecker) { super(textureView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(OpenGlView openGlView, ConnectCheckerSrt connectChecker) { super(openGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker) { super(lightOpenGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) public SrtCamera1(Context context, ConnectCheckerSrt connectChecker) { super(context); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtStreamClient getStreamClient() { @@ -122,9 +123,4 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { srtClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java b/library/src/main/java/com/pedro/library/srt/SrtCamera2.java index b53268d74..088fddabe 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera2.java @@ -43,10 +43,11 @@ * Created by pedro on 8/9/23. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class SrtCamera2 extends Camera2Base implements StreamClientListener { +public class SrtCamera2 extends Camera2Base { private final SrtClient srtClient; private final SrtStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; /** * @deprecated This view produce rotations problems and could be unsupported in future versions. @@ -57,7 +58,7 @@ public class SrtCamera2 extends Camera2Base implements StreamClientListener { public SrtCamera2(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { super(surfaceView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } /** @@ -69,25 +70,25 @@ public SrtCamera2(SurfaceView surfaceView, ConnectCheckerSrt connectChecker) { public SrtCamera2(TextureView textureView, ConnectCheckerSrt connectChecker) { super(textureView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtCamera2(OpenGlView openGlView, ConnectCheckerSrt connectChecker) { super(openGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker) { super(lightOpenGlView); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtCamera2(Context context, boolean useOpengl, ConnectCheckerSrt connectChecker) { super(context, useOpengl); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtStreamClient getStreamClient() { @@ -131,10 +132,5 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { srtClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java b/library/src/main/java/com/pedro/library/srt/SrtDisplay.java index ab6007ebe..f1d7d0796 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java +++ b/library/src/main/java/com/pedro/library/srt/SrtDisplay.java @@ -39,15 +39,16 @@ * Created by pedro on 8/9/23. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class SrtDisplay extends DisplayBase implements StreamClientListener { +public class SrtDisplay extends DisplayBase { private final SrtClient srtClient; private final SrtStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public SrtDisplay(Context context, boolean useOpengl, ConnectCheckerSrt connectChecker) { super(context, useOpengl); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public void setVideoCodec(VideoCodec videoCodec) { @@ -90,9 +91,4 @@ protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { srtClient.sendVideo(h264Buffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java b/library/src/main/java/com/pedro/library/srt/SrtFromFile.java index 55f1161fb..7bf129dda 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java +++ b/library/src/main/java/com/pedro/library/srt/SrtFromFile.java @@ -43,37 +43,38 @@ * Created by pedro on 8/9/23. */ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class SrtFromFile extends FromFileBase implements StreamClientListener { +public class SrtFromFile extends FromFileBase { private final SrtClient srtClient; private final SrtStreamClient streamClient; + private final StreamClientListener streamClientListener = this::requestKeyFrame; public SrtFromFile(ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtFromFile(Context context, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(context, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtFromFile(OpenGlView openGlView, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(openGlView, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public SrtFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerSrt connectChecker, VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, this); + streamClient = new SrtStreamClient(srtClient, streamClientListener); } public void setVideoCodec(VideoCodec videoCodec) { @@ -116,9 +117,4 @@ protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { srtClient.sendAudio(aacBuffer, info); } - - @Override - public void onRequestKeyframe() { - requestKeyFrame(); - } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java index 9c03831a6..5278830e5 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java +++ b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java @@ -68,17 +68,4 @@ protected void stopStreamRtp() { protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { srtClient.sendAudio(aacBuffer, info); } - - /** - * Retries to connect with the given delay. You can pass an optional backupUrl - * if you'd like to connect to your backup server instead of the original one. - * Given backupUrl replaces the original one. - */ - public boolean reTry(long delay, String reason, @Nullable String backupUrl) { - boolean result = streamClient.shouldRetry(reason); - if (result) { - streamClient.reConnect(delay, backupUrl); - } - return result; - } } diff --git a/library/src/main/java/com/pedro/library/srt/SrtStream.kt b/library/src/main/java/com/pedro/library/srt/SrtStream.kt index 672800544..5bb3bead2 100644 --- a/library/src/main/java/com/pedro/library/srt/SrtStream.kt +++ b/library/src/main/java/com/pedro/library/srt/SrtStream.kt @@ -42,10 +42,15 @@ import java.nio.ByteBuffer class SrtStream( context: Context, connectCheckerRtmp: ConnectCheckerSrt, videoSource: VideoManager.Source, audioSource: AudioManager.Source -): StreamBase(context, videoSource, audioSource), StreamClientListener { +): StreamBase(context, videoSource, audioSource) { private val srtClient = SrtClient(connectCheckerRtmp) - val streamClient = SrtStreamClient(srtClient, this) + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyframe() + } + } + val streamClient = SrtStreamClient(srtClient, streamClientListener) constructor(context: Context, connectCheckerRtmp: ConnectCheckerSrt): this(context, connectCheckerRtmp, VideoManager.Source.CAMERA2, AudioManager.Source.MICROPHONE) @@ -79,8 +84,4 @@ class SrtStream( override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { srtClient.sendAudio(aacBuffer, info) } - - override fun onRequestKeyframe() { - requestKeyframe() - } } \ No newline at end of file