Skip to content

Commit fb090cd

Browse files
committed
add rtmp opus support and record opus flv files
1 parent 7e0f4b1 commit fb090cd

4 files changed

Lines changed: 17 additions & 23 deletions

File tree

app/src/main/java/com/pedro/streamer/rotation/CameraFragment.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,12 @@ import android.widget.ImageView
2929
import android.widget.TextView
3030
import androidx.annotation.RequiresApi
3131
import androidx.fragment.app.Fragment
32-
import com.pedro.common.AudioCodec
3332
import com.pedro.common.ConnectChecker
3433
import com.pedro.encoder.input.sources.video.Camera1Source
3534
import com.pedro.encoder.input.sources.video.Camera2Source
3635
import com.pedro.extrasources.CameraXSource
3736
import com.pedro.library.base.recording.RecordController
3837
import com.pedro.library.generic.GenericStream
39-
import com.pedro.library.rtmp.RtmpStream
4038
import com.pedro.library.util.BitrateAdapter
4139
import com.pedro.streamer.R
4240
import com.pedro.streamer.utils.PathUtils
@@ -76,10 +74,9 @@ class CameraFragment: Fragment(), ConnectChecker {
7674
fun getInstance(): CameraFragment = CameraFragment()
7775
}
7876

79-
val genericStream: RtmpStream by lazy {
80-
RtmpStream(requireContext(), this).apply {
77+
val genericStream: GenericStream by lazy {
78+
GenericStream(requireContext(), this).apply {
8179
getGlInterface().autoHandleOrientation = true
82-
setAudioCodec(AudioCodec.OPUS)
8380
}
8481
}
8582
private lateinit var surfaceView: SurfaceView

library/src/main/java/com/pedro/library/util/FlvMuxerRecordController.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.pedro.rtmp.flv.FlvType
2424
import com.pedro.rtmp.flv.audio.AudioFormat
2525
import com.pedro.rtmp.flv.audio.packet.AacPacket
2626
import com.pedro.rtmp.flv.audio.packet.G711Packet
27+
import com.pedro.rtmp.flv.audio.packet.OpusPacket
2728
import com.pedro.rtmp.flv.video.VideoFormat
2829
import com.pedro.rtmp.flv.video.packet.Av1Packet
2930
import com.pedro.rtmp.flv.video.packet.H264Packet
@@ -39,7 +40,6 @@ import kotlinx.coroutines.runInterruptible
3940
import java.io.ByteArrayOutputStream
4041
import java.io.FileDescriptor
4142
import java.io.FileOutputStream
42-
import java.io.IOException
4343
import java.io.OutputStream
4444
import java.nio.ByteBuffer
4545
import java.util.concurrent.LinkedBlockingQueue
@@ -72,13 +72,10 @@ class FlvMuxerRecordController: BaseRecordController() {
7272
}
7373

7474
private fun start(listener: RecordController.Listener?) {
75-
if (audioCodec == AudioCodec.OPUS) throw IOException("Unsupported AudioCodec: " + audioCodec.name)
76-
when (audioCodec) {
77-
AudioCodec.G711 -> audioPacket = G711Packet()
78-
AudioCodec.AAC -> audioPacket = AacPacket().apply {
79-
sendAudioInfo(sampleRate, isStereo)
80-
}
81-
else -> {}
75+
audioPacket = when (audioCodec) {
76+
AudioCodec.G711 -> G711Packet()
77+
AudioCodec.AAC -> AacPacket().apply { sendAudioInfo(sampleRate, isStereo) }
78+
AudioCodec.OPUS -> OpusPacket().apply { sendAudioInfo(sampleRate, isStereo) }
8279
}
8380
videoPacket = when (videoCodec) {
8481
VideoCodec.H264 -> H264Packet()
@@ -295,7 +292,7 @@ class FlvMuxerRecordController: BaseRecordController() {
295292
val audioCodecValue = when (audioCodec) {
296293
AudioCodec.AAC -> AudioFormat.AAC.value
297294
AudioCodec.G711 -> AudioFormat.G711_A.value
298-
else -> throw IllegalArgumentException("unsupported null codec")
295+
AudioCodec.OPUS -> AudioFormat.OPUS.value
299296
}
300297
info.setProperty("audiocodecid", audioCodecValue.toDouble())
301298
info.setProperty("audiosamplerate", sampleRate.toDouble())

rtmp/src/main/java/com/pedro/rtmp/flv/audio/config/OpusAudioSpecificConfig.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ class OpusAudioSpecificConfig(private val sampleRate: Int, private val channels:
2626
val size = 19
2727

2828
fun write(buffer: ByteArray, offset: Int) {
29-
buffer[offset] = "O".toByte()
30-
buffer[offset + 1] = "p".toByte()
31-
buffer[offset + 2] = "u".toByte()
32-
buffer[offset + 3] = "s".toByte()
33-
buffer[offset + 4] = "H".toByte()
34-
buffer[offset + 5] = "e".toByte()
35-
buffer[offset + 6] = "a".toByte()
36-
buffer[offset + 7] = "d".toByte()
29+
buffer[offset] = 'O'.code.toByte()
30+
buffer[offset + 1] = 'p'.code.toByte()
31+
buffer[offset + 2] = 'u'.code.toByte()
32+
buffer[offset + 3] = 's'.code.toByte()
33+
buffer[offset + 4] = 'H'.code.toByte()
34+
buffer[offset + 5] = 'e'.code.toByte()
35+
buffer[offset + 6] = 'a'.code.toByte()
36+
buffer[offset + 7] = 'd'.code.toByte()
3737
buffer[offset + 8] = 0x01 //version 1
3838
buffer[offset + 9] = channels.toByte()
3939
val preSkip = 3840 //this is the recommended value by the RFC

rtmp/src/main/java/com/pedro/rtmp/flv/audio/packet/OpusPacket.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class OpusPacket: BasePacket() {
5050
val ts = mediaFrame.info.timestamp / 1000
5151

5252
//header is 5 bytes length:
53-
//mark first byte as extended header
53+
//mark first byte as extended header and packet type
5454
//4 bytes codec type
5555
val codec = AudioFormat.OPUS.value // { "O", "p", "u", "s" }
5656
header[1] = (codec shr 24).toByte()

0 commit comments

Comments
 (0)