WebAV

96 阅读6分钟

一、解码(devode)

1.解码视频(Video Decoder)

  • 用到的sdk: import { MP4Clip } from '@webav/av-cliper';
  • 注意事项: 测试用的视频资源托管在 github pages,启动 DEMO 可能需要一些网络加载时间

2.解码音频(Audio Decoder)

  • 用到的sdk: import { AudioClip } from '@webav/av-cliper';

3.解码动图(Gif Decoder)

  • 功能简介: 动图是由多个静态图片帧组成的,可使用浏览器 API ImageDecoder 解码;
    或使用 ImgClip.tick(time) 获取指定时间的图像帧;
  • 用到的sdk: import { ImgClip } from "@webav/av-cliper";

4.解码播放(Decode and Play)

  • 功能简介:使用 WebCodecs + canvas + WebAudio 来解码播放视频,能获取到视频原始图像、音频数据。 该方案拥有最完整的播放控制能力,是原生 video 标签无法实现的,比如:

    • 低延迟场景的 buffer 控制
    • 根据设备压力状况丢帧
    • 解码异常时自动恢复
    • 逐帧播放、超快倍速播放
    • 倍速播放音频不变调
    • 自定义播放 FPS

该方案的代价是增加了复杂度,应优先考虑使用 video 播放,除非无法满足诉求。

  • 用到的sdk: import { MP4Clip } from '@webav/av-cliper';
  • 注意事项: 先初始化Canvas 上下文之后再初始化 MP4Clip
  • 遇到的问题:

二、剪辑(clip)

1.缩略图(Thumbnail)

  • 功能简介:视频缩略图常用于剪辑工具的时间轴模块中,该功能抽取视频所有关键帧,生成自定义宽度的缩略图,并提供对应的时间戳。
  • 用到的sdk: import { MP4Clip } from '@webav/av-cliper';
  • 注意事项: 先初始化Canvas 上下文之后再初始化 MP4Clip

2.轨道分离(Track Separation)

  • 功能简介:音视频轨道分离是剪辑的一个基础能力,分离后即可单独编辑音、视频轨道,互不影响。 该 DEMO 演示将一个视频文件拆分成独立的音频与视频,支持独立播放。
  • 用到的sdk: import { MP4Clip } from '@webav/av-cliper';
  • 注意事项: 先初始化 MP4Clip,再clip.splitTrack()分离

3.视频剪辑(Video Clip)

  • 功能简介:基于 WebAV 项目提供的 @webav/av-canvas 包能在浏览器环境中快速实现视频剪辑功能。该 DEMO 演示视频剪辑软件的基础能力

    • 添加/删除素材(视频、音频、图片、文字)
    • 分割(裁剪)素材
    • 控制素材在视频中的空间属性(坐标、旋转、缩放)
    • 控制素材在视频中的时间属性(偏移、时长)
    • 实时预览播放
    • 纯浏览器环境生成视频
  • 用到的sdk: import { AVCanvas } from '@webav/av-canvas' import { AudioClip, ImgClip, MP4Clip, VisibleSprite, renderTxt2ImgBitmap, } from '@webav/av-cliper' import TimelineEditor from './TimelineEditor.vue'

  • 注意事项: const avCvs = shallowRef(null) 必须用shallowRef去做

  • 遇到的问题:1.时间轴组件是原生开发的,官网demo是react自带组件,故样式上差很多,功能上也有bug,缺少了素材可拖拽,时间刻度显示不完整等问题。2.tlState是TimelineEditor时间轴组件的ref,前期把它当作props值传进去导致时间轴不生效。

三、合成(composite)

1.视频合成(Video Composite)

  • 功能简介:音视频轨道分离是剪辑的一个基础能力,分离后即可单独编辑音、视频轨道,互不影响。 该 DEMO 演示将一个视频文件拆分成独立的音频与视频,支持独立播放。
  • 用到的sdk: import { Combinator, ImgClip, MP4Clip, OffscreenSprite, renderTxt2ImgBitmap, } from '@webav/av-cliper'
  • 注意事项: 如果你想在视频中绘制普通图片,可参考以下方式创建 ImgClip 实例,再添加到 Combinator new ImgClip((await fetch('<img url>')).body);

