|
|
|
@ -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.opus.OpusManager |
|
|
|
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.atomic.AtomicBoolean |
|
|
|
|
|
|
|
@ -117,10 +114,8 @@ class OpusAudioManager { |
|
|
|
@Volatile |
|
|
|
private var capturedSilence: ByteArray? = null |
|
|
|
|
|
|
|
// 上下文:用于双声道编码模式下,分别为左右声道写入 mono PCM WAV 调试文件 |
|
|
|
// 上下文:用于上行解码后 PCM 的 WAV 调试文件写入(decodePcmWavWriter) |
|
|
|
private var appContext: Context? = null |
|
|
|
private var leftPcmWavWriter: WavFileWriter? = null |
|
|
|
private var rightPcmWavWriter: WavFileWriter? = null |
|
|
|
// 上行(设备→手机)opus 解码后 PCM 的 WAV 调试文件:命名「翻译-上行」,opus_test 可直接播放听辨 |
|
|
|
private var decodePcmWavWriter: WavFileWriter? = null |
|
|
|
|
|
|
|
@ -154,8 +149,8 @@ class OpusAudioManager { |
|
|
|
|
|
|
|
/** |
|
|
|
* 初始化Opus音频管理器 |
|
|
|
* @param context 应用上下文,用于双声道编码模式下的 PCM WAV 调试文件写入; |
|
|
|
* 不传则跳过 PCM WAV 调试文件落盘,其他功能不受影响 |
|
|
|
* @param context 应用上下文,用于上行解码后 PCM 的 WAV 调试文件写入(decodePcmWavWriter,命名「翻译-上行」); |
|
|
|
* 不传则跳过该落盘,其他功能不受影响 |
|
|
|
* @return 是否初始化成功 |
|
|
|
*/ |
|
|
|
fun initialize(context: Context? = null): Boolean { |
|
|
|
@ -472,8 +467,6 @@ class OpusAudioManager { |
|
|
|
|
|
|
|
capturedSilence = null |
|
|
|
|
|
|
|
openPcmWavWriters(sampleRate) |
|
|
|
|
|
|
|
fun makeOption() = OpusOption().apply { |
|
|
|
setHasHead(hasHeader) |
|
|
|
setChannel(1) |
|
|
|
@ -530,7 +523,6 @@ class OpusAudioManager { |
|
|
|
try { rightEncodeManager?.stopEncodeStream() } catch (e: Exception) { Log.e(TAG, "停止右声道编码异常", e) } |
|
|
|
try { silenceEncodeManager?.stopEncodeStream() } catch (e: Exception) { Log.e(TAG, "停止静音编码异常", e) } |
|
|
|
capturedSilence = null |
|
|
|
closePcmWavWriters() |
|
|
|
callback?.onEncodeStreamStateChanged(false) |
|
|
|
CallLog.i(TAG, "双声道独立编码流已停止") |
|
|
|
return true |
|
|
|
@ -577,7 +569,6 @@ class OpusAudioManager { |
|
|
|
return |
|
|
|
} |
|
|
|
if (pcm.isEmpty()) return |
|
|
|
leftPcmWavWriter?.writePcmData(pcm) |
|
|
|
leftEncodeManager?.writeEncodeStream(pcm) |
|
|
|
} |
|
|
|
|
|
|
|
@ -590,7 +581,6 @@ class OpusAudioManager { |
|
|
|
return |
|
|
|
} |
|
|
|
if (pcm.isEmpty()) return |
|
|
|
rightPcmWavWriter?.writePcmData(pcm) |
|
|
|
rightEncodeManager?.writeEncodeStream(pcm) |
|
|
|
} |
|
|
|
|
|
|
|
@ -610,11 +600,9 @@ class OpusAudioManager { |
|
|
|
val silence = ByteArray(paddingMs * 32) |
|
|
|
when (channel) { |
|
|
|
CHANNEL_LEFT -> { |
|
|
|
leftPcmWavWriter?.writePcmData(silence) |
|
|
|
leftEncodeManager?.writeEncodeStream(silence) |
|
|
|
} |
|
|
|
CHANNEL_RIGHT -> { |
|
|
|
rightPcmWavWriter?.writePcmData(silence) |
|
|
|
rightEncodeManager?.writeEncodeStream(silence) |
|
|
|
} |
|
|
|
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 落地文件。 |
|
|
|
* 命名「翻译-上行」前缀,写到 getExternalFilesDir,opus_test 扫描到 .wav 直接播放听辨; |
|
|
|
|