HarmonyOS鸿蒙Next中如何给AI生成的视频添加标识

HarmonyOS鸿蒙Next中如何给AI生成的视频添加标识 【问题描述】:AI处理完视频后,如何添加“AI生成”的水印在视频的在右下角

【问题现象】:如何实现图片中的效果 cke_459.jpeg

【版本信息】:6.0.2

【复现代码】:不涉及

【尝试解决方案】:不涉及


更多关于HarmonyOS鸿蒙Next中如何给AI生成的视频添加标识的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

开发者你好,

视频添加水印请参考如下方案

  • 方案一:通过Stack组件或overlay属性实现图片水印效果(支持emoji表情),使用第三方库mp4parser调用FFmpeg命令合成加水印的视频。完整示例可以参考视频静态水印添加

  • 方案二:通过Drawing模块绘制水印,使用glTexImage2D方法将水印纹理(支持emoji表情)与视频纹理绑定完成水印添加,最终通过XComponent进行显示。完整示例可参考视频添加水印

    OH_Drawing_TypographyHandlerAddText接口中入参为char*,只能输入单字节编码表示的emoji表情,不可以传入u16_string表示的emoji表情。

更多关于HarmonyOS鸿蒙Next中如何给AI生成的视频添加标识的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


好建议

没有吧

是的

告诉AI,生成视频的时候,在右下角添加【AI生成】水印

在HarmonyOS鸿蒙Next中,给AI生成的视频添加标识,可以使用ArkUI的媒体处理能力。通过VideoComponent结合Canvas或自定义组件,可以在视频上层叠加文本、图片等标识。利用VideoController控制播放,并通过布局属性调整标识位置。标识内容需通过UI组件实时渲染到视频画面上。

在HarmonyOS Next中,为AI生成的视频添加“AI生成”标识,核心是使用VideoComposerImageSource进行视频与图片(水印)的合成。以下是实现步骤和关键代码:

1. 核心思路 将原始视频与一个包含“AI生成”文字的图片(或直接绘制文字)作为新的视频轨道进行叠加合成,并指定水印的位置(如右下角)。

2. 实现步骤与代码示例

  • 步骤1:准备资源 准备原始视频文件路径和作为水印的图片(如PNG格式,背景透明)或直接使用Canvas绘制文字生成PixelMap

    // 假设已有原始视频URI和水印图片URI
    let originalVideoUri: string = 'file://.../input.mp4';
    let watermarkImageUri: string = 'file://.../watermark.png'; // 或通过Canvas生成PixelMap
    
  • 步骤2:创建视频合成器(VideoComposer)并配置轨道 创建VideoComposer实例,添加原始视频轨道和水印图片轨道。通过Layout设置水印位置和大小。

    import { videoComposer } from '@kit.MultimediaKit';
    import { image } from '@kit.ImageKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    async function addWatermarkToVideo() {
      // 创建VideoComposer实例
      let composer: videoComposer.VideoComposer = videoComposer.createVideoComposer();
    
      // 1. 添加原始视频轨道
      let videoSource: videoComposer.VideoSource = videoComposer.createVideoSource(originalVideoUri);
      let videoTrack: videoComposer.VideoTrack = composer.addVideoTrack();
      videoTrack.addSource(videoSource);
    
      // 2. 添加水印图片轨道
      let imageSource: videoComposer.ImageSource = videoComposer.createImageSource(watermarkImageUri);
      let imageTrack: videoComposer.VideoTrack = composer.addVideoTrack();
    
      // 配置水印布局:置于右下角,大小为视频宽度的1/5(示例)
      let layout: videoComposer.Layout = {
        // 位置:右下角。假设视频分辨率是1920x1080,水印宽w、高h。
        // x = 视频宽度 - 水印宽度 - 右边距(如20像素)
        // y = 视频高度 - 水印高度 - 下边距(如20像素)
        // 这里使用相对比例更通用,假设目标水印宽度为视频宽度的0.2,高度按比例缩放。
        // 实际计算可能需要先获取视频和水印的尺寸信息。
        x: '80%', // 水平起始位置在80%处,可根据水印宽度调整
        y: '80%', // 垂直起始位置在80%处,可根据水印高度调整
        width: '15%', // 水印宽度为视频宽度的15%
        height: 'auto' // 高度按图片比例自动缩放
      };
      imageSource.setLayout(layout);
      imageTrack.addSource(imageSource);
    
      // 步骤3:设置输出路径并开始合成
      let outputUri: string = 'file://.../output_with_watermark.mp4';
      composer.setOutputUri(outputUri);
    
      try {
        await composer.compose();
        console.info('视频合成完成,输出路径: ' + outputUri);
      } catch (error) {
        let err: BusinessError = error as BusinessError;
        console.error(`合成失败,错误码: ${err.code}, 错误信息: ${err.message}`);
      }
    
      // 步骤4:释放资源
      videoSource.release();
      imageSource.release();
      composer.release();
    }
    
  • 步骤3:动态生成水印图片(可选) 如果不想预存水印图片文件,可以使用Canvas绘制文字并生成PixelMap,然后创建ImageSource

    import { drawing } from '@kit.ArkGraphics2D';
    
    async function createTextWatermarkPixelMap(text: string): Promise<image.PixelMap | undefined> {
      // 创建Canvas渲染上下文
      let canvas: drawing.CanvasRenderingContext2D = ...; // 初始化Canvas,设置宽高
      // 绘制文字(例如:白色半透明、字体大小等)
      canvas.fillStyle = 'rgba(255, 255, 255, 0.7)';
      canvas.font = '36px sans-serif';
      canvas.fillText(text, 10, 50); // 文字位置
      // 从Canvas获取PixelMap
      let pixelMap: image.PixelMap | undefined = await canvas.getPixelMap();
      return pixelMap;
    }
    
    // 使用生成的PixelMap创建ImageSource
    let watermarkPixelMap: image.PixelMap | undefined = await createTextWatermarkPixelMap('AI生成');
    if (watermarkPixelMap) {
      let imageSource: videoComposer.ImageSource = videoComposer.createImageSource(watermarkPixelMap);
      // ... 后续添加轨道和布局配置同上
    }
    

3. 关键点说明

  • 布局计算:水印位置(x, y)和大小(width, height)可以使用像素值或百分比字符串。右下角定位通常需要根据视频分辨率和水印尺寸动态计算,使用百分比更便于适配不同视频。
  • 层级关系:后添加的轨道(如图片轨道)会叠加在先添加的轨道(如视频轨道)之上。
  • 性能与格式:合成操作可能耗时,建议在异步任务中执行。输出视频的编码格式、分辨率等参数可使用VideoComposer的其他接口(如setEncoderConfig)进行配置。
  • 权限:确保应用已申请必要的文件读写权限(ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA)。

通过以上步骤,即可在AI处理后的视频上合成一个位于右下角的“AI生成”标识。具体坐标和尺寸可根据实际视觉效果调整Layout参数。

回到顶部