2.视频配音(Video Dubbing)

  • 功能简介:视频配音。
  • 用到的sdk: import { AudioClip, Combinator, MP4Clip, OffscreenSprite, } from '@webav/av-cliper'
  • 注意事项:

3.音频合成(Audio Composite)

  • 功能简介:混合两个音频文件,输出 m4a 音频文件。

new Combiator 不提供 width, height 或任意一个值为 0,则不会创建视频轨道,生成的是 m4a 音频文件。。

  • 用到的sdk: import { AudioClip, Combinator, OffscreenSprite } from '@webav/av-cliper'
  • 注意事项:

4.嵌入字幕(Embedding Subtitles)

  • 功能简介:在视频中嵌入 SRT 字幕。
  • 用到的sdk: import { MP4Clip, EmbedSubtitlesClip, Combinator, OffscreenSprite, } from '@webav/av-cliper'
  • 注意事项:

5.合成再拼接(Synthesize And Splice)

  • 功能简介:代码处理过程:
  1. 移除三个视频素材的绿幕背景
  2. 再给视频添加背景图片,合成输出三个独立的视频文件
  3. 使用 fastConcatMP4 将三个视频文件首尾拼接成一个视频文件
  • 用到的sdk: import { MP4Clip, ImgClip, createChromakey, Combinator, OffscreenSprite, fastConcatMP4, } from "@webav/av-cliper";
  • 注意事项:
  • 遇到的问题:视频资源会出现加载失败的情况,因为测试用的视频资源托管在 github pages,启动 DEMO 可能需要一些网络加载时间,故会导致拼接失败

6.自定义素材(Custom IClip)

  • 功能简介:使用 canvas 实现一个倒计时 Clip,快速生成视频文件;
    基于同样原理,适应于需要将 canvas 内容(比如 动画)快速保存为视频文件的场景。
  • 用到的sdk: import { Combinator, OffscreenSprite } from '@webav/av-cliper';
  • 注意事项:

四、视频录制(greenScreenMatting)

1.直播录制(Live Recording)

  • 功能简介:使用 canvas 实现一个倒计时 Clip,快速生成视频文件;
    基于同样原理,适应于需要将 canvas 内容(比如 动画)快速保存为视频文件的场景。
  • 用到的sdk: import { ImgClip, MediaStreamClip, VisibleSprite, renderTxt2ImgBitmap, } from '@webav/av-cliper';
  • 注意事项:

2.摄像头(Camera)

  • 功能简介:
  • 用到的sdk: import { AVRecorder } from "@webav/av-recorder"; import { fixFMP4Duration } from "@webav/av-cliper";
  • 注意事项:
    • 摄像头1不显示时长,摄像头2显示时长
    • 摄像头1是实时视频流不能确定结束时间,所以会缺失总时长字段,大部分播放器能分析 Sample 显示正确的总时长; 但某些兼容性较差的播放器(Windows Media Player)无法显示时长信息。
    • 摄像头2是fixFMP4Duration 临时将内容保存到一个 OPFS 中,在视频流结束时添加总时长字段; 因为需要在流结束的时候去修正时长信息,所以无法在录制过程中实时上传数据。
    • 摄像头2与摄像头1的差异在于: 视频数据临时保存在 OPFS 中,在录制结束时修正了时长(duration)字段,所以在点击 Stop 时才需要创建本地文件。
const outStream = await fixFMP4Duration(recorder.start());

五、绿幕抠图(other)

1.图片背景(Image Background)

  • 功能简介:
  • 用到的sdk: import { createChromakey } from "@webav/av-cliper";
  • 注意事项:

2.视频背景(Video Background)

  • 功能简介:在背景图上叠加两个视频,左边是原视频,右边是移除绿幕背景后的效果。
  • 用到的sdk: import { Combinator, ImgClip, MP4Clip, OffscreenSprite, createChromakey, } from '@webav/av-cliper'
  • 注意事项: