videodecoder.configure() 必须显式传入codec(如'avc1.42e01e')和codedwidth/codedheight(偶数、编码流分辨率),否则decode()静默失败或抛invalidstateerror;videoframe必须手动close()防内存泄漏;mp4需先解封装提取sample再构encodedvideochunk;worker中须本地创建decoder并转移buffer,videoframe需转imagebitmap跨线程。

VideoDecoder.configure() 必须传 codec 和 codedWidth/codedHeight
浏览器不会从 EncodedVideoChunk 自动推断视频参数,必须显式配置解码器。漏掉 codec(如 'avc1.42E01E')或尺寸信息,decoder.decode() 会静默失败或抛出 InvalidStateError。
常见错误现象:解码无输出、output 回调不触发、控制台无报错但帧没出来。
-
codec字符串需与实际编码格式严格匹配(可用MP4Box.js解封装后从 track.codec 获取) -
codedWidth/codedHeight是编码流分辨率(不是显示宽高),必须是偶数,且通常 ≥ 视频实际宽高 - 若视频有分辨率切换(如自适应流),需在切换前调用
decoder.configure()重新配置
VideoFrame 必须手动 close(),否则内存持续增长
每个由 VideoDecoder.output 回调返回的 VideoFrame 对象都持有 GPU 或系统内存资源。不调用 .close(),浏览器无法回收,几秒内就可能触发 OOM 或卡顿。
使用场景:无论你是把帧画到 canvas、转成 ImageBitmap、还是送进 WebAssembly 处理,只要不再需要该帧的像素数据,就必须立刻 frame.close()。
- 不要在
output回调里做耗时操作(如ctx.drawImage()后再close())——应先close(),再异步处理 - 若需多处使用同一帧(如同时渲染 + 上传),得用
frame.clone(),原帧仍要close() - 在
Worker中处理时,VideoFrame不能直接跨线程传递,需用transferToImageBitmap()或序列化像素
从 MP4 文件抽帧必须先解封装,不能直接读取 ArrayBuffer
浏览器的 VideoDecoder 只接受标准的 EncodedVideoChunk,而原始 MP4 文件是容器格式,包含 moov、mdat 等 box 结构,不能直接喂给解码器。
典型错误:把整个 ArrayBuffer 当作 H.264 NALU 数据传入,结果 decode() 报 EncodingError 或解出全黑帧。
- 必须用
MP4Box.js或类似工具解析 MP4,提取videoTrack.samples - 每个
sample.data是一段编码帧数据(如一个 IDR 帧或 P 帧),需包装为EncodedVideoChunk -
timestamp要用sample.cts(composition time stamp),单位是微秒;duration同理,别用sample.dts - 关键帧判断靠
sample.isSync(MP4Box)或sample.isKeyframe(部分解析器),决定type: 'key'还是'delta'
Web Workers 中使用 VideoDecoder 需注意 transferable 对象限制
虽然 WebCodecs 支持 Worker 线程,但 VideoDecoder 实例本身不可转移,只能在创建它的线程中使用。你不能把 decoder 从主线程 postMessage 到 Worker。
正确做法是在 Worker 内部新建 VideoDecoder,并通过 postMessage(..., [transferList]) 传递 EncodedVideoChunk.data.buffer 等可转移对象。
-
EncodedVideoChunk.data必须是ArrayBuffer,且创建时用new Uint8Array(buffer).buffer确保可转移 - Worker 中解码后的
VideoFrame也不能直接传回主线程,需转成ImageBitmap或用createImageBitmap()构造后再 transfer - Chrome 120+ 开始支持
VideoFrame的transferToImageBitmap(),但 Firefox 尚未实现,兼容写法是先copyTo()再构造
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











