如何(功能)检测浏览器是否支持WebM alpha透明度?

时间:2015-04-02 15:19:43

标签: javascript html5-video webm

我将* .webm视频与Alpha透明度集成在一起。目前,Chrome和Opera仅支持透明度。 (演示:http://simpl.info/videoalpha/)例如,Firefox支持WebM格式播放​​视频,但不是透明度,而是黑色背景。

如果浏览器不支持Alpha透明度,我的计划是显示视频海报图片而不是视频。因此,如果浏览器支持WebM alpha透明度,则视频应该只播放。我知道如何检测浏览器或渲染引擎,因此播放视频(见下面的代码) - 但是有一个"功能检测"方式是什么?

var supportsAlphaVideo = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) || (/OPR/.test (navigator.userAgent));
if (supportsAlphaVideo) {
document.querySelector(".js-video").play();
}

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

2 个答案:

答案 0 :(得分:6)

这是一个在WebM中测试alpha支持的工作解决方案。

我基本上合并了Capture first frame of an embedded videocheck_webp_feature

用于测试的视频是base64编码到源中。它实际上是一个很小的VP9 WebM视频编码使用:

ffmpeg -i alpha.png -c:v libvpx-vp9 alpha.webm

如果您想测试VP8 alpha支持,只需编码您自己的并删除-vp9。 alpha.png是一个64x64像素的100%透明PNG图像。

var supportsWebMAlpha = function(callback)
{
    var vid = document.createElement('video');
    vid.autoplay = false;
    vid.loop = false;
    vid.style.display = "none";
    vid.addEventListener("loadeddata", function()
    {
        document.body.removeChild(vid);
        // Create a canvas element, this is what user sees.
        var canvas = document.createElement("canvas");

        //If we don't support the canvas, we definitely don't support webm alpha video.
        if (!(canvas.getContext && canvas.getContext('2d')))
        {
            callback(false);
            return;
        }

        // Get the drawing context for canvas.
        var ctx = canvas.getContext("2d");

        // Draw the current frame of video onto canvas.
        ctx.drawImage(vid, 0, 0);
        if (ctx.getImageData(0, 0, 1, 1).data[3] === 0)
        {
            callback(true);
        }
        else
        {
            callback(false);
        }

    }, false);
    vid.addEventListener("error", function()
    {
        document.body.removeChild(vid);
        callback(false);
    });

    vid.addEventListener("stalled", function()
    {
        document.body.removeChild(vid);
        callback(false);
    });

    //Just in case
    vid.addEventListener("abort", function()
    {
        document.body.removeChild(vid);
        callback(false);
    });

    var source = document.createElement("source");
    source.src="data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlYm1Ch4ECQoWBAhhTgGcBAAAAAAACBRFNm3RALE27i1OrhBVJqWZTrIHlTbuMU6uEFlSua1OsggEjTbuMU6uEHFO7a1OsggHo7AEAAAAAAACqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAADIq17GDD0JATYCNTGF2ZjU3LjU3LjEwMFdBjUxhdmY1Ny41Ny4xMDBEiYhARAAAAAAAABZUrmsBAAAAAAAARq4BAAAAAAAAPdeBAXPFgQGcgQAitZyDdW5khoVWX1ZQOYOBASPjg4QCYloA4AEAAAAAAAARsIFAuoFAmoECU8CBAVSygQQfQ7Z1AQAAAAAAAGfngQCgAQAAAAAAAFuhooEAAACCSYNCAAPwA/YAOCQcGFQAADBgAABnP///NXgndmB1oQEAAAAAAAAtpgEAAAAAAAAk7oEBpZ+CSYNCAAPwA/YAOCQcGFQAADBgAABnP///Vttk7swAHFO7awEAAAAAAAARu4+zgQC3iveBAfGCAXXwgQM=";
    source.addEventListener("error", function()
    {
       document.body.removeChild(vid);
       callback(false);
    });
    vid.appendChild(source);

    //This is required for IE
    document.body.appendChild(vid);
};

supportsWebMAlpha(function(result)
{
   if (result)
   {
       alert('Supports WebM Alpha');
   }
   else 
   {
       alert('Doesn\'t support WebM Alpha');
   }
});

答案 1 :(得分:2)

没有公开属性,提供有关视频及其频道的任何信息。

唯一的方法是:

  • 事先了解,将这些知识与数据相结合,并在视频作为元数据请求时将其提供给浏览器
  • 使用画布分析图像数据
  • 将文件加载为二进制数据,然后手动解析webm格式以提取此信息。可以但非常不方便,因为必须下载完整的文件,当然还必须提供解析器。

如果您事先不知道,或者无法提供元数据,那么画布是您的最佳选择。

帆布

您可以使用画布来测试实际透明度,但是,这确实有CORS要求(视频必须位于同一服务器上,或者外部服务器需要接受跨源使用)。

此外,您必须实际开始加载视频,这当然会对带宽和性能产生影响。您可能希望使用动态创建的视频和画布标记来执行此操作。

从那时起,这是相当直接的。

  • 创建一个小画布
  • 在其中绘制一个框架(预计会有一个alpha通道)
  • 提取像素(此处为CORS要求)
  • 使用Uint32Array视图循环缓冲区并检查alpha通道的值< 255(pixel & 0xff000000 !== 0xff000000)。

这是相当快的,你可以使用一半或更小的帧大小。