You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:30:02