【发布时间】:2012-12-29 07:01:07
【问题描述】:
我需要在使用 HTML5 的移动设备上播放具有透明背景的视频。在 Windows Phone 上,我可以捕获视频标签的当前帧并将其显示在画布中。但这不适用于 Android 和 iOS 设备(我认为是出于安全原因?)
我的解决方案是使用 FFMPEG 拆分 .flv,然后将这些帧拼接成大图像,例如精灵表。
问题是当我切换到新的框架表时动画“挂起”。我只是在视觉上和通过控制台检查了这一点(通过在我更改当前精灵表行时记录。)我已经通过查看当我更改精灵表时它如何挂起以及当我如何不挂起来测试它只需一遍又一遍地循环同一张纸。
我预先加载了所有图片:
var frameImages = [];
for(var i = 0; i < 35; i++)
{
frameImages.push(new Image());
frameImages[i].src = 'frame' + i + '.png';
console.log(frameImages[i].src);
frameImages[i].onload = function()
{
// Notify us that it's been loaded.
console.log("Image loaded");
}
}
然后这样玩:
processFrame = function()
{
outputCanvas.width = outputCanvas.width;
output.drawImage(frameImages[currentFrame], (curCol*153), (curRow*448), 153, 448, 0, 0, 153, 448);
curCol += 1;
if(curCol >= maxCol)
{
curCol = 0;
curRow += 1;
if(curRow >= maxRow)
{
curRow = 0;
currentFrame++;
}
}
}
}
var mozstart = window.mozAnimationStartTime;
step = function(timestamp) {
var diff = (new Date().getTime() - start) - time;
if(diff >= frameDelay)
{
processFrame();
time += frameDelay;
}
}
我已经在 Win 7 机器上的 Chrome v 23.0.1271.97 m 和带有 Chrome 的 Nexus 7 上尝试过这个。
在这里查看它的实际效果:
http://savedbythecode.com/spokes/mozanimation.php - 这是使用 mozAnimationStartTime
和http://savedbythecode.com/spokes/newplayer.php - 这是使用每一步都会调整的常规 JS 计时器(来自http://www.sitepoint.com/creating-accurate-timers-in-javascript/)
有什么想法吗?问题够清楚了吗?
谢谢, 凯文
【问题讨论】:
-
对客户来说似乎效果很好。
-
我的意思是,如果它损害了业务,那么为此付钱给他的人就不会继续付钱给他了。他的生意在增长,而不是在萎缩。最重要的是,你必须牢记观众。我们对技术非常满意,我们这一代人也是。我的客户处理的业务通常拥有对技术不太满意的年龄较大的受众。有时甚至对他们来说是压倒性的。让网站上的某个人与他们交谈,可能会让他们更舒服,更容易消化信息。再说一遍,这不关我的事。
-
它在 Chrome 中对我来说工作正常,但只有在加载所有帧之后,所以你可能想要延迟动画直到所有精灵完全加载。不确定您是否在其他浏览器中进行过任何调试,但我在 Firefox 中的动画出现延迟(声音不同步),并且在 Opera 中我看不到动画也听不到声音。它在 IE8 中不起作用,但这是意料之中的 LOL。也许为不兼容 HTML5 的 IE 浏览器使用背景声音,并确保那里不调用不支持的功能?不过,我可以预见视频+音频同步问题。到目前为止做得很好!!! ;)
-
只是一个离题的观察,但演示者的底部几乎没有移动(没有双关语,哈哈),我认为这可能会节省带宽。动画的下半部分只是在演示者“进入”时逐帧真正不同,然后她只是随着她的手移动而轻微摆动。我意识到这意味着很多额外的工作可能没有被请求,或者确实没有付费,但可能会节省大约 40% 的带宽。
-
这实际上只需要在 Android 和 iOS 设备上工作,客户端已经有一个类似于我的 Windows Phone 解决方案的现有 Web 解决方案。所以我不必担心支持 IE :)。