Browse Source

上传音频文件逻辑代码

newdev_chengguofeng
liwei1dao 3 months ago
parent
commit
1ec93671b8
  1. 44
      local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/OpusAudioManager.kt

44
local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/OpusAudioManager.kt

@ -9,9 +9,6 @@ import com.jieli.jl_audio_decode.callback.OnDecodeStreamCallback
import com.jieli.jl_audio_decode.callback.OnEncodeStreamCallback import com.jieli.jl_audio_decode.callback.OnEncodeStreamCallback
import com.jieli.jl_audio_decode.opus.OpusManager import com.jieli.jl_audio_decode.opus.OpusManager
import com.jieli.jl_audio_decode.exceptions.OpusException import com.jieli.jl_audio_decode.exceptions.OpusException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
@ -117,10 +114,8 @@ class OpusAudioManager {
@Volatile @Volatile
private var capturedSilence: ByteArray? = null private var capturedSilence: ByteArray? = null
// 上下文:用于双声道编码模式下,分别为左右声道写入 mono PCM WAV 调试文件 // 上下文:用于上行解码后 PCM 的 WAV 调试文件写入(decodePcmWavWriter)
private var appContext: Context? = null private var appContext: Context? = null
private var leftPcmWavWriter: WavFileWriter? = null
private var rightPcmWavWriter: WavFileWriter? = null
// 上行(设备→手机)opus 解码后 PCM 的 WAV 调试文件:命名「翻译-上行」,opus_test 可直接播放听辨 // 上行(设备→手机)opus 解码后 PCM 的 WAV 调试文件:命名「翻译-上行」,opus_test 可直接播放听辨
private var decodePcmWavWriter: WavFileWriter? = null private var decodePcmWavWriter: WavFileWriter? = null
@ -154,8 +149,8 @@ class OpusAudioManager {
/** /**
* 初始化Opus音频管理器 * 初始化Opus音频管理器
* @param context 应用上下文,用于双声道编码模式下的 PCM WAV 调试文件写入; * @param context 应用上下文,用于上行解码后 PCM 的 WAV 调试文件写入(decodePcmWavWriter,命名「翻译-上行」);
* 不传则跳过 PCM WAV 调试文件落盘,其他功能不受影响 * 不传则跳过该落盘,其他功能不受影响
* @return 是否初始化成功 * @return 是否初始化成功
*/ */
fun initialize(context: Context? = null): Boolean { fun initialize(context: Context? = null): Boolean {
@ -472,8 +467,6 @@ class OpusAudioManager {
capturedSilence = null capturedSilence = null
openPcmWavWriters(sampleRate)
fun makeOption() = OpusOption().apply { fun makeOption() = OpusOption().apply {
setHasHead(hasHeader) setHasHead(hasHeader)
setChannel(1) setChannel(1)
@ -530,7 +523,6 @@ class OpusAudioManager {
try { rightEncodeManager?.stopEncodeStream() } catch (e: Exception) { Log.e(TAG, "停止右声道编码异常", e) } try { rightEncodeManager?.stopEncodeStream() } catch (e: Exception) { Log.e(TAG, "停止右声道编码异常", e) }
try { silenceEncodeManager?.stopEncodeStream() } catch (e: Exception) { Log.e(TAG, "停止静音编码异常", e) } try { silenceEncodeManager?.stopEncodeStream() } catch (e: Exception) { Log.e(TAG, "停止静音编码异常", e) }
capturedSilence = null capturedSilence = null
closePcmWavWriters()
callback?.onEncodeStreamStateChanged(false) callback?.onEncodeStreamStateChanged(false)
CallLog.i(TAG, "双声道独立编码流已停止") CallLog.i(TAG, "双声道独立编码流已停止")
return true return true
@ -577,7 +569,6 @@ class OpusAudioManager {
return return
} }
if (pcm.isEmpty()) return if (pcm.isEmpty()) return
leftPcmWavWriter?.writePcmData(pcm)
leftEncodeManager?.writeEncodeStream(pcm) leftEncodeManager?.writeEncodeStream(pcm)
} }
@ -590,7 +581,6 @@ class OpusAudioManager {
return return
} }
if (pcm.isEmpty()) return if (pcm.isEmpty()) return
rightPcmWavWriter?.writePcmData(pcm)
rightEncodeManager?.writeEncodeStream(pcm) rightEncodeManager?.writeEncodeStream(pcm)
} }
@ -610,11 +600,9 @@ class OpusAudioManager {
val silence = ByteArray(paddingMs * 32) val silence = ByteArray(paddingMs * 32)
when (channel) { when (channel) {
CHANNEL_LEFT -> { CHANNEL_LEFT -> {
leftPcmWavWriter?.writePcmData(silence)
leftEncodeManager?.writeEncodeStream(silence) leftEncodeManager?.writeEncodeStream(silence)
} }
CHANNEL_RIGHT -> { CHANNEL_RIGHT -> {
rightPcmWavWriter?.writePcmData(silence)
rightEncodeManager?.writeEncodeStream(silence) rightEncodeManager?.writeEncodeStream(silence)
} }
else -> { else -> {
@ -626,32 +614,6 @@ class OpusAudioManager {
} }
private fun openPcmWavWriters(sampleRate: Int) {
val ctx = appContext ?: return
try {
val ts = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
leftPcmWavWriter = WavFileWriter(ctx).also {
val ok = it.createWavFile("pcm_left_$ts", sampleRate, 1, 16)
if (!ok) leftPcmWavWriter = null
}
rightPcmWavWriter = WavFileWriter(ctx).also {
val ok = it.createWavFile("pcm_right_$ts", sampleRate, 1, 16)
if (!ok) rightPcmWavWriter = null
}
} catch (e: Exception) {
Log.e(TAG, "创建 PCM WAV 调试文件失败: ${e.message}", e)
leftPcmWavWriter = null
rightPcmWavWriter = null
}
}
private fun closePcmWavWriters() {
try { leftPcmWavWriter?.closeWavFile() } catch (e: Exception) { Log.e(TAG, "关闭左声道 PCM WAV 失败", e) }
try { rightPcmWavWriter?.closeWavFile() } catch (e: Exception) { Log.e(TAG, "关闭右声道 PCM WAV 失败", e) }
leftPcmWavWriter = null
rightPcmWavWriter = null
}
/** /**
* 打开上行(设备→手机)解码后 PCM 的 WAV 落地文件。 * 打开上行(设备→手机)解码后 PCM 的 WAV 落地文件。
* 命名「翻译-上行」前缀,写到 getExternalFilesDir,opus_test 扫描到 .wav 直接播放听辨; * 命名「翻译-上行」前缀,写到 getExternalFilesDir,opus_test 扫描到 .wav 直接播放听辨;

Loading…
Cancel
Save