缘起:最近频繁接到使用我们AI运行识别插件用户的反馈,部分机型在uni中抽几帧后,就不再帧的了。开始以为又是小程序的API兼容的问题(确有机型出现过抽帧兼容性问题),后面越来越多的反馈在原生下无问题,只有采用uni-app方案的有问题...

一、先看抽帧简略代码

下面是小程序做AI运动识别的第一步,摄像头帧数据采集的精简代码版段,大致流程是:在摄像头初始化完成后,初始化一个CameraFrameListener、进行抽帧,并根据抽取的帧图像大小,调整Camera组件大小与帧图大小同比缩放(宽全为全屏、高自适应)。

为什么要同比缩放的原因,请见我们的系列分享:【一步步开发AI运动小程序】四、小程序如何抽帧

<template>
<view class="container">
<camera id="preview" class="preview" :style="videoStyles" flash="off" :device-position="deviceKey"
resolution="high" frame-size="low" @initdone="onCameraReady">
</camera>
</view>
</template> <script> export default {
data() {
return {
deviceKey: "back",
previewWidth: 480,
previewHeight: 640,
previewRate: 1, frameWidth: 480,
frameHeight: 640
};
},
computed: {
videoStyles() {
const style = `width:${this.previewWidth}px;height:${this.previewHeight}px;`; return style;
}
},
methods: {
autoFitPreview(width, height) {
const sifno = uni.getSystemInfoSync();
let rate = sifno.windowWidth / width; this.previewWidth = width * rate;
this.previewHeight = height * rate;
this.previewRate = rate;
this.frameWidth = width;
this.frameHeight = height;
},
initCamera(){
//防止重初始化
if(this.listener)
return; const that = this;
const context = wx.createCameraContext();
const listener = context.onCameraFrame((frame) => {
//当帧图像大小发生变化时,重新调整摄像头代码
if(that.frameWidth != frame.width)
that.autoFitPreview(frame.width, frame.height);
console.log(frame.data instanceof ArrayBuffer, frame.width, frame.height)
});
listener.start();
},
onCameraReady(e) {
this.autoFitPreview(480, 640);
this.initCamera();
},
onStart(){
this.listener.start();
},
onStop(){
this.listener.stop();
}
}
}
</script>

二、BUG复现

在确认原生小程序抽帧无问题后,我们偿试了问题复现,经过多次测试,发现在uni下,Camera组件会多次触发initdone事件,进一步测试后发现,只要动态改变camera的style高、宽,便会触发重新初始化。

initCamera(){
//这里的防初始化,便是引发抽帧断流的原因,因为相机重新初始化了,所以listener实际已经无法再监听帧流了,必须重新创建
if(this.listener)
return; const that = this;
const context = wx.createCameraContext();
const listener = context.onCameraFrame((frame) => {
//当帧图像大小发生变化时,重新调整摄像头代码
//此处的重新适应,便导致了相机的重初始化
if(that.frameWidth != frame.width)
that.autoFitPreview(frame.width, frame.height);
console.log(frame.data instanceof ArrayBuffer, frame.width, frame.height)
});
listener.start();
}

三、问题修复

找出问题原因,修复便很简单了,去除相应的防CameraFrameListener重新始化锁,只要触发initdone便重新初始化,并同步初始化其它逻辑。同时也要注意尽量将camera大小一次绑定到位,减少动态绑定的次数。

四、问题总结

虽然uni-app大部分场景都与原生无异,但是受限于vue的值绑定和节点渲染机制,在实际使用中还是有细微的差别的,特别是原生组件。

另外,针对此问题,我们已经更新了我们的AI运动识别小程序插件uni版本Demo,请各用户联系我们索取。

