Skip to content

Commit

Permalink
Merge pull request #1423 from pedroSG94/feature/udp-support
Browse files Browse the repository at this point in the history
Feature/udp support
  • Loading branch information
pedroSG94 committed Mar 8, 2024
2 parents 573a9d1 + 6c149a5 commit 7673251
Show file tree
Hide file tree
Showing 33 changed files with 1,709 additions and 113 deletions.
7 changes: 7 additions & 0 deletions README.md
Expand Up @@ -118,6 +118,13 @@ dependencies {
- [X] Encrypt (AES128, AES192 and AES256)
- [ ] SRT auth.

### UDP (beta):

- [X] Get upload bandwidth used.
- [X] H264, H265, AAC and OPUS support.
- [X] Unicast, Multicast and Broadcast support.
- [X] MPEG2-TS support.

https://haivision.github.io/srt-rfc/draft-sharabayko-srt.html


Expand Down
1 change: 1 addition & 0 deletions library/build.gradle.kts
Expand Up @@ -58,5 +58,6 @@ dependencies {
api(project(":rtmp"))
api(project(":rtsp"))
api(project(":srt"))
api(project(":udp"))
api(project(":common"))
}
Expand Up @@ -17,5 +17,5 @@
package com.pedro.library.generic

internal enum class ClientType {
NONE, RTMP, RTSP, SRT
NONE, RTMP, RTSP, SRT, UDP
}
47 changes: 25 additions & 22 deletions library/src/main/java/com/pedro/library/generic/GenericCamera1.kt
Expand Up @@ -31,10 +31,12 @@ import com.pedro.library.util.streamclient.RtmpStreamClient
import com.pedro.library.util.streamclient.RtspStreamClient
import com.pedro.library.util.streamclient.SrtStreamClient
import com.pedro.library.util.streamclient.StreamClientListener
import com.pedro.library.util.streamclient.UdpStreamClient
import com.pedro.library.view.OpenGlView
import com.pedro.rtmp.rtmp.RtmpClient
import com.pedro.rtsp.rtsp.RtspClient
import com.pedro.srt.srt.SrtClient
import com.pedro.udp.UdpClient
import java.nio.ByteBuffer
import java.util.Locale

Expand All @@ -52,6 +54,7 @@ class GenericCamera1: Camera1Base {
private lateinit var rtmpClient: RtmpClient
private lateinit var rtspClient: RtspClient
private lateinit var srtClient: SrtClient
private lateinit var udpClient: UdpClient
private lateinit var streamClient: GenericStreamClient
private lateinit var connectChecker: ConnectChecker
private var connectedType = ClientType.NONE
Expand Down Expand Up @@ -79,10 +82,12 @@ class GenericCamera1: Camera1Base {
rtmpClient = RtmpClient(connectChecker)
rtspClient = RtspClient(connectChecker)
srtClient = SrtClient(connectChecker)
udpClient = UdpClient(connectChecker)
streamClient = GenericStreamClient(
RtmpStreamClient(rtmpClient, streamClientListener),
RtspStreamClient(rtspClient, streamClientListener),
SrtStreamClient(srtClient, streamClientListener)
SrtStreamClient(srtClient, streamClientListener),
UdpStreamClient(udpClient, streamClientListener),
)
}

Expand All @@ -97,6 +102,7 @@ class GenericCamera1: Camera1Base {
rtmpClient.setVideoCodec(codec)
rtspClient.setVideoCodec(codec)
srtClient.setVideoCodec(codec)
udpClient.setVideoCodec(codec)
}

override fun setAudioCodecImp(codec: AudioCodec) {
Expand All @@ -106,55 +112,49 @@ class GenericCamera1: Camera1Base {
rtmpClient.setAudioCodec(codec)
rtspClient.setAudioCodec(codec)
srtClient.setAudioCodec(codec)
udpClient.setAudioCodec(codec)
}

override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) {
rtmpClient.setAudioInfo(sampleRate, isStereo)
rtspClient.setAudioInfo(sampleRate, isStereo)
srtClient.setAudioInfo(sampleRate, isStereo)
udpClient.setAudioInfo(sampleRate, isStereo)
}

override fun startStreamRtp(url: String) {
streamClient.connecting(url)
if (url.lowercase(Locale.getDefault()).startsWith("rtmp")) {
connectedType = ClientType.RTMP
startStreamRtpRtmp(url)
if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) {
rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width)
} else {
rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height)
}
rtmpClient.setFps(videoEncoder.fps)
rtmpClient.connect(url)
} else if (url.lowercase(Locale.getDefault()).startsWith("rtsp")) {
connectedType = ClientType.RTSP
startStreamRtpRtsp(url)
rtspClient.connect(url)
} else if (url.lowercase(Locale.getDefault()).startsWith("srt")) {
connectedType = ClientType.SRT
startStreamRtpSrt(url)
srtClient.connect(url)
} else if (url.lowercase(Locale.getDefault()).startsWith("udp")) {
connectedType = ClientType.UDP
udpClient.connect(url)
} else {
onMainThreadHandler {
connectChecker.onConnectionFailed("Unsupported protocol. Only support rtmp, rtsp and srt")
}
}
}

