AndroidStudio没用明白 使用Notepad++费劲巴拉的看了下 FeatureAudioADPCMSync.java应该和ADPCM的解码有关 这方法我没有细研究过 估计你能了解ADPCM的编解码原理 ADPCM可以把一个16bit数据压缩成4bit 问题解码时不是只拿一个4bit就能还原成一个16bit 还需要和其它数据关联 ADPCM解码时需要用到2个固定的数组StepSizeTable[],IndexTable[] /** Quantizer step size lookup table */ private static final short[] StepSizeTable={7,8,9,10,11,12,13,14,16,17, 19,21,23,25,28,31,34,37,41,45, 50,55,60,66,73,80,88,97,107,118, 130,143,157,173,190,209,230,253,279,307, 337,371,408,449,494,544,598,658,724,796, 876,963,1060,1166,1282,1411,1552,1707,1878,2066, 2272,2499,2749,3024,3327,3660,4026,4428,4871,5358, 5894,6484,7132,7845,8630,9493,10442,11487,12635,13899, 15289,16818,18500,20350,22385,24623,27086,29794,32767}; /** Table of index changes */ private static final byte[] IndexTable = {-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8}; 和两个全局变量 int PrevSample; // Predicted sample int PrevStepSize; // Index into step size table 在FeatureAudioADPCM.java的decode函数里有这样一句话 if(syncManager!=null && syncManager.isIntra()) { predsample = syncManager.getAdpcm_predsample_in(); index = syncManager.getAdpcm_index_in(); syncManager.reinitResetFlag(); } 用来提取PrevSample和index(PrevStepSize) BVAudioSyncManager的setSyncParams函数调用了FeatureAudioADPCMSync.java的函数 decode函数的结尾处还有一段注释 /* 5. save predict sample and index for next iteration */ 提示保存修改后的PrevSample和index 所以我觉得FeatureAudioADPCMSync.java函数应该是用来设置和读取这些全局变量用的 你遇到暂停后再播放声音“乱码”的问题可以试试重新播放时清除接收到的音频数据 和初始化PrevSample,PrevStepSize变量试试 |