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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:50:01