private fun startStreamRtpRtmp(url: String) {
if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) {
rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width)
} else {
rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height)
}
rtmpClient.setFps(videoEncoder.fps)
rtmpClient.connect(url)
}

private fun startStreamRtpRtsp(url: String) {
rtspClient.connect(url)
}

private fun startStreamRtpSrt(url: String) {
srtClient.connect(url)
}

override fun stopStreamRtp() {
when (connectedType) {
ClientType.RTMP -> rtmpClient.disconnect()
ClientType.RTSP -> rtspClient.disconnect()
ClientType.SRT -> srtClient.disconnect()
ClientType.UDP -> udpClient.disconnect()
else -> {}
}
connectedType = ClientType.NONE
Expand All @@ -165,6 +165,7 @@ class GenericCamera1: Camera1Base {
ClientType.RTMP -> rtmpClient.sendAudio(aacBuffer, info)
ClientType.RTSP -> rtspClient.sendAudio(aacBuffer, info)
ClientType.SRT -> srtClient.sendAudio(aacBuffer, info)
ClientType.UDP -> udpClient.sendAudio(aacBuffer, info)
else -> {}
}
}
Expand All @@ -173,13 +174,15 @@ class GenericCamera1: Camera1Base {
rtmpClient.setVideoInfo(sps, pps, vps)
rtspClient.setVideoInfo(sps, pps, vps)
srtClient.setVideoInfo(sps, pps, vps)
udpClient.setVideoInfo(sps, pps, vps)
}

override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) {
when (connectedType) {
ClientType.RTMP -> rtmpClient.sendVideo(h264Buffer, info)
ClientType.RTSP -> rtspClient.sendVideo(h264Buffer, info)
ClientType.SRT -> srtClient.sendVideo(h264Buffer, info)
ClientType.UDP -> udpClient.sendVideo(h264Buffer, info)
else -> {}
}
}
Expand Down
47 changes: 25 additions & 22 deletions library/src/main/java/com/pedro/library/generic/GenericCamera2.kt
Expand Up @@ -31,10 +31,12 @@ import com.pedro.library.util.streamclient.RtmpStreamClient
import com.pedro.library.util.streamclient.RtspStreamClient
import com.pedro.library.util.streamclient.SrtStreamClient
import com.pedro.library.util.streamclient.StreamClientListener
import com.pedro.library.util.streamclient.UdpStreamClient
import com.pedro.library.view.OpenGlView
import com.pedro.rtmp.rtmp.RtmpClient
import com.pedro.rtsp.rtsp.RtspClient
import com.pedro.srt.srt.SrtClient
import com.pedro.udp.UdpClient
import java.nio.ByteBuffer
import java.util.Locale

