|
|
|
@ -84,6 +84,9 @@ class OpusAudioManager { |
|
|
|
// Opus解码器实例 |
|
|
|
private var opusManager: OpusManager? = null |
|
|
|
private var option: OpusOption? = null |
|
|
|
|
|
|
|
private var opusManager1: OpusManager? = null |
|
|
|
private var option1: OpusOption? = null |
|
|
|
private val mainHandler = Handler(Looper.getMainLooper()) |
|
|
|
|
|
|
|
// 解码音频数据队列和处理线程 |
|
|
|
@ -124,6 +127,9 @@ class OpusAudioManager { |
|
|
|
opusManager = OpusManager() |
|
|
|
option = OpusOption() |
|
|
|
|
|
|
|
opusManager1 = OpusManager() |
|
|
|
option1 = OpusOption() |
|
|
|
|
|
|
|
// 启动队列处理 |
|
|
|
startAudioQueueProcessing() |
|
|
|
|
|
|
|
@ -174,6 +180,8 @@ class OpusAudioManager { |
|
|
|
// 清理Opus相关资源 |
|
|
|
opusManager = null |
|
|
|
option = null |
|
|
|
opusManager1 = null |
|
|
|
option1 = null |
|
|
|
callback = null |
|
|
|
|
|
|
|
isInitialized = false |
|
|
|
@ -312,20 +320,27 @@ class OpusAudioManager { |
|
|
|
* @return 是否成功开始编码 |
|
|
|
*/ |
|
|
|
fun startEncodeStream(): Boolean { |
|
|
|
if (!isInitialized || opusManager == null) { |
|
|
|
if (!isInitialized || opusManager1 == null) { |
|
|
|
Log.e(TAG, "OpusManager未初始化,无法开始编码") |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
// 如果已经在编码流,先停止 |
|
|
|
if (opusManager?.isEncodeStream == true) { |
|
|
|
if (opusManager1?.isEncodeStream == true) { |
|
|
|
Log.d(TAG, "Opus编码流已在运行") |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 配置解码参数 |
|
|
|
option1?.apply { |
|
|
|
setHasHead(false) |
|
|
|
setChannel(1) |
|
|
|
setSampleRate(16000) |
|
|
|
setPacketSize(40) |
|
|
|
} |
|
|
|
try { |
|
|
|
Log.d(TAG, "准备开始Opus数据流编码") |
|
|
|
opusManager?.startEncodeStream(object : OnEncodeStreamCallback { |
|
|
|
opusManager1?.startEncodeStream(object : OnEncodeStreamCallback { |
|
|
|
override fun onEncodeStream(data: ByteArray?) { |
|
|
|
Log.d(TAG, "Opus编码回调收到数据,大小: ${data?.size ?: 0} bytes") |
|
|
|
if (data != null) { |
|
|
|
@ -371,8 +386,8 @@ class OpusAudioManager { |
|
|
|
* @return 是否成功停止编码 |
|
|
|
*/ |
|
|
|
fun stopEncodeStream(): Boolean { |
|
|
|
if (opusManager?.isEncodeStream == true) { |
|
|
|
opusManager?.stopEncodeStream() |
|
|
|
if (opusManager1?.isEncodeStream == true) { |
|
|
|
opusManager1?.stopEncodeStream() |
|
|
|
stopAudioSendThread() // 停止音频发送线程 |
|
|
|
Log.i(TAG, "已停止Opus数据流编码") |
|
|
|
callback?.onEncodeStreamStateChanged(false) |
|
|
|
@ -389,16 +404,16 @@ class OpusAudioManager { |
|
|
|
* @param data 音频数据字节数组,通常为PCM格式 |
|
|
|
*/ |
|
|
|
fun writeExternalAudioData(data: ByteArray) { |
|
|
|
if (!isInitialized || opusManager == null) { |
|
|
|
if (!isInitialized || opusManager1 == null) { |
|
|
|
Log.e(TAG, "OpusManager未初始化") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// 如果已经在编码流中,直接写入数据 |
|
|
|
if (opusManager?.isEncodeStream == true) { |
|
|
|
if (opusManager1?.isEncodeStream == true) { |
|
|
|
Log.d(TAG, "正在进行Opus编码流,写入音频数据") |
|
|
|
// 将外部音频数据写入编码流 |
|
|
|
opusManager?.writeEncodeStream(data) |
|
|
|
opusManager1?.writeEncodeStream(data) |
|
|
|
} else { |
|
|
|
Log.w(TAG, "Opus编码流未启动,无法写入音频数据") |
|
|
|
} |
|
|
|
@ -421,7 +436,7 @@ class OpusAudioManager { |
|
|
|
* @return 是否正在编码 |
|
|
|
*/ |
|
|
|
fun isEncoding(): Boolean { |
|
|
|
return opusManager?.isEncodeStream == true |
|
|
|
return opusManager1?.isEncodeStream == true |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
|