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

Android Chrome环境下锁屏后持续录制麦克风的方案问询

Android Chrome锁屏下持续录音的实现方案

你的核心问题是Android Chrome在锁屏/后台时会暂停MediaRecorder的运行,这是浏览器的后台资源限制策略导致的。以下是几个可行的实现方案,结合你的现有代码修改即可:

方案一:维持AudioContext活跃,保证媒体流不被中断

Chrome会优先保留有活跃音频上下文的页面资源,通过创建AudioContext并连接麦克风流,可以让浏览器认为页面在进行音频处理,避免后台暂停录制。

修改你的代码如下:

const chunks = [];
let recorder = null;
let audioContext = null;
let sourceNode = null;

async function beginCapture(){
  let audioStream;
  try {
    audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
  } catch {
    alert("Permission denied!");
    return;
  }

  // 创建AudioContext并连接麦克风流,维持活跃状态
  audioContext = new AudioContext();
  sourceNode = audioContext.createMediaStreamSource(audioStream);
  // 连接到静默输出,避免播放麦克风声音
  sourceNode.connect(audioContext.destination);

  recorder = new MediaRecorder(audioStream);
  recorder.ondataavailable = (e) => chunks.push(e.data);
  recorder.onstop = () => {
    saveRecordedAudio(new Blob(chunks));
    // 清理音频资源
    if (sourceNode) sourceNode.disconnect();
    if (audioContext) audioContext.close();
    audioContext = null;
    sourceNode = null;
  }; 
  recorder.start();
}

function saveRecordedAudio(blob){
  const url = URL.createObjectURL(blob);
  const audio = new Audio(url);
  audio.controls = true;
  document.body.appendChild(audio);
  audio.onload = () => URL.revokeObjectURL(url);
}

function stopRecording(){
  recorder.stop();
}

方案二:使用System Wake Lock API(需HTTPS)

System Wake Lock可以在设备锁屏时保持系统活跃,避免Chrome因设备休眠暂停脚本。该API需要HTTPS环境,且必须通过用户交互触发(比如点击录制按钮时请求)。

添加唤醒锁相关代码:

const chunks = [];
let recorder = null;
let audioContext = null;
let sourceNode = null;
let wakeLock = null;

// 请求系统唤醒锁
async function requestWakeLock() {
  try {
    wakeLock = await navigator.wakeLock.request('system');
    wakeLock.addEventListener('release', () => {
      console.log('唤醒锁已释放');
    });
  } catch (err) {
    console.error(`${err.name}: ${err.message}`);
  }
}

async function beginCapture(){
  let audioStream;
  try {
    audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
  } catch {
    alert("Permission denied!");
    return;
  }

  await requestWakeLock(); // 请求唤醒锁
  audioContext = new AudioContext();
  sourceNode = audioContext.createMediaStreamSource(audioStream);
  sourceNode.connect(audioContext.destination);

  recorder = new MediaRecorder(audioStream);
  recorder.ondataavailable = (e) => chunks.push(e.data);
  recorder.onstop = () => {
    saveRecordedAudio(new Blob(chunks));
    if (sourceNode) sourceNode.disconnect();
    if (audioContext) audioContext.close();
    audioContext = null;
    sourceNode = null;
    // 释放唤醒锁
    if (wakeLock) {
      wakeLock.release();
      wakeLock = null;
    }
  }; 
  recorder.start();
}

function saveRecordedAudio(blob){
  const url = URL.createObjectURL(blob);
  const audio = new Audio(url);
  audio.controls = true;
  document.body.appendChild(audio);
  audio.onload = () => URL.revokeObjectURL(url);
}

function stopRecording(){
  recorder.stop();
}

方案三:注册Media Session,提升后台优先级

通过Media Session API告诉Chrome这是一个媒体录制应用,让浏览器给予更高的后台运行优先级,减少被暂停的概率。

添加媒体会话配置:

// 页面加载时或录制前调用此函数
function setupMediaSession() {
  if ('mediaSession' in navigator) {
    navigator.mediaSession.metadata = new MediaMetadata({
      title: '语音备忘录录制',
      artist: '你的应用名称',
    });
    // 绑定停止录制的动作
    navigator.mediaSession.setActionHandler('stop', () => {
      stopRecording();
    });
  }
}

// 在beginCapture中调用setupMediaSession
async function beginCapture(){
  setupMediaSession();
  // 原有代码...
}

关键注意事项

  • 必须使用HTTPS:所有后台相关API(Wake Lock、Media Session)仅在HTTPS环境下可用,HTTP页面无法使用。
  • 兼容性检查:部分API可能在旧版Chrome中不支持,建议通过特性检测判断是否启用。
  • 资源清理:录制结束后务必释放AudioContext、唤醒锁等资源,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:25:22