# Web 音视频(六)图像素材处理

Web 音视频目录

前序章节介绍了如何在浏览器中解析、创建视频,以及给视频添加一些自定义素材(图片、音频、文字...);
本章介绍如何给图像素材加特效、加动画,实现转场、移动水印、图像滤镜美化等功能。

你可以跳过原理介绍,直接查看 WebAV 示例

# 素材动画

在视频制作中实现动画跟其他场景略有不同,因为视频是一系列图像帧的组合,因此视频动画就需要计算出每一帧素材的属性值(坐标、大小、角度、不透明度...)。

素材动画动画经常用来实现视频水印、转场等功能。

# 定义动画

我们参考 css animation 的使用方式,降低理解成本

素材沿 x 轴平移 100px 然后返回原点,动画持续 3s

{
  '0%': { x: 0, y: 0 },
  '50%': { x: 100, y: 0 },
  '100%': { x: 0, y: 0 }
}
duration = 3s

# 实现动画

假设输出的视频是 30FPS,写个示例来计算出素材在第二帧的 x 属性值。

// 从 0 开始计数
const frameCount = 1;
// 第二帧的时间偏移,VideoFrame timestamp 单位是微秒
const timestamp = (1 / 30) * 1e6 * frameCount;
// 第一阶段持续时长,1.5 * 1e6 us
const step0Duration = 3 * 1e6 * 0.5;
// 进度,线性
const progress = timestamp / step0Duration;
// 第一阶段 x 属性的变化差值
const step0DeltaX = 100 - 0;
// 第一帧 x 属性值
const newX = step0DeltaX * progress; // => 2.2222222222222223

循环以上过程(每次 frameCount 加 1),计算并设置每一帧中素材的属性值,在输出的视频中就能看到素材的动画效果。

# 图像处理

“图像处理”话题又大又深,作者自知没足够的专业知识讲好,但音视频处理又不可避免会涉及到图像处理的知识,比如美颜、滤镜、特效等等;所以这里只能给读者提供一些方向和思路。

在 Web 中图像处理都是从 HTMLCanvasElement 开始的,canvas 提供了一些 API 可以加工处理图像效果

  • CanvasRenderingContext2D.globalAlpha
    不透明度,渐隐渐现是最简单常见的“特效”
  • CanvasRenderingContext2D.globalCompositeOperation
    控制两个图像的合成模式,使用设计好的素材可以做出比较有意思的效果 (opens new window)
  • WebGL、WebGPU(独立 canvas 之外)
    可以实现高级、复杂的特效,如 绿幕抠图、美颜滤镜、画质增强 等等

关于绿幕抠图的实现,可参考本博客的另一篇文章 (opens new window),下文也有 WebAV 集成绿幕抠图的示例。

# WebAV 示例

文末附有 DEMO 体验链接

# 水印动画

import {
  Combinator,
  MP4Clip,
  OffscreenSprite,
  ImgClip,
  renderTxt2ImgBitmap,
} from '@webav/av-cliper';
const spr1 = new OffscreenSprite(
  'spr1',
  new MP4Clip((await fetch(resList[0])).body!)
);
// 文字转换成图片,更易处理
const spr2 = new OffscreenSprite(
  'spr2',
  new ImgClip(
    await renderTxt2ImgBitmap(
      '水印',
      `font-size:40px; color: white; text-shadow: 2px 2px 6px red;`
    )
  )
);
// 设置动画,在合成视频的时候,自动计算每帧该素材的坐标,实现水印移动动画
spr2.setAnimation(
  {
    '0%': { x: 0, y: 0 },
    '25%': { x: 1200, y: 680 },
    '50%': { x: 1200, y: 0 },
    '75%': { x: 0, y: 680 },
    '100%': { x: 0, y: 0 },
  },
  { duration: 4, iterCount: 1 }
);
spr2.zIndex = 10;
spr2.opacity = 0.5;

// main 表示当前资源结束时,结束视频合成
await com.add(spr1, { main: true });
await com.add(spr2, { offset: 0, duration: 5 });
// 输出视频流
com.ouput();

# 绿幕抠图

import { createChromakey, Combinator, MP4Clip, OffscreenSprite, createImageBitmap } from '@webav/av-cliper'

// 创建抠图工具函数
const chromakey = createChromakey({
  similarity: 0.4,
  smoothness: 0.05,
  spill: 0.05,
})
// 背景绿幕的测试视频
const clip = new MP4Clip((await fetch('./public/video/chromakey-test.mp4')).body!)
// MP4 的每一帧 都会经过 tickInterceptor
clip.tickInterceptor = async (_, tickRet) => {
  if (tickRet.video == null) return tickRet
  return {
    ...tickRet,
    // 抠图之后再返回
    video: await chromakey(tickRet.video)
  }
}

