如何创建带有 alpha 通道的 h264 视频以用于 HTML5 Canvas?

Posted

技术标签:

【中文标题】如何创建带有 alpha 通道的 h264 视频以用于 HTML5 Canvas?【英文标题】:How to create an h264 video with an alpha channel for use with HTML5 Canvas? 【发布时间】:2011-06-30 16:03:34 【问题描述】:

我对这个演示很感兴趣:http://jakearchibald.com/scratch/alphavid/

我也在这里看到了这个问题:

Can I have a video with transparent background using html5 video tag?

但我似乎无法弄清楚:如何创建带有 alpha 通道的 h264、ogg 和 webm 视频文件?

【问题讨论】:

【参考方案1】:

如果您使用 QuickTime 从 your demo 打开 this video,您将看到一个具有单独 RGB 和 A 区域的视频:

如果您随后查看演示代码,您会发现它使用一个屏幕外 HTML5 Canvas 来绘制每个视频帧,从该画布的后半部分读取 alpha 像素以设置显式的每像素 alpha前半部分的值,然后使用putImageData 将结果推送到另一个实际显示视频的 HTML5 Canvas。

function processFrame() 
  buffer.drawImage(video, 0, 0);
                
  var image = buffer.getImageData(0, 0, width, height),
      imageData = image.data,
      alphaData = buffer.getImageData(0, height, width, height).data;
                
  for (var i=3, len=imageData.length; i<len; i += 4)
    imageData[i] = alphaData[i-1];
  
                
  output.putImageData(image, 0, 0, 0, 0, width, height);

再加上网络上的各种说法,即 H.264 不支持 alpha,我几乎确信 H.264 不支持 alpha。我这样说是因为我在 Apple 计算机的“Leopard”版本的 OS X 中找到了多次引用 Apple 计算机关于更新 QuickTime 的 2006 年报价:

QuickTime 的管道在 Leopard 中得到了重大升级。在处理 H.264 编码方面已经有了显着的改进。此外,基于 H.264 的 QuickTime 电影现在支持 透明 alpha 层,这是 H.264 规范的可选部分。最后,QuickTime 支持 64 位。

然而,我发现与此营销报价相关的唯一内容是 this document 展示了如何在 QuickTime Pro 中更改视频层的整体不透明度。

【讨论】:

嗨@Phrogz,谢谢你,我开始明白了。但这是另一个问题。我不是 javascript 专家,所以如果这很明显,我深表歉意,但这就是我认为发生的事情:for 循环遍历图像数据数组的每个第 4 个元素,which apparently represents the alpha channel,前三个是R、G 和 B。但你是说这个演示创建了没有实际 Alpha 通道的 Alpha 数据,对吗? @chuls 正确:ImageData 对象的data 属性是一个称为CanvasPixelArray 的平面数组结构,它具有串联的所有RGBA 值。上面的脚本从图像下半部分的蓝色通道中获取值,并将它们用作上半部分的 alpha 值。然后它将每个帧创建的这个新的带有 alpha 的图像复制到输出。 非常感谢您的帮助,我终于明白这里发生了什么。【参考方案2】:

WebM 现在确实支持透明度,Chrome 29+ 可以在没有标志的情况下播放它。

http://updates.html5rocks.com/2013/07/Alpha-transparency-in-Chrome-video

但它不适用于 android 版 Chrome。

【讨论】:

以上是关于如何创建带有 alpha 通道的 h264 视频以用于 HTML5 Canvas?的主要内容,如果未能解决你的问题,请参考以下文章

python 生成带有alpha 通道的视频

VFW(Windows 视频)API 是不是支持 Alpha 通道透明度?

python 生成带有alpha 通道的视频

Unity中播放带有alpha通道格式为Mp4的视频

透明视频,如何在每台设备上正确显示 webm 文件的 alpha 通道; VP9 还是 VP8 编码?

OpenCV - 如何检测带有 alpha 通道的标记