【踩坑日记】uni-app相机抽帧,相机被多次初始化问题的更多相关文章

  1. AI相关 TensorFlow -卷积神经网络 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  2. 人工智能(AI)库TensorFlow 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  3. hexo博客谷歌百度收录踩坑日记

    title: hexo博客谷歌百度收录踩坑日记 toc: false date: 2018-04-17 00:09:38 百度收录文件验证 无论怎么把渲染关掉或者render_skip都说我的格式错误 ...

  4. Hexo搭建静态博客踩坑日记(二)

    前言 Hexo搭建静态博客踩坑日记(一), 我们说到利用Hexo快速搭建静态博客. 这节我们就来说一下主题的问题与主题的基本修改操作. 起步 chrome github hexo git node.j ...

  5. Hexo搭建静态博客踩坑日记(一)

    前言 博客折腾一次就好, 找一个适合自己的博客平台, 专注于内容进行提升. 方式一: 自己买服务器, 域名, 写前端, 后端(前后分离最折腾, 不分离还好一点)... 方式二: 利用Hexo, Hug ...

  6. 人工智能(AI)库TensorFlow 踩坑日记之二

    上次 踩坑日志之一 遗留的问题终于解决了,所以作者(也就是我)终于有脸出来写第二篇了. 首先还是贴上 卷积算法的示例代码地址 :https://github.com/tensorflow/models ...

  7. JavaScript 新手的踩坑日记

    引语 在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个名字.由于商标问题以及很多产品已经 ...

  8. React Native踩坑日记 —— tailwind-rn

    项目背景 在项目的初始阶段,我们需要建立自己的design system,我们spike了一些方案,tailwind-rn就是其中一种,如果有用到或者即将用到tailwind-rn的,可以进来看一看, ...

  9. React Native Android配置部署踩坑日记

    万事开头难 作为一只进入ECMAScript世界不久的菜鸟,已经被React Native的名气惊到了,开源一周数万星勾起了我浓烈的兴趣.新年新气象,来个HellWorld压压惊吧^_^(故意少打个' ...

  10. 微信小程序开发踩坑日记

    2017.12.29  踩坑记录 引用图片名称不要使用中文,尽量使用中文命名,IDE中图片显示无异样,手机上图片可能出现不显示的情况. 2018.1.5  踩坑记录 微信小程序设置元素满屏,横向直接w ...

随机推荐

  1. homeassistant自动化记录ping追踪在家联动设备

    2022年8月29日修改代码块 进入hass的配置文件,docker版从portainer中查看配置情况 文件名configuration.yaml 下述添加到最后 # ping根据ip追踪手机 de ...

  2. 【Jenkins】之自动化测试持续集成

    一.创建jenkins项目 选择节点 创建指定名称的目录名: 写命令,执行shell: 命令填写: # 引入电脑配置文件 #. ~/.bash_profile cd Python_Interface ...

  3. dotnet 学习 CPF 框架笔记 了解 X11 里如何获取触摸信息

    本文记录我学习 CPF 框架的笔记,本文记录我阅读 CPF 框架,学习到了如何在 dotnet C# 里面获取到 X11 的触摸信息,获取到多指触摸以及触摸点的面积和触摸点压感等信息的方法 开始之前, ...

  4. AI将诗意装进口袋!合合信息扫描全能王“扫描书籍”功能优化上线

    人间最美四月天,正是读书好时节.4月20日至23日,正值"世界读书日"之际,合合信息旗下扫描全能王联合上海首家图像小说主题书店--安古莱姆书店,共同发起"春天正是读书天& ...

  5. CSS – Aspect Ratio

    参考: Youtube – Chrome 88 adds aspect-ratio and 2 awesome new devtool features! MDN – aspect-ratio W3S ...

  6. CSS – word-break, overflow-wrap, word-wrap, white-space

    参考 word-break 和 word-wrap 的区别 (我以为这篇已经很厉害了) 彻底搞懂word-break.word-wrap.white-space (没想到, 这一篇更厉害) white ...

  7. MySQL linux下安装,配置,免密登录与基本认识

    目录 MySQL卸载 环境 查看是否已安装MySQL 卸载mysql服务 查看是否卸载干净 MySQL安装 查看linux版本 选择MySQL版本 获取mysql官方yum源 rpm安装mysql官方 ...

  8. 大一下的acm生活

    在一个名气不大的211学校刷题的日常. 感觉这些算法题好难啊! 最近有好多实验室要招新,不知道该怎么办,自己只想就业,并不想升学,好烦! 真枯燥,好无聊. 现在要学习相关的网页设计和网站建设,例如配色 ...

  9. Flutter Web 近期的重要更新

    我们的发布重点优先关注在性能.开发者体验以及 Web 集成上 2021 年 3 月 Flutter Web 支持已进入稳定版,那么,下一步是什么? 我们对用户研究发现,有超过 10% 的 Flutte ...

  10. kali系统安装和CVE-2017-12615测试

    1 安装kali系统 1.1 下载VMware压缩包 kali-linux-2022.1 默认的用户和密码是kali 1.2 初始化系统 sudo apt update -y #kali sudo a ...