const spr1 = new OffscreenSprite('spr1', clip)
await spr1.ready

const com = new Combinator({
  1280,
  720,
  bgColor: 'white'
})

await com.add(spr1, { main: true })
await com.add(spr2)
// 输出视频流
com.ouput()

# 附录

💗 博主正处于裸辞待业状态,欢迎 商务合作 💗

相关文章

WebAV SDK(Web 视频编辑)V1 发布

前言 WebAV 是基于 WebCodecs 构建的 SDK,用于在 Web 平台上创建/编辑视频文件。 V1 对项目来说是里程碑版本,意味着 API 已经稳定,且功能的稳定性也经过了长时间的考验,可用于生产环境。 我在 20 年加入 B 站,开始接触 Web 音视频相关的知识(Web 播放器), WebCodecs API 在 21 年发布; 我预期 WebCode ...

纯 Web 视频剪辑

前言 WebCodecs API 为 Web 平台提供了音视频编解码能力,使得在 Web 平台(网页、Electron)上实现高效、专业的视频剪辑成品成为可能。 读者可阅读笔者的入门系列文章获取更详细的信息,或直接使用 WebAV 开源项目在浏览器中创建/编辑音视频文件。 背景 & 方案 为了解决主播投稿场景中,需要对直播视频进行简单编辑的诉求, ...

Google IO 分享 WebCodecs、OPFS 文字版

背景 2024 北京 Google I/O 邀请我参加合作者开发者论坛,主题是 "Build powerful Web App"; 笔者近期在公司项目中实践 WebCodecs,对应的开源项目是 WebAV,在 Web 音视频领域算是相对前沿的探索; 本文主要分享基于 WebCodecs、OPFS 实现的视频剪辑产品,探讨这些 API 还有哪些应用场景; W ...

WebCodecs 性能表现及优化思路

笔者开源 WebAV 已经一年半,还写了系列文章帮助初学者入门 Web 音视频。 之前一直隐隐担心在 Web 平台处理音视频与 Native APP 会有明显性能差距,因为 WebCodecs API 毕竟被浏览器代理了一层,且一些数据处理需要 js 配合,不确定有多大的性能损耗。 相信刚接触 WebCodecs 的读者也非常关心它的性能表现如何。 ...

WebCodecs 编码字符串(codec)介绍

笔者的 Web 音视频系列文章 视频播放经常会看到这样的字符串 video/mp4; codecs="avc1.4d002a",WebCodecs 编解码器初始化也需要配置 codec 参数,本文尝试简单介绍编码字符串含义。 视频编码分许多种类,每个种类还分多个版本,不同种类、版本对应的编解码算法、支持的能力(分辨率上限、色深等等)不同 ...

WebCodecs 开启 Web 音视频新篇章

你可以先略过下面的无聊文字,体验一番 WebCodecs 的实力 WebCodecs 是什么 WebCodecs 是一个 Web 规范,21 年 9 月份在 Chrome 94 中实现 WebCodecs 提供访问编解码能力的接口,可精细控制音视频数据 Web 音视频 API 存在什么问题 音视频技术在 Web 平台上的应用非常广泛,已有许多 Web ...

【译】WebCodecs 说明

本文翻译至 WebCodecs Explainer 问题与动机 已有许多 Web API 在内部使用媒体编解码器来支持特定用途,比如: HTMLMediaElement and Media Source Extensions WebAudio (decodeAudioData) MediaRecorder WebRTC 但是还没有一种通用的方式来灵活 ...

Web 音视频(七)中期回顾

Web 音视频目录 个人回顾 本系列更新至今,持续了一个月时间,内容可以总结为音频、视频数据的 解析 - 处理 - 合成,在浏览器中比较粗粒度地实现音视频编辑的主要环节,差不多是把 WebAV 项目的原理讲完了。 讲解的知识非常浅,目标读者是准备在 Web 平台进行音视频开发的新手; 这是我第一次进行高频率技术写作,将一 ...

Web 音视频(五)在浏览器中合成视频

Web 音视频目录 经过前序章节的介绍,读者能大致了解如何在播放器中解析、创建视频; 本章介绍何在浏览器中合成视频,这是视频编辑中最基础的功能。 你可以跳过原理介绍,直接查看 WebAV 合成视频示例 在视频上叠加素材 常见的素材有:视频、音频、图片、文字 [在浏览器中创建视频](/posts/2 ...

Web 音视频(四)在浏览器中处理音频

Web 音视频目录 为什么单独介绍音频处理? 网络上缺乏音频处理的资料,绝大多数示例都是针对视频而略过音频,很多人在网上寻找音频处理的示例 对前端开发者来说,音频处理相对视频略微复杂一些 所以,本文专门针对音频数据,汇总讲解采集-处理-编码-封装全过程,帮助初学者入门。 ![audio-data-flow](./audio ...