Expand All @@ -53,6 +55,7 @@ class GenericCamera2: Camera2Base {
private lateinit var rtmpClient: RtmpClient
private lateinit var rtspClient: RtspClient
private lateinit var srtClient: SrtClient
private lateinit var udpClient: UdpClient
private lateinit var streamClient: GenericStreamClient
private lateinit var connectChecker: ConnectChecker
private var connectedType = ClientType.NONE
Expand Down Expand Up @@ -80,10 +83,12 @@ class GenericCamera2: Camera2Base {
rtmpClient = RtmpClient(connectChecker)
rtspClient = RtspClient(connectChecker)
srtClient = SrtClient(connectChecker)
udpClient = UdpClient(connectChecker)
streamClient = GenericStreamClient(
RtmpStreamClient(rtmpClient, streamClientListener),
RtspStreamClient(rtspClient, streamClientListener),
SrtStreamClient(srtClient, streamClientListener)
SrtStreamClient(srtClient, streamClientListener),
UdpStreamClient(udpClient, streamClientListener),
)
}

Expand All @@ -98,6 +103,7 @@ class GenericCamera2: Camera2Base {
rtmpClient.setVideoCodec(codec)
rtspClient.setVideoCodec(codec)
srtClient.setVideoCodec(codec)
udpClient.setVideoCodec(codec)
}

override fun setAudioCodecImp(codec: AudioCodec) {
Expand All @@ -107,55 +113,49 @@ class GenericCamera2: Camera2Base {
rtmpClient.setAudioCodec(codec)
rtspClient.setAudioCodec(codec)
srtClient.setAudioCodec(codec)
udpClient.setAudioCodec(codec)
}

override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) {
rtmpClient.setAudioInfo(sampleRate, isStereo)
rtspClient.setAudioInfo(sampleRate, isStereo)
srtClient.setAudioInfo(sampleRate, isStereo)
udpClient.setAudioInfo(sampleRate, isStereo)
}

override fun startStreamRtp(url: String) {
streamClient.connecting(url)
if (url.lowercase(Locale.getDefault()).startsWith("rtmp")) {
connectedType = ClientType.RTMP
startStreamRtpRtmp(url)
if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) {
rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width)
} else {
rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height)
}
rtmpClient.setFps(videoEncoder.fps)
rtmpClient.connect(url)
} else if (url.lowercase(Locale.getDefault()).startsWith("rtsp")) {
connectedType = ClientType.RTSP
startStreamRtpRtsp(url)
rtspClient.connect(url)
} else if (url.lowercase(Locale.getDefault()).startsWith("srt")) {
connectedType = ClientType.SRT
startStreamRtpSrt(url)
srtClient.connect(url)
} else if (url.lowercase(Locale.getDefault()).startsWith("udp")) {
connectedType = ClientType.UDP
udpClient.connect(url)
} else {
onMainThreadHandler {
connectChecker.onConnectionFailed("Unsupported protocol. Only support rtmp, rtsp and srt")
}
}
}

private fun startStreamRtpRtmp(url: String) {
if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) {
rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width)
} else {
rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height)
}
rtmpClient.setFps(videoEncoder.fps)
rtmpClient.connect(url)
}

private fun startStreamRtpRtsp(url: String) {
rtspClient.connect(url)
}

private fun startStreamRtpSrt(url: String) {
srtClient.connect(url)
}

override fun stopStreamRtp() {
when (connectedType) {
ClientType.RTMP -> rtmpClient.disconnect()
ClientType.RTSP -> rtspClient.disconnect()
ClientType.SRT -> srtClient.disconnect()
ClientType.UDP -> udpClient.disconnect()
else -> {}
}
connectedType = ClientType.NONE
Expand All @@ -166,6 +166,7 @@ class GenericCamera2: Camera2Base {
ClientType.RTMP -> rtmpClient.sendAudio(aacBuffer, info)
ClientType.RTSP -> rtspClient.sendAudio(aacBuffer, info)
ClientType.SRT -> srtClient.sendAudio(aacBuffer, info)
ClientType.UDP -> udpClient.sendAudio(aacBuffer, info)
else -> {}
}
}
Expand All @@ -174,13 +175,15 @@ class GenericCamera2: Camera2Base {
rtmpClient.setVideoInfo(sps, pps, vps)
rtspClient.setVideoInfo(sps, pps, vps)
srtClient.setVideoInfo(sps, pps, vps)
udpClient.setVideoInfo(sps, pps, vps)
}

override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) {
when (connectedType) {
ClientType.RTMP -> rtmpClient.sendVideo(h264Buffer, info)
ClientType.RTSP -> rtspClient.sendVideo(h264Buffer, info)
ClientType.SRT -> srtClient.sendVideo(h264Buffer, info)
ClientType.UDP -> udpClient.sendVideo(h264Buffer, info)
else -> {}
}
}
Expand Down

0 comments on commit 7673251

Please sign in to comment.