uni-app 录制视频后截取第一帧做视频封面功能
uni-app 录制视频后截取第一帧做视频封面功能
具体需求我在拍摄视频之后,将所拍视频在前台通过类似js截取视频第一帧的方法截取视频第一帧后,用作视频的封面。
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
不走服务器 不走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
uni-app获取视频封面插件:https://ext.dcloud.net.cn/plugin?id=1577
同求
这个问题百度上面有现成的答案啊,直接canvas截取第一帧就可以啊
承接H5、小程序、APP等外包:
经验丰富,做过多种类型项目,有案例可看;
整个项目外包可以找我(小团队接单,面向客户、产品);
只需要前端部分也可以找我(个人接单,面向服务端合作伙伴);
wechat(13070273424);
可以做个插件,集成ffmpeg,需要第几秒的您说话都给你搞出来 哈哈
微信联系 zhimitec
我们有现成的插件可以实现此效果 有需要联系 微信 zhimitec
智密科技,专注于uniapp生态开发,拥有专职前端、安卓工程师、IOS工程师、硬件工程师、后端工程师、UI设计人员,提供Unaipp插件开发,app外包开发
这个是我们相册选择插件的一个功能点而已,需要的话可以联系我们
联系微信 zhimitec
顶顶顶顶顶顶顶顶
同求
针对你提到的在uni-app中实现录制视频后截取第一帧作为视频封面功能,这里提供一个使用 canvas
和 video
元素结合实现该功能的代码示例。该示例假设你已经通过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>
注意:
uni.createVideoContext
的drawImage
方法不支持直接绘制视频帧,因此这里使用了setTimeout
来模拟等待视频加载第一帧。在实际应用中,你可能需要监听视频加载或播放事件来更精确地获取第一帧。- 由于uni-app平台差异,某些API在不同平台上可能表现不一致,请根据实际平台进行调整和测试。
- 上述代码中的
'/path/to/your/video'
应替换为实际的视频路径,但uni-app中通常直接使用video
元素的src
属性指定的视频即可,这里为了说明API用法而保留了该路径。