如何拍摄基于 HTML5-JavaScript 的视频播放器的快照? [英] How to take a snapshot of HTML5-JavaScript-based video player?

查看:18
本文介绍了如何拍摄基于 HTML5-JavaScript 的视频播放器的快照?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

实际上,我有一个带有 JavaScript 功能的 HTML5 页面,它允许我播放 wmv 视频文件.我需要在视频播放时(有暂停或没有暂停)拍摄快照并以任何图像格式 JPG 或 BMP 保存.任何帮助将不胜感激.谢谢.

Actually, i have a HTML5 page with JavaScript function that allow me to play a wmv video file. I need to take a snapshot when the video is playing (with pause or without) and saved in any image format JPG or BMP whatever. Any help will appreciate. Thank you.

<!DOCTYPE HTML>

    <html>
        <head>
            <title>HTML5 video</title>        
    <script type="text/javascript">
        function checkPlay() {
            var myVideo = document.getElementById("myVid");
            var ytStr = '<iframe width="500" height="500" src="C:XA0002.wmv" frameborder="0" allowfullscreen></iframe>';
            try {
                var canPlay = document.getElementsByTagName('video')[0].canPlayType("video/wmv");
                if ((canPlay == "no") || (canPlay == "")) {
                    myVideo.innerHTML = ytStr;
                }
                new MediaElement(v, { success: function (media) { media.play(); } });
            } catch (err) {
                myVideo.innerHTML = ytStr;
            }
        }
    </script>
        </head>
        <body onload="checkPlay()">
          <div id="myVid"/>

      </body>
    </html>

推荐答案

将视频帧复制到图像文件涉及正确加载视频、将图像复制到画布并将其导出到文件.这是完全可能的,但有一些地方可能会遇到麻烦,所以让我们一步一步来.

To copy an video frame to an image file involves properly loading the video, copying the image to a canvas and exporting it to a file. This is totally possible, but there are a few places where you can run into trouble, so let's take it one step at a time.

1) 加载视频

要捕获像素,您需要将视频加载到 标签中,而不是 iframeobject 或 <代码>嵌入.并且该文件需要来自 Web 服务器,该服务器与网页本身所在的服务器相同(除非您使用 跨域标头,这很复杂,可能无法在您的浏览器中运行.出于安全原因,这受到浏览器的限制.您的代码从本地文件系统加载视频,这不会工作.

To capture the pixels, you need to load the video into a <video> tag, not an iframe or object or embed. And the file needs to come from a web server, which is the same one the web page itself is on (unless you use cross-origin headers, which is complicated and may not work in your browser. This is restricted by the browser for security reasons. Your code loads the video from the local file system, which won't work.

您还需要加载正确的文件格式.IE9+ 可以播放 WMV,但其他浏览器不太可能播放.如果可以,请加载多个来源,使用 webm、mp4 和理想的 ogg/理论.

You also need to load the right file format. IE9+ may play WMV, but it's unlikely that any other browser will. If you can, load up multiple sources, using webm, mp4 and ideally ogg/theora.

var container = document.getElementById("myVid"),
    video = document.createElement('video'),
    canCapture = true;
if (!video.canPlayType('video/wmv')) {
    /* If you don't have multiple sources, you can load up a Flash fallback here
       (like jPlayer), but you won't be able to capture frames */
    canCapture = false;
    return;
}
video.src = 'myvideo.wmv';
container.appendChild(video);
video.play(); //or put this in a button click handler if you want your own controls

2) 接下来,创建画布和绘图上下文.您实际上甚至不需要将其附加到 DOM,但您确实需要将其设置为您想要保存结果图像的大小.在本示例中,我们假设您有一个固定的尺寸,但如果您愿意,您可以将其设置为视频尺寸的倍数.只需确保在视频的loadedmetadata"事件中运行它,因为视频尺寸不会立即可用.

2) Next, create the canvas and a drawing context. You actually don't need to even attach it to the DOM, but you do need to set it to the size at which you want to save the resulting image. For this example, we'll assume you have a fixed dimension in mind, but if you want, you can set it to a multiple of the video size. Just make sure you run that inside a 'loadedmetadata' event on the video, because the video dimensions won't be available right away.

var canvas = document.createElement('canvas');
canvas.width = 640;
canvas.height = 480;
var ctx = canvas.getContext('2d');
// if you want to preview the captured image,
// attach the canvas to the DOM somewhere you can see it.

3) 将图像捕获到画布并将其保存到文件中.将此代码放在按钮上或计时器内的 onclick 事件中 - 但是您要决定何时捕获图像.使用 drawImage 方法.([这篇文章] 提供了很好的解释,包括安全问题.视频和图像一样.)

3) Capture the image to the canvas and save it to a file. Put this code in an onclick event on a button or inside a timer - however you want to decided when the image gets captured. Use the drawImage method. ([This article] provides a good explanation, including the security concerns. It's the same for video as for an image.)

//draw image to canvas. scale to target dimensions
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

//convert to desired file format
var dataURI = canvas.toDataURL('image/jpeg'); // can also use 'image/png'

4) 导出图片文件

jpg 文件现在保存为 Data URI,这是一个长 javascript 字符串,表示完整二进制文件的编码版本.这取决于你如何处理它.您可以将它直接放入 img 元素,只需将其设置为 src:myImage.src = dataUri;.

The jpg file is now saved as a Data URI, which is a long javascript string representing an encoded version of the full binary file. It's up to you what to do with it. You can place it directly into an img element by just setting it to the src: myImage.src = dataUri;.

如果要将其保存为文件,则几乎需要将其上传到服务器.这是一个很好的教程关于如何做到这一点.

If you want to save it to a file, you pretty much need to upload it to a server. Here is a good tutorial on how to do that.

像往常一样,以上所有内容都仅限于支持它的浏览器.如果您要坚持使用 wmv 视频,那么您几乎只能使用 Internet Explorer 9+.6-8 不支持视频标签或画布.如果您可以添加更多视频格式,则可以使用 Firefox (3.5+) 和 Chrome.

As usual, all of the above are restricted to browsers that support it. If you're going to stick to wmv video, you're pretty much limited to Internet Explorer 9+. 6-8 don't support either the video tag or the canvas. If you can add more video formats, you can use Firefox (3.5+) and Chrome.

这篇关于如何拍摄基于 HTML5-JavaScript 的视频播放器的快照?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