普通视图

发现新文章,点击刷新页面。
今天 — 2026年4月18日首页
昨天 — 2026年4月17日首页

借助mediabunny纯JS实现视频水印、剪裁、合成等功能

作者 张 鑫旭
2026年4月17日 15:22

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=12166
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

一、推荐使用mediabunny

大约2年前,我更新了大量的音视频处理的文章,不过里面的技术实现大都使用原生代码和WebCodecs API手搓的实现。

因为那个时候,WebCodecs API刚出来,技术还不成熟。

自然而然,就陆续出现了不少基于WebCodecs API封装的音视频处理框架。

经过这些年的发展,有一个媒体工具包异军突起,那就是mediabunny!

项目地址:https://github.com/Vanilagy/mediabunny

mediabubby logo

2个月前,我在微博介绍过的MP4/MOV视频转WebM格式在线工具就使用了此项目。

视频转格式截图

mediabunny的能力不仅仅在于视频格式转换与压缩,添加水印、时长剪裁等都不在话下,本文就通过我跑通的demo给大家看下这类需求该如何实现。

二、给视频添加水印

话不多说,先直接上手体验。

您可以狠狠地点击这里:纯前端实现视频添加水印效果demo

选择视频和需要的水印图片,就可以得到最终的效果了,如下截图所示:

水印合成效果示意

其中,最关键的合成就是下面这部分代码:

let ctx = null;
const conversion = await Conversion.init({
    input,
    output,
    video: {
        process: (sample) => {
            if (!ctx) {
                // 创建canvas
                const canvas = new OffscreenCanvas(
                    sample.displayWidth,
                    sample.displayHeight
                );
                ctx = canvas.getContext('2d');
            }

            ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
            sample.draw(ctx, 0, 0);
            ctx.drawImage(watermark, 80, 80 * watermark.naturalHeight / watermark.naturalWidth);

            return ctx.canvas;
        }
    }
});

使用Conversion.init解码视频的每一帧(sample),然后使用canvas将画面和水印图重新绘制,再返回当前canvas即可。

其实不仅是水印合成,任何画面特效,字幕添加,遮罩,尺寸设置都可以使用此方法实现,原理都是一样的,都是对图像进行处理。

三、Video视频前后剪裁

同样的,先看实现效果。

您可以狠狠地点击这里:纯前端实现视频首尾剪裁demo

选择任意的视频,然后拖选滑竿选择需要的视频片段,点击红色的剪裁按钮,就可以看到被剪裁后的视频了:

剪裁demo示意

实际生产环境,拖拽的应该是缩列图的左右两个小翅膀,这里为了简化使用,使用了LuLu UI的双滑块模拟。

其核心实现代码极为简单:

const input = new Input({
    formats: ALL_FORMATS,
    source: new BlobSource(videoFile),
});
const output = new Output({
    format: new Mp4OutputFormat(), // The format of the file
    target: new BufferTarget(),
});

const eleRange = range.querySelector('input');  
const conversion = await Conversion.init({
    input,
    output,
    trim: {
        start: eleRange.from,
        end: eleRange.to,
    },
});

await conversion.execute();

使用trim参数,指定起止时间就可以了。

完整代码可以访问演示页面。

四、多音频和画面的视频合成

一例胜千言,您可以狠狠地点击这里:纯前端实现画面加音频的视频合成demo

默认提供了字幕、背景图、台词,背景音乐可选,用户可以自己上传,可以合成最终的视频:

视频合成demo截图

我查了下API,mediabunny中似乎缺少AudioBuffer处理方法,当然,也可能有,我自己没找到。

这里的AudioBuffer剪裁和合并用的是我自己之前手搓的方法。

相关源码在页面左侧(移动端在下方)有完整展示,基本上相关的视频合成都可以实现了。

这里提供下核心实现部分:

// 定义一个视频合成输出
const output = new Output({
    format: new Mp4OutputFormat(), 
    target: new BufferTarget(),
});

// 添加视频轨道,画面源自canvas
const videoSource = new CanvasSource(canvas, {
    codec: 'avc',
    bitrate: QUALITY_HIGH,
});
output.addVideoTrack(videoSource);

// 添加音轨
const audioSource = new AudioBufferSource({
    codec: 'aac',
    bitrate: QUALITY_HIGH,
});
output.addAudioTrack(audioSource);

await output.start();

// 获取音频文件
const duration = audioFile.duration;

// 每秒30帧
for (let frame = 0; frame < 30 * duration; frame++) {
    draw(frame);
    await videoSource.add(frame / 30, 1 / 30);
}

// 获取音频的 audioBuffer……(代码略),然后添加
await audioSource.add(audioBuffer);

await output.finalize();

五、广告时间

推荐下我几年前在掘金上更新的人文类课程《技术写作指南》

技术写作指南

既是关于写作,也是关注个人成长!

OK,就说这么多,如果你觉得本文内容对你的工作与学习有所帮助,欢迎转发,点赞!

😉😊😇
🥰😍😘

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=12166

(本篇完)

昨天以前首页

丰田在日本推出注重实用性的bZ4X Touring版电动车型

盖世汽车讯 丰田近日在日本推出基于现有bZ4X电动SUV打造的新型电动车型“bZ4X Touring”,该车采用旅行车(station wagon)造型,重点提升载物空间与日常实用性,标志着丰田电动车型战略从设计导向转向实用导向。

bZ4X Touring在车身结构上进行了针对性优化。相比原版bZ4X采用的溜背式车顶线条和倾斜后窗设计,新车型延长了车顶后段,并将近乎垂直的尾门结构应用于后部,显著改善了行李厢空间利用率。新车全长4,830毫米,宽1,860毫米,高1,675毫米,轴距维持2,850毫米不变,整体长度较原版增加140毫米,新增长度全部用于扩展储物空间,同时保持约5.6米的最小转弯半径。

官方数据显示,bZ4X Touring在第二排座椅正常使用状态下可提供619升的行李厢容积,约为原版的1.4倍,足以容纳四个高尔夫球包;当后排座椅放倒后,最大容积可扩展至1,240升,并形成长达1,850毫米的平整装载区域,适用于长途旅行或户外活动等场景。

动力系统方面,新车提供前轮驱动和四轮驱动两种版本。前驱版最大输出功率为165kW(224马力),四驱版为280kW(380马力)。根据WLTC测试标准,前驱版续航里程为734公里,四驱版为667公里,在车身尺寸增大的前提下,续航能力相较原版下降幅度被控制在较低水平。

在充电与电池管理方面,bZ4X Touring支持最高150kW直流快充,并配备电池温度管理系统以提升日常使用效率。丰田还提供10年或20万公里的电池保修服务,若电池容量衰减至初始值的70%以下,将免费更换。

价格方面,前驱版起售价约为575万日元(约合5,406万韩元),四驱版约为640万日元(约合6,017万韩元)。此外,消费者还可通过丰田旗下订阅服务“KINTO”以月付方式使用该车型。

此次推出的bZ4X Touring被视为丰田对电动车市场用户需求变化的回应,旨在吸引更注重车辆实际使用功能的消费群体。

❌
❌