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

如何在Ionic Angular Capacitor项目中实现安卓/Web/iOS跨端视频录制?

三端兼容的视频录制与播放方案(Capacitor)

一、视频录制实现

因为@capacitor/camera不支持视频录制,且无法使用Cordova插件,我们采用Web标准API+Capacitor官方插件的组合实现三端兼容:

1. 跨端视频捕获(Web/Android/iOS通用)

使用浏览器原生的MediaDevices.getUserMedia() API捕获视频流,三端WebView均支持:

async function startRecording() {
  // 先检查权限(见下文权限处理)
  await checkPermissions();

  const stream = await navigator.mediaDevices.getUserMedia({ 
    video: { facingMode: 'environment' }, // 优先后置摄像头
    audio: true 
  });
  const mediaRecorder = new MediaRecorder(stream, { mimeType: 'video/mp4' });
  const chunks = [];

  mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
  mediaRecorder.onstop = async () => {
    const blob = new Blob(chunks, { type: 'video/mp4' });
    const savedUri = await saveVideoToDevice(blob);
    stream.getTracks().forEach(track => track.stop()); // 释放媒体资源
    return savedUri;
  };

  mediaRecorder.start();
  // 示例:录制10秒后自动停止,可根据业务逻辑调整
  setTimeout(() => mediaRecorder.stop(), 10000);
}

2. 移动端本地存储

用@capacitor/filesystem将录制的Blob保存到设备本地,替代Cordova的media-capture:

import { Filesystem, Directory } from '@capacitor/filesystem';

async function saveVideoToDevice(blob) {
  const arrayBuffer = await blob.arrayBuffer();
  const base64 = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
  
  const fileName = `video_recording_${Date.now()}.mp4`;
  const result = await Filesystem.writeFile({
    path: fileName,
    data: base64,
    directory: Directory.Documents,
    recursive: true
  });

  return result.uri; // 返回本地文件URI,用于后续播放
}

3. 权限处理(必填)

使用@capacitor/permissions确保获取相机和麦克风权限:

import { Permissions, PermissionType } from '@capacitor/permissions';

async function checkPermissions() {
  const [cameraStatus, micStatus] = await Promise.all([
    Permissions.check({ type: PermissionType.Camera }),
    Permissions.check({ type: PermissionType.Microphone })
  ]);

  if (cameraStatus.state !== 'granted' || micStatus.state !== 'granted') {
    const requestResult = await Permissions.request([
      { type: PermissionType.Camera },
      { type: PermissionType.Microphone }
    ]);
    if (requestResult.Camera.state !== 'granted' || requestResult.Microphone.state !== 'granted') {
      throw new Error('必须授予相机和麦克风权限才能录制视频');
    }
  }
}

二、视频播放实现

替代Cordova的streaming-media,采用两种方案满足不同需求:

1. 通用HTML5播放(轻量跨端)

直接用HTML5 <video>标签播放,三端通用:

<video id="videoPlayer" controls style="width:100%;"></video>
async function playVideo(fileUri) {
  const videoElement = document.getElementById('videoPlayer');
  
  if (fileUri.startsWith('http')) {
    videoElement.src = fileUri;
  } else {
    // 移动端本地文件,转换为可访问的URI
    const fileInfo = await Filesystem.getUri({
      path: fileUri.split('/').pop(),
      directory: Directory.Documents
    });
    videoElement.src = fileInfo.uri;
  }
  
  try {
    await videoElement.play();
  } catch (err) {
    console.error('播放失败:', err);
  }
}

2. 原生播放增强(可选)

如果需要全屏、锁屏播放等原生体验,使用@capacitor-community/video-player(纯Capacitor插件,非Cordova):

import { VideoPlayer } from '@capacitor-community/video-player';

async function playVideoWithNativeUI(fileUri) {
  await VideoPlayer.play({
    url: fileUri,
    options: {
      autoplay: true,
      controls: true,
      fullscreen: true,
      backgroundColor: '#000000'
    }
  });
}

三、三端兼容配置要点

  • Web端:必须在HTTPS环境下使用getUserMedia(本地开发localhost不受限制)。
  • Android:在android/app/src/main/AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  • iOS:在ios/App/App/Info.plist中添加权限描述:
    <key>NSCameraUsageDescription</key>
    <string>需要访问相机录制视频</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>需要访问麦克风录制音频</string>
    
  • 格式兼容:统一使用MP4格式(H.264编码),确保三端都能正常解码播放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:50:34