最终方案请直接看文章最后!

最近在做一个微信小程序录制视频(图片也是一样的逻辑),然后上传后端的功能,使用的是微信小程序提供的cameraContext实例,具体官方文档请参考:

CameraContext | 微信开放文档

然后发现录制好后,成功的响应信息response中存的都是地址:

tempThumbPath - 封面图片文件的临时路径 (本地路径):
tempThumbPath: "http://tmp/8tuxDZnK7tdt678c62402deaa133e9dbf62f746f1f23.jpg",tempVideoPath - 视频的文件的临时路径 (本地路径,特别需要注意:微信开发工具里上传的视频格式为webm,真机上为mp4。)
tempVideoPath: "http://tmp/ZCoaEV8mrjDk0d2caffb008ec28bcef88d60d1272031.webm"

本来想直接和后端进行交互,将视频文件直接传送给后端,发现这两个地址都是url字符串,需要拿到真实的视频数据才可以,于是在找到了获取实时录制的视频数据的方法,获取摄像头当前帧图像:

  /*** 生命周期函数--监听页面加载*/onLoad: function (options) {console.log("onLoad options", options)this.cameraContext = cameraContext;//this.setCameraSize();// 获取 Camera 实时帧数据// context.onCameraFrame()返回视频图像的监听器this.listener = this.cameraContext.onCameraFrame((frame) => {// frame.data 就是视频数据 格式是ArrayBufferconsole.log(frame.data instanceof ArrayBuffer, frame.width, frame.height)this.videoFile = frame.data;});}// 在视频开始录制startRecord中调用开始监听的方法
this.listener.start() // 开始监听帧数据// 在视频结束录制stopRecord中调用停止监听的方法
this.listener.stop(this); // 停止监听帧数据

打印后发现videoFile是ArrayBuffer格式的数据:

因此想把ArrayBuffer转换成Blob格式的数据,再传给后端,发现微信小程序暂不支持Blob格式数据,因此放弃。

CSDN上倒是有个兄弟转成了Base64,但是有点过于复杂,有需要可以看看

微信小程序onCameraFrame获取的ArrayBuffer转为base64图片的方法

最终还是去官网找到了解决方案:

官方说明文档:

微信小程序将将本地资源上传到服务器

微信小程序代码:

第一个参数video就是上面的tempVideoPath - 视频的文件的临时路径

  upRecord: (video, token, type) => {let formData = { token: "123qwe",type: "SV",};wx.uploadFile({url: PATH.PATH_UP_RECORD,//这是你自己后台的连接filePath: video,name:"file",//后台要绑定的名称header: {"Content-Type": "multipart/form-data"},//参数绑定formData: formData,// HTTP 请求中其他额外的 form datasuccess:function(ress){console.log('上传成功,返回内容是: ', ress);wx.showToast({title: '上传成功',})},fail: function(ress){console.log("。。上传服务器 失败", ress);wx.showToast({title: '上传失败',})}})},

后端代码:

@RequestParam("file") MultipartFile file 这个请求参数名,

需要和上面的name(name:"file",//后台要绑定的名称)对应

 @RequestMapping(value = "/upVideo", method = RequestMethod.POST)public ResponseEntity<JSONObject> upVideo(@RequestParam("file") MultipartFile file,@RequestParam String token,@RequestParam String type) {JSONObject json = new JSONObject();try {if (file.isEmpty() || StringUtils.isBlank(token)) {log.info("上传失败,上传数据存在空值 token={}", token);json.put("STATUS", "ERROR");json.put("MSG", "上传失败,上传数据存在空值");return new ResponseEntity<>(json, HttpStatus.BAD_REQUEST);}//存放地址String path = "D:\\20220907\\video";//如果父文件夹不存在 则创建文件夹 文件夹为path,视频名字file.getOriginalFilename()File filepath = new File(path, Objects.requireNonNull(file.getOriginalFilename()));if (!filepath.getParentFile().exists()) {filepath.getParentFile().mkdirs();}File fi = new File(path + File.separator + file.getOriginalFilename());//下载到本地file.transferTo(fi);//获取绝对路径String localAddress = fi.getAbsolutePath();log.info("存入本地文件地址:" + localAddress);//获取后缀名String suffix = localAddress.substring(localAddress.lastIndexOf("."), localAddress.length());log.info("后缀名:" + suffix);json.put("STATUS", "200");json.put("MSG", "上传视频成功");return new ResponseEntity<>(json, HttpStatus.OK);} catch (Exception e) {log.error("系统异常,上视频失败", e);return new ResponseEntity<>(json, HttpStatus.INTERNAL_SERVER_ERROR);//500,系统异常}}

仅为测试调试代码,有需要请调整优化,执行完可以看到文件确实存到后端服务器的本地了:

收工

微信小程序cameraContext拍摄的视频或照片上传后端,不需要处理实时监听的ArrayBuffer格式的视频数据,只需要直接使用wx.uploadFile上传后端,简单好用(带前后端代码)相关推荐

  1. 新增微信小程序、WebRTC连麦直播多项能力,即构实时音视频SDK再升级

    经过2018年小半年的闭关练功,即构ZEGO团队铸造了不少黑科技.本文将为你带来即构ZEGO实时语音视频SDK近半年新增能力和功能优化的最新进展. 更懂应用场景的语音视频云 作为全球领先的实时语音视频 ...

  2. 小程序: wx.uploadFile上传文件保持原文件名的方法

    其实很简单: formData中携带文件名即可! 废放不说,上源码: 小程序端: js: uploadSendFile(file){                              //fi ...

  3. ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传

    //上传视频 uploadVideo:function(){ let _this = this; let list = ['camera', 'album']; wx.showActionSheet( ...

  4. 小程序中如何实时监听app.js中globalData的数据变化

    使用Object.defineProperty(obj, prop, desc)来进行发布订阅 obj 是需要定义属性的当前对象 prop 当前需要定义的属性名 desc 属性描述符 App({onL ...

  5. 微信小程序开发总结与心得

    0 前言 最近的工作重心一直在小程序,也开发了几个小程序,对小程序开发的流程及相关技术相对比较熟悉,在开发过程中也总结了一些心得经验.了解一些小程序文档上没有的东西.踩了一些坑.所以想着写篇文章记录下 ...

  6. SSM同城拼车微信小程序的开发 计算机毕设源码20625

    摘要 伴随着科技进步和经济全球化,人民生活水乎丕断提高,拥有私家车的人群也越来越庞大.据统计,我国汽车保有量持续高速度增长,众多的车辆上路,是造成交通拥堵的最主要原因.除此之外,随着经济高速发展,城市 ...

  7. 微信小程序+百度AI OCR二代身份证识别

    微信小程序内虽然有OCR识别功能 但是收费是按次计费的,还是选用了百度ai提供的OCR识别二代身份证. // 上传人面像upFileFront:function(e){let type = e.cur ...

  8. 微信小程序无埋点数据采集方案

    相信业务团队对这样的场景不会太陌生: 打点需求:每新上一个功能,数据产品便会同步加上打点需求,当数据打点上线后一段时间,数据产品/业务产品便会针对数据的转化率分析和对业务需求的调整: 打点正确性验证: ...

  9. 微信小程序之触摸滑动事件案例+Slideview组件【手动左滑删除效果】

    前言: 现在很多程序上都有左滑删除的效果,其实实现很简单,今天我们主要来记录一下小程序的左滑删除的实现过程. 效果图: 实现效果: 当我们在该条记录上进行左滑操作时,整条记录跟着向左移动,同时右侧的删 ...

最新文章

  1. Ruby 之 Block, Proc, Lambda 联系--区别,转载
  2. git 清空log_[译] 我个人的 Git 技巧备忘录
  3. 发送邮件时,如何附带上中文等价名信息
  4. 实现TFrecords文件的保存与读取
  5. 美橙互联域名与其他地方的区别
  6. ASP.NET中对STA COM组件的不正确调用产生的w3wp远程DoS
  7. python 使用 with open() as 读写文件-给Python学习者的文件读写指南(含基础与进阶)...
  8. [UI界面]-UIWindow
  9. 4.11 一维到三维推广
  10. oracle date 截取年月,在Oracle中,可用于提取日期时间类型特定部分(如年、月、日、时、分、秒)的函数有那些...
  11. 在使用SPSite对象时容易发生内存泄漏
  12. Android-JNI开发系列《十一》实践-利用Android C源码实现GIF图片的播放
  13. 项目中发现 unity运行挂机放那大约半小时,运行项目变得越来越卡顿
  14. NC单据模板公式(6大类)
  15. 十五、移动端vw+rem等比缩放布局开发的详细步骤:包含px与rem的单位换算、二倍图以及如何使用UI给的设计稿等(开发工具HBuilder)
  16. 2022年全球与中国一次性内窥镜市场现状及未来发展趋势
  17. 如何去痘痘最快方法简单
  18. Android拍摄raw照片,这20款摄影APP,让你的照片飞上天!
  19. 生兔子问题(递归算法)
  20. 机器学习平台系列——XGB feature_names mismatch 问题解决方案

热门文章

  1. js校验图片是否加载成功或失败
  2. React ref useRef 完全指南
  3. ubuntu1804 安装PCL
  4. Python学习日记1——python3.8.3安装以及配置环境
  5. Facebook创始人达斯汀:最年轻的亿万富翁
  6. Win11共享文件夹打不开怎么办
  7. JumpServer七周年:感谢社区的老铁们为我们点赞
  8. Some VMware images
  9. 汽车市场勇进派 乐车邦林金文的逆周期生意
  10. FFMPEG 参数详细说明