uni-app 录制视频后截取第一帧做视频封面功能

发布于 1周前 作者 phonegap100 来自 Uni-App

uni-app 录制视频后截取第一帧做视频封面功能

具体需求我在拍摄视频之后,将所拍视频在前台通过类似js截取视频第一帧的方法截取视频第一帧后,用作视频的封面。

开发环境 版本号 项目创建方式
23 回复

不走服务器 不走FFmpeg,视频上传到各种 阿里云 oss 腾讯 这些平台。返回地址 携带参数就是第几帧 关键帧 图片大小 宽高。如果走cdn加速,就把图片生成 反穿给阿里云。


用ffmpeg在服务端搞过!效果还行!

<?php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create(); $video = $ffmpeg->open('15459882340389.mp4'); //上传的视频文件! $frameimg=$video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(1))->save('frame.jpg'); //frame.jpg 保存的图片!fromSeconds(1)表示第1秒的那个帧。 //echo($frameimg); echo("生成图片完成!"); ?>

下载个ffmpeg-php就行了!当然你的服务器还要安装ffmpeg了!

需求让做成前台在录制视频之后就截取第一帧,不走后台,哎、、

回复 8***@qq.com: 请问解决了吗

解决了吗,怎么做的

可以做,Q~ 1196097915

请问解决了吗????

原生插件可以实现,Q~ 1196097915

这个问题百度上面有现成的答案啊,直接canvas截取第一帧就可以啊

<image :src="url + '?x-oss-process=video/snapshot,t_0,f_jpg'" />

承接H5、小程序、APP等外包:

经验丰富,做过多种类型项目,有案例可看;
整个项目外包可以找我(小团队接单,面向客户、产品);
只需要前端部分也可以找我(个人接单,面向服务端合作伙伴);
wechat(13070273424);

可以做个插件,集成ffmpeg,需要第几秒的您说话都给你搞出来 哈哈 微信联系 zhimitec

我们有现成的插件可以实现此效果 有需要联系 微信 zhimitec

智密科技,专注于uniapp生态开发,拥有专职前端、安卓工程师、IOS工程师、硬件工程师、后端工程师、UI设计人员,提供Unaipp插件开发,app外包开发 这个是我们相册选择插件的一个功能点而已,需要的话可以联系我们 联系微信 zhimitec

顶顶顶顶顶顶顶顶

针对你提到的在uni-app中实现录制视频后截取第一帧作为视频封面功能,这里提供一个使用 canvasvideo 元素结合实现该功能的代码示例。该示例假设你已经通过uni-app的uni.chooseVideo接口录制了视频,并且获取到了视频的临时文件路径。

首先,确保你的页面有一个video元素用于播放视频,以及一个canvas元素用于绘制视频帧。

<template>
  <view>
    <video
      id="video"
      :src="videoSrc"
      @loadeddata="onVideoLoaded"
      controls
      style="display:none;"
    ></video>
    <canvas canvas-id="canvas" style="width: 320px; height: 240px;"></canvas>
    <image :src="coverImageSrc" mode="widthFix" style="width: 320px;"></image>
  </view>
</template>

<script>
export default {
  data() {
    return {
      videoSrc: '', // 视频文件路径
      coverImageSrc: '' // 视频封面图片路径
    };
  },
  methods: {
    async recordVideo() {
      try {
        const res = await uni.chooseVideo({
          sourceType: ['album', 'camera'],
          maxDuration: 60,
          camera: 'back'
        });
        this.videoSrc = res.tempFilePath;
        this.$nextTick(() => {
          this.createCoverImage();
        });
      } catch (error) {
        console.error('录制视频失败', error);
      }
    },
    onVideoLoaded() {
      this.createCoverImage();
    },
    createCoverImage() {
      const videoContext = uni.createVideoContext('video');
      videoContext.seek(0); // 跳转到视频的第一帧
      setTimeout(() => {
        const ctx = uni.createCanvasContext('canvas');
        ctx.drawImage('/path/to/your/video', 0, 0, 320, 240); // 注意:这里应为video元素的当前帧,但uni-app不直接支持,故用setTimeout模拟
        ctx.draw(false, () => {
          uni.canvasToTempFilePath({
            canvasId: 'canvas',
            success: (res) => {
              this.coverImageSrc = res.tempFilePath;
            },
            fail: (error) => {
              console.error('生成封面失败', error);
            }
          });
        });
      }, 100); // 等待视频加载第一帧,这里使用了一个简单的延时,实际应根据video的seek完成事件来调整
    }
  }
};
</script>

注意

  1. uni.createVideoContextdrawImage方法不支持直接绘制视频帧,因此这里使用了setTimeout来模拟等待视频加载第一帧。在实际应用中,你可能需要监听视频加载或播放事件来更精确地获取第一帧。
  2. 由于uni-app平台差异,某些API在不同平台上可能表现不一致,请根据实际平台进行调整和测试。
  3. 上述代码中的'/path/to/your/video'应替换为实际的视频路径,但uni-app中通常直接使用video元素的src属性指定的视频即可,这里为了说明API用法而保留了该路径。
回到顶部