首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HTML5:在IOS中,在画布中手动“播放”视频

HTML5:在IOS中,在画布中手动“播放”视频
EN

Stack Overflow用户
提问于 2012-05-30 08:33:27
回答 2查看 10.3K关注 0票数 6

所以,我想做的是:我想把一个视频加载到一个视频元素中,但不是以“正常”的方式播放。使用一个时间间隔,根据电影的框架计算,我希望在每次迭代中

手动推进视频一帧(或尽可能接近)。

把那个框架画成画布。

从而使视频“播放”在画布内。

下面是一些代码:

代码语言:javascript
运行
复制
<video width="400" height="224" id="mainVideo" src="urltovideo.mp4" type="video/mp4"></video>
<canvas width="400" height="224" id="videoCanvas"></canvas>

<script type="text/javascript">

var videoDom = document.querySelector("#mainVideo");
var videoCanvas = document.querySelector("#videoCanvas");
var videoCtx = null;
var interval = null;

videoDom.addEventListener('canplay',function() {
   // The video's framerate is 24fps, so we should move one frame each 1000/24=41.66 ms
   interval = setInterval(function() { doVideoCanvas(); }, 41.66);
});

videoDom.addEventListener('loadeddata',function() {
  videoCtx = videoCanvas.getContext('2d');
});

function doVideoCanvas() {
  videoCtx.drawImage(videoDom,0,0);
  //AFAIK and seen, currentTime is in seconds
  videoDom.currentTime += 0.0416;
}

</script>

这在Google中非常有效,但在Iphone的Safari中却不起作用;

视频帧完全不被绘制到画布上。

我确保:

  • 我连接到的视频事件确实会被触发(做了“警报”并显示出来)。
  • 我控制着画布(做了一个'fillRect‘,它被填充了)。

我还试着在drawImage中指定维度--这没有帮助

带视频对象的drawImage 在Iphone .?中根本不适用

即使我能找到一种捕获视频帧的方法,Iphone浏览器中还有其他一些问题:

  • 只有在视频开始播放(以标准方式)时,才授予对视频的currentTime属性的访问权限。我想也许是“玩隐藏的”然后捕捉,但我没有做到这一点。也想过也许可以开始播放视频,然后立即停止播放; 在IOS Safari中,似乎没有任何方法可以强行开始播放视频。video.play(),或autoplay似乎什么也不做。只有当用户点击视频上的“播放圈”时,视频才会开始播放(就像IPhone浏览器上的视频一样,屏幕上到处都是视频)。
  • 一旦视频播放- currentTime属性确实被转发。在视频上。当您暂停视频并返回到普通的html页面时,您可以看到视频元素上的帧正在发生变化。不过,在一个缓慢的阶段(与谷歌Chrome不同,Chrome的速度看起来足以让它看起来像是在播放)--在iphone中,它看起来可能是每秒2-3帧的速度。即使我尝试更改间隔时间,它也保持不变,我想IPhone上的浏览器可以处理的时间限制是最小的。

“奖励问题” :) -当视频元素上的帧从事件中进展时,圆圈"play按钮“在视频元素上是可见的(因为它实际上不是‘play’)。有什么办法把它藏起来让它隐形吗?

这已经在iPhone3GS( 3G和Wifi)和Iphone 4上进行了测试,它们都运行IOS 5,结果与描述相同。

EN

回答 2

Stack Overflow用户

发布于 2012-05-30 09:57:43

不幸的是,我没有一个iOS设备来测试这一点,但我认为您不需要像使用currentTime属性那样实际捕获视频帧。通常的过程如下所示:

  1. 创建一个没有控件的视频元素(省略controls属性)
  2. 隐藏元素
  3. 当视频播放时,在间隔时间将它画到画布上。

正如您已经发现的,iOS设备不支持HTML5视频(或音频)上的自动播放,但是您可以创建一个单独的控件来使用play()方法启动视频的回放。

这种方法应该可以解决播放按钮可见的问题,因为在这种情况下,您实际上是在播放视频。

票数 1
EN

Stack Overflow用户

发布于 2020-05-27 05:15:42

我不相信loadeddata事件是在iOS上调用的,而是尝试loadedmetadata事件。我还发现iOS有必要在设置videoDom.src之后调用videoDom.load()方法。

对于我的用例,我需要在dRAF事件之后执行一个“requestAnimationFrame”(double requestAnimationFrame),以确保某些东西实际上被绘制到画布上,而不是透明的矩形。

试一试如下:

代码语言:javascript
运行
复制
videoDom.onloadedmetadata = () => {
  videoCanvas.height = videoDom.videoHeight
  videoCanvas.width = videoDom.videoWidth
  videoDom.currentTime = 0
}

videoDom.onseeked = () => {
  // delay the drawImage call, otherwise we get an empty videoCanvas on iOS
  // see https://stackoverflow.com/questions/44145740/how-does-double-requestanimationframe-work
  window.requestAnimationFrame(() => {
    window.requestAnimationFrame(() => {
      videoCanvas.getContext('2d').drawImage(videoDom, 0, 0, videoCanvas.width, videoCanvas.height)
      videoDom.currentTime += 0.0416
    })
  })
}

videoDom.load()

来自这个要旨

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10812699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档