Xamarin.Android实现WAV转M4A后音频音高速度异常问题求助
Xamarin平台WAV转M4A异常问题修复方案
问题核心原因
输出音频播放速度快、音调偏高、总时长缩短,本质是音频帧时间戳计算偏差、未跳过WAV文件头、输入参数与实际WAV参数不匹配三类问题导致的。
具体修改建议
- 跳过WAV文件头
标准WAV文件前44字节为元数据头,不属于PCM音频数据,直接全量读取会把无效头数据喂给编码器,导致音频帧偏移。在FileInputStream初始化后添加如下逻辑:// 跳过标准WAV头44字节,特殊格式WAV可根据实际情况调整偏移量 fis.Skip(44); - 修正时间戳计算逻辑
原有时间戳计算使用整数除法会丢失精度,累加后会出现明显的时间偏移,修改计算逻辑避免精度损失:
原代码:
修改为:presentationTimeUs = 1000000l * (totalBytesRead / 2) / SAMPLING_RATE;// 16位单声道每个采样占2字节,先做浮点运算再转长整型避免精度丢失 presentationTimeUs = (long)(1000000.0 * totalBytesRead / 2 / SAMPLING_RATE); - 校验输入参数匹配度
确认你输入的WAV文件参数和代码中常量完全一致:- 采样率必须为48000Hz
- 位深必须为16bit
- 声道数必须为单声道
如果输入为双声道WAV,需要将创建MediaFormat时的声道数参数改为2,同时时间戳计算逻辑里的除数从2改为4(双声道16位每个采样占4字节)。
- 修复配置帧处理逻辑
原有逻辑遇到CodecConfig标记直接丢弃缓冲区,部分设备的编码器会将配置信息和首帧音频打包到同一个缓冲区,丢弃会导致首帧丢失,修改处理逻辑:if ((outBuffInfo.Flags & MediaCodecBufferFlags.CodecConfig) != 0 && outBuffInfo.Size != 0) { // 配置帧也需要写入复用器,否则会影响解码器识别 mux.WriteSampleData(audioTrackIdx, encodedData, outBuffInfo); codec.ReleaseOutputBuffer(outputBufIndex, false); } else { mux.WriteSampleData(audioTrackIdx, encodedData, outBuffInfo); codec.ReleaseOutputBuffer(outputBufIndex, false); }
内容的提问来源于stack exchange,提问作者SOuser
相关产品推荐
相关产品推荐

