javascript - 如何从 JavaScript 中的输入文件生成视频缩略图?

标签 javascript html file video

如何从输入文件中绘制视频的图像缩略图?这是我到目前为止所尝试过的

let targetInput = document.getElementById('video-input');

targetInput.addEventListener('change', function(e) {
    let videoMetaData = (file) => {
        return new Promise(function(resolve, reject) {
            let video = document.createElement('video');
            
            // video.preload = 'metadata';

            video.onloadedmetadata = function() {
                // window.URL.revokeObjectURL(video.src);
                // console.log(video.src)
                
                resolve({
                    video: video,
                    duration: Math.round(video.duration * 1000),
                    height: video.videoHeight,
                    width: video.videoWidth
                })
            }

            video.src = URL.createObjectURL(file);
        })
    }

    videoMetaData(e.target.files[0]).then(function(value) {
        let videoCanvas = document.createElement('canvas');
        videoCanvas.height = value.height;
        videoCanvas.width = value.width;
        videoCanvas.getContext('2d').drawImage(value.video, 0, 0)
        var snapshot = videoCanvas.toDataURL();

        console.log(snapshot)
    })
})
<input type="file" id="video-input" />

该代码正在运行。您可以在浏览器控制台上看到结果,但为什么图像 URI 结果为空?

最佳答案

我只能想到这一点:您缺少附加 <video>创建后将元素添加到正文:document.createElement('video');

您只需附加它进行测试即可:

// after this line
video.src = URL.createObjectURL(file);

// try this...
video.controls = 'controls';            
document.body.appendChild(video);

更新:

let targetInput = document.getElementById('video-input');

targetInput.addEventListener('change', function(e) {
    let videoMetaData = (file) => {
        return new Promise(function(resolve, reject) {
            let video = document.createElement('video');
            
            // video.preload = 'metadata';

            video.addEventListener('canplay', function () {
                resolve({
                    video: video,
                    duration: Math.round(video.duration * 1000),
                    height: video.videoHeight,
                    width: video.videoWidth
                });
            });


            video.src = URL.createObjectURL(file);

            document.body.appendChild(video);
            
            video.play();
        })
    }

    videoMetaData(this.files[0]).then(function(value) {
        let videoCanvas = document.createElement('canvas');

        videoCanvas.height = value.height;
        videoCanvas.width = value.width;
        videoCanvas.getContext('2d').drawImage(value.video, 0, 0);
        var snapshot = videoCanvas.toDataURL('image/png');

        var img = new Image();
        
        img.onload = function () {
          document.body.appendChild(this);
        };
        
        img.src = snapshot;
    })
})
<input type="file" id="video-input" />

关于javascript - 如何从 JavaScript 中的输入文件生成视频缩略图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59512475/

相关文章:

javascript - 谷歌放置 api 不返回几何

javascript - 如何将子元素附加到悬停元素?

javascript - 使用输入按钮创建动态表单

html - 背景图片全高

java - 在java中构建后无法读取文件

android - 如何修改意味着将xml文件保存在android中的同一资源文件夹中

php - 使用php追加到文本文件的下一行

javascript - Backbone - 集合中所有模型的聚合器事件触发

javascript - 如何从表中获取所有值

javascript - 尝试使用 Pusher 读取交换数据