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

React Native Expo Camera录制视频无法添加叠加层求助

Expo Camera添加水印不显示在录制视频中的解决方案

你当前的做法是在Camera组件内部嵌套Text,这只是在App的UI层叠加了文字,但Expo Camera的录制功能只会捕获摄像头输出的原始视频流,不会包含React Native的UI元素,所以保存后的视频里看不到水印。下面是两种可行的解决方法:

方法一:录制后给视频添加水印(简单易实现)

先录制无水印的原始视频,再通过视频处理工具给成品添加文字水印,适合大多数场景。

操作步骤:

  1. 安装依赖:
npx expo install expo-video-processing
  1. 保留你现有的Camera录制逻辑,完成视频录制并获取视频本地URI。
  2. 调用视频处理API添加水印:
import { VideoProcessing } from 'expo-video-processing';

async function addWatermarkToVideo(videoUri) {
  const processedResult = await VideoProcessing.processVideoAsync(
    videoUri,
    {
      watermark: {
        text: 'Hello',
        position: { x: 50, y: 50 }, // 水印坐标(从左上角开始计算)
        color: '#ffffff',
        fontSize: 24,
        backgroundColor: '#008000'
      },
      compress: false // 根据需求设置是否压缩视频
    }
  );
  // processedResult.uri 就是带水印的视频地址,可直接保存或使用
  return processedResult.uri;
}

方法二:实时合成视频流(支持录制时预览水印)

如果需要在录制过程中实时看到水印,并且直接录制带水印的视频,需要结合expo-gl将摄像头画面与文字合成后再录制。

操作步骤:

  1. 安装依赖:
npx expo install expo-gl expo-camera expo-av
  1. 核心实现思路:
  • 通过expo-camera获取摄像头的纹理ID。
  • 在GLView中渲染摄像头画面,同时绘制文字水印。
  • 用expo-av录制GLView输出的合成视频流。

示例代码框架:

import React, { useRef, useEffect } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { Camera } from 'expo-camera';
import { GLView } from 'expo-gl';

export default function CameraWithLiveWatermark() {
  const cameraRef = useRef(null);
  const glViewRef = useRef(null);

  useEffect(() => {
    async function initGLContext() {
      if (!glViewRef.current) return;
      const gl = await glViewRef.current.getContextAsync('webgl');
      // 这里需要编写WebGL渲染逻辑:
      // 1. 将摄像头输出的纹理绑定到GL上下文
      // 2. 绘制摄像头画面
      // 3. 绘制文字水印(需借助GL文字渲染库或手动生成纹理)
      // 具体实现可参考Expo GL官方文档中的摄像头纹理示例
    }
    initGLContext();
  }, []);

  const startRecording = async () => {
    if (!cameraRef.current) return;
    await cameraRef.current.recordAsync({
      // 配置录制参数如分辨率、码率等
    });
  };

  return (
    <View style={styles.container}>
      <GLView ref={glViewRef} style={styles.fullScreen} />
      {/* UI层文字用于预览,实际录制的是GL合成的画面 */}
      <Text style={styles.watermark}>Hello</Text>
      {/* 隐藏原始Camera组件,仅用于获取摄像头流 */}
      <Camera ref={cameraRef} style={styles.hiddenCamera} />
    </View>
  );
}

const styles = StyleSheet.create({
  container: { flex: 1 },
  fullScreen: { flex: 1 },
  watermark: {
    position: 'absolute',
    top: 50,
    left: 50,
    backgroundColor: 'green',
    color: 'white',
    fontSize: 18,
    padding: 4
  },
  hiddenCamera: { position: 'absolute', opacity: 0 }
});

注意:这种方法需要具备基础的WebGL知识,适合需要实时水印预览的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:35:05