Android Chrome下如何配置AudioEncoder适配mp4-muxer音频编码?
解决Android Chrome中AudioEncoder配置不兼容问题
针对你遇到的「EncodingError: input audio buffer is incompatible with codec paramers」错误,核心原因是Android Chrome对AAC编码器(mp4a.40.2)的参数匹配要求更严格,以下是具体解决步骤:
1. 严格匹配输入音频的实际参数
不要硬编码声道数和采样率,直接从音频轨道的实际配置中读取参数——Android设备麦克风默认多为双声道,硬编码为1会直接导致缓冲区参数不匹配:
if (audioTrack) { const trackSettings = audioTrack.getSettings(); // 从音频轨道获取真实的声道数与采样率 const actualChannels = trackSettings.channelCount || 2; const actualSampleRate = trackSettings.sampleRate || 44100; audioEncoder = new AudioEncoder({ output: (chunk, meta) => muxer.addAudioChunk(chunk, meta), error: e => console.error(e) }); // 先验证当前配置是否被设备支持 const supportResult = await AudioEncoder.isConfigSupported({ codec: 'mp4a.40.2', numberOfChannels: actualChannels, sampleRate: actualSampleRate, bitrate: 128000 }); if (supportResult.supported) { audioEncoder.configure(supportResult.config); } else { // fallback到Android普遍支持的兼容配置 audioEncoder.configure({ codec: 'mp4a.40.2', numberOfChannels: 2, sampleRate: 44100, bitrate: 128000 }); } // 后续TrackProcessor逻辑保持不变 let trackProcessor = new MediaStreamTrackProcessor({ track: audioTrack }); let consumer = new WritableStream({ write(audioData) { if (!recording) return; audioEncoder.encode(audioData); audioData.close(); } }); trackProcessor.readable.pipeTo(consumer); }
2. 必要时添加音频格式转换
如果音频轨道的参数确实无法被编码器支持(比如采样率为非标准数值),可以用AudioContext做格式转换:
async function convertAudioTrack(track, targetSampleRate, targetChannels) { const audioContext = new AudioContext({ sampleRate: targetSampleRate }); const source = audioContext.createMediaStreamSource(new MediaStream([track])); const destination = audioContext.createMediaStreamDestination(); // 处理声道数转换(双声道转单声道) if (targetChannels === 1 && source.channelCount > 1) { const merger = audioContext.createChannelMerger(1); source.connect(merger, 0, 0); merger.connect(destination); } else { source.connect(destination); } return destination.stream.getAudioTracks()[0]; } // 使用示例 if (audioTrack) { const convertedTrack = await convertAudioTrack(audioTrack, 44100, 2); // 后续用convertedTrack创建TrackProcessor }
3. 尝试兼容的编解码器标识
部分Android设备对mp4a.40.2支持不佳,可以换成更通用的AAC-LC标识mp4a.40.5,或者使用完整MIME格式audio/mp4; codecs="mp4a.40.2"进行配置。
内容的提问来源于stack exchange,提问作者Jack Asa
相关产品推荐
相关产品推荐

