前端取视频第一帧图片

前端取视频第一帧图片:

<!-- 'data:image/jpeg;base64' +  -->
<div style="width:200px;height:200px">
  <img :src="videoImg" alt="" width="200px" height="200px">
</div>
	//mounted()里初始化  url 视频地址
	this.getVideoBase64(url);
	
    // 获取视频第一帧图片
    getVideoBase64(url) {
      let _this = this;
      return new Promise(function(resolve, reject) {
        let dataURL = "";
        let video = document.createElement("video");
        video.setAttribute("crossOrigin", "anonymous"); //处理跨域
        video.setAttribute("src", url);
        video.setAttribute("width", 400);
        video.setAttribute("height", 240);
        video.setAttribute("preload", "auto");
        video.addEventListener("loadeddata", function() {
          let canvas = document.createElement("canvas"),
            width = video.width, //canvas的尺寸和图片一样
            height = video.height;
          canvas.width = width;
          canvas.height = height;
          canvas.getContext("2d").drawImage(video, 0, 0, width, height); //绘制canvas
          dataURL = canvas.toDataURL("image/jpeg"); //转换为base64
          _this.videoImg = dataURL;
          resolve(dataURL);
        });
      });
    },

参考:

    <video width="320" height="240" controls id="upvideo"></video>    
    
    // 获取视频第一帧图片
    getVideoBase64(url) {
      return new Promise(function(resolve, reject) {
        let dataURL = "";
        let video = document.createElement("video");
        video.setAttribute("crossOrigin", "anonymous"); //处理跨域
        video.setAttribute("src", url);
        video.setAttribute("width", 400);
        video.setAttribute("height", 240);
        video.setAttribute("preload", "auto");
        video.addEventListener("loadeddata", function() {
          let canvas = document.createElement("canvas"),
            width = video.width, //canvas的尺寸和图片一样
            height = video.height;
          canvas.width = width;
          canvas.height = height;
          canvas.getContext("2d").drawImage(video, 0, 0, width, height); //绘制canvas
          dataURL = canvas.toDataURL("image/jpeg"); //转换为base64
          resolve(dataURL);
        });
      });
    },
 
    // videoSrc为视频路径,dataURL就是取到的图片了
    let dataURL = this.getVideoBase64(this.videoSrc);
 
 
 
   // 取视频第一帧作为封面
    findvideocover(url) {
      let _this = this;
      this.$nextTick(() => {
        let video = document.getElementById("upvideo");
        let source = document.createElement("source");
        source.src = url;
        source.type = "video/mp4";
        video.appendChild(source);
        video.addEventListener("loadeddata", function() {
          var canvas = document.createElement("canvas");
          canvas.width = "320";
          canvas.height = "320";
          canvas
            .getContext("2d")
            .drawImage(video, 0, 0, canvas.width, canvas.width);
          // var img = document.createElement("img");
          // let imgsrc = canvas.toDataURL("image/png");
          // console.log(_this.imgUrl)
          // _this.Videoframehandle(imgsrc.split(",")[1]);
        });
      });
    },
    
    // 再mounted里面直接调用 this.findvideocover(this.videoSrc)

参考:https://blog.youkuaiyun.com/weixin_45455227/article/details/119378841

### 提视频文件的第一帧 在 JavaScript 中,可以通过 `<video>` 元素和 `canvas` 来实现从视频文件中提第一帧的功能。以下是具体方法: 通过创建一个隐藏的 `<video>` 元素加载视频文件,并将其播放到第一帧的位置,然后利用 `<canvas>` 将当前帧绘制出来并转换为图像数据。 #### 实现代码示例 ```javascript function extractFirstFrame(videoFile) { const video = document.createElement('video'); const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); return new Promise((resolve, reject) => { video.onloadedmetadata = () => { // 设置画布大小与视频一致 canvas.width = video.videoWidth; canvas.height = video.videoHeight; // 当视频可以播放时触发事件 video.play().then(() => { requestAnimationFrame(() => { // 绘制视频第一帧到画布上 context.drawImage(video, 0, 0, canvas.width, canvas.height); // 停止视频播放 video.pause(); // 获取图片数据 URL resolve(canvas.toDataURL()); }); }).catch(reject); }; video.onerror = (error) => { reject(error); }; // 创建对象URL用于加载本地文件 const url = URL.createObjectURL(videoFile); video.src = url; }); } // 使用示例 const input = document.querySelector('input[type="file"]'); input.addEventListener('change', async (event) => { try { const file = event.target.files[0]; const firstFrameDataUrl = await extractFirstFrame(file); console.log(firstFrameDataUrl); // 输出第一帧作为 Data URL } catch (error) { console.error('Error extracting the first frame:', error); } }); ``` 上述代码实现了以下功能: 1. 动态创建了一个不可见的 `<video>` 和 `<canvas>` 元素。 2. 加载用户上传的视频文件至 `<video>` 元素。 3. 利用 `requestAnimationFrame()` 确保视频第一帧被正确渲染后立即停止播放。 4. 使用 `<canvas>` 的 `drawImage()` 方法捕获视频第一帧。 5. 转换捕获的内容为 Base64 编码的数据 URI[^3]。 此方法不依赖于外部库或插件,完全基于浏览器内置 API 完成操作。 --- ### 关键技术点说明 - **HTMLMediaElement**: 在 Chromium 源码中的 `HTMLMediaElement::loadInternal()` 函数负责处理媒体资源的选择逻辑[^1]。虽然该函数本身并不直接影响前端开发者的实际编码过程,但它提供了底层支持来确保视频能够正常加载。 - **Build Argument Configuration**: 变量 `use_openh264` 是构建参数的一部分,在某些情况下可能会影响 H.264 解码器的支持情况[^2]。然而对于大多数现代浏览器而言,默认已经具备良好的解码能力,因此无需特别关注这一配置项即可完成基本需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值