收藏
回答

CameraContext.onCameraFrame回调时闪退

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug CameraContext 客户端 7.0.4 2.7.3

此问题在真机调试及模拟器运行时表现有所不同。简单地说,就是CameraContext.onCameraFrame的回调函数无法被调用,一旦调用就会闪退。

在iPhone X 上是整个微信退出,在Android机(已在一加及OPPO上测试过)上是退出小程序。期间有log而无error信息(见下方截图)。

在模拟器上则是报thirdScriptError错误(见下方截图。本人以createObjectURL为关键词搜索过后,初步怀疑是模拟器环境所使用的Chrome内核的问题),小程序不闪退。

代码见下方。如是本人调用过程中有所遗漏,烦请指正。如是API本身的BUG,请尽快修复并告知。谢谢!


WXML:

<view class="view_container">
  <camera device-position="back" mode="normal" frame-size="medium" flash="off" class="view_camera"></camera>
  <button type="primary" bindtap="scan">扫描</button>
</view>
<view class="view_container">
  <image wx:if="{{src}}" mode="widthFix" src="{{src}}"></image>
</view>


WXSS:

.view_container{
  width: 100%;
  height: 100%;
  background-color: #c1c1c1;
  text-align: center;
  display: flex;
  justify-content: center;
  flex-direction: row;
}
.view_camera{
  width: 500rpx;
  height: 500rpx;
}


JS:

// pages/scan/scan.js
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
 
  },
 
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    console.log("loaded scan");
  },
 
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
 
  },
 
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
 
  },
 
  scan: function (){
    console.log('start scan')
    const context = wx.createCameraContext()
    console.log('created context')
    context.takePhoto({        // 这是后来为了测试cameraContext是不是真的能运行而加上的,实际运行确实能拍照
      quality: 'high',
      success: (res) => {
        console.log(res.tempImagePath)
        this.setData({
          src: res.tempImagePath
        })
      }
    })
     
    if (context.onCameraFrame) {
      console.log('onCameraFrame is available')         // 这一句log每次都能顺利打出来
      const listener = context.onCameraFrame((frame) => {
        console.log('fetch camera')                     // 这一句log从来没有打出来过
        // console.log(frame.data instanceof ArrayBuffer, frame.width, frame.height)
      })
      if (listener.start) {
        listener.start()
        console.log('listener start')
      }
   } else {
     console.log('onCameraFrame is not available')
   }
 
  },
 
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
 
  },
 
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
 
  },
 
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
 
  },
 
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
 
  },
 
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
 
  }
})


真机调试日志输出窗口:



模拟器日志输出窗口:


回答关注问题邀请回答
收藏

6 个回答

  • 淡定
    淡定
    2019-12-09

    wx.canvasPutImageData这个操作非常耗时,测试了几款机器,都在1s以上,可以设置成2s,或者等处理完成了再绘制下一帧,不然会因为内存占用过大而崩溃,目前这个接口还不是很成熟,处理速度大概在10fps左右,而CameraContext.onCameraFrame回调是按照30fps的速度输出Buffer,所以直接调用会卡顿或者崩溃


    2019-12-09
    有用
    回复
  • 空白格
    空白格
    2019-09-30

    https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.onCameraFrame.html

    官网这条代码至今为止还是闪退

    2019-09-30
    有用
    回复
  • Keep
    Keep
    2019-08-09

    我遇到了同样的问题……

    我的操作是在回调函数中获取到图像数据,用Unit8ClampedArray数据调第三发插件去做人脸检测,再有人脸特征在把数据转成base4格式(这个操作就很扯,只能通过wx.canvasPutImageData、wx.canvasToTempFIlePath 和wx.getFileSystemManager().readFile来转化格式)

    不晓得是不是我的操作太太太复杂耗内存还是怎么的,回调可以执行,我把操作频率降低到1次每秒,有的手机会崩溃

    2019-08-09
    有用
    回复 5
    • Hasionಠ_ರೃ
      Hasionಠ_ರೃ
      2019-08-31
      你好 麻烦问下 后来这个问题你是怎么处理的吗
      2019-08-31
      回复
    • lry
      lry
      2019-10-21
      你降低操作频率是通过控制 onCameraFrame的频率了降低的吗
      2019-10-21
      回复
    • Keep
      Keep
      2019-10-21回复lry
      这个频率没办法控制,只能通过时间间隔控制回调方法的执行频率。
      2019-10-21
      回复
    • Keep
      Keep
      2019-10-21回复Hasionಠ_ರೃ
      还是有些机型会崩溃,无奈公司测试机都太旧了,不给买新的。新机型没测试。
      2019-10-21
      回复
    • lry
      lry
      2019-10-21回复Keep
      我也是通过控制回调的的频率来控制的,但是并不能从根本上解决问题,所以很多手机会奔溃TT
      2019-10-21
      回复
  • 喔吼吼吼
    喔吼吼吼
    2019-07-31

    我也出现了同样的问题,请问现在解决了嘛?

    2019-07-31
    有用
    回复 2
    • Gavin Mok
      Gavin Mok
      2019-07-31
      并没有。看来这个确实是API的BUG了
      2019-07-31
      回复
    • Hasionಠ_ರೃ
      Hasionಠ_ರೃ
      2019-08-31
      你好 请问下这个闪退的问题你后来解决了吗
      2019-08-31
      回复
  • 、L
    、L
    2019-07-12

    问题解决了吗?

    2019-07-12
    有用
    回复 2
    • Gavin Mok
      Gavin Mok
      2019-07-13
      并没有。最近在忙别的事去了
      2019-07-13
      回复
    • Hasionಠ_ರೃ
      Hasionಠ_ರೃ
      2019-08-31
      你好 请问后来这个问题你是怎么处理的呢
      2019-08-31
      回复
  • 是小白啊
    是小白啊
    2019-06-28

    麻烦提供能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)

    2019-06-28
    有用
    回复 21
    • Gavin Mok
      Gavin Mok
      2019-06-30

      。。。喵喵喵???代码不是贴在上面了吗???

      你们是故意的吗??

      2019-06-30
      回复
    • Gavin Mok
      Gavin Mok
      2019-06-30

      https://developers.weixin.qq.com/s/GxNp4vmD7X9w

      按要求又创建了代码片段,如上(其实就是把上面的代码复制了一下,由于代码片段无法真机调试,我也不知道它能不能复现问题哦~~)

      PS:我真是服了你们。究竟是我没有把问题描述清楚还是你们没有读明白?我调试到凌晨一点半还是一直出问题,经过多番验证后认为很大概率是小程序API本身的BUG,出于程序员的责任心,遂又顶着睡意花十几分钟报告了问题才去睡。

      结果呢?你们就这样冷冰冰地回复一个“麻烦提供代码片段”?我上面贴的代码该有的都了,你们动手复制一下是会少几两肉还是会累死?

      如果说你们已经跑过上面的代码,并验证过并没有我提及的问题,那简单提及一下“我们已经根据汝小奴提供的代码运行过,无法复现问题,麻烦提供一下代码片段”吧啦吧啦的,是不是更好些?

      你们这个真是我接触过的除了苹果之外最高冷的官方回复。

      2019-06-30
      回复
    • Gavin Mok
      Gavin Mok
      2019-07-03回复是小白啊

      在真机调试和预览的时候都有问题,但表现有所不同,以下是我在主贴里的原话:


      在iPhone X 上是整个微信退出,在Android机(已在一加及OPPO上测试过)上是退出小程序。期间有log而无error信息(见下方截图)。

      在模拟器上则是报thirdScriptError错误(见下方截图。本人以createObjectURL为关键词搜索过后,初步怀疑是模拟器环境所使用的Chrome内核的问题),小程序不闪退。

      如果是我说的“模拟器”让你不知道说的是预览的话,我很怀疑你们是不是真的小程序API的开发团队,不然怎么可能不知道模拟器就是预览?


      还有,能不能来个可以话事的人?连续回复两次都是要我把原贴里说过的话重复再重复。哪怕你问我一下项目设置里某个项是怎么选择的都好啊。

      2019-07-03
      回复
    • 是小白啊
      是小白啊
      2019-07-03回复Gavin Mok

      预览=>

      2019-07-03
      回复
    • 是小白啊
      是小白啊
      2019-07-03回复Gavin Mok

      是在真机调试的时候会复现吗?预览的时候呢?

      2019-07-03
      回复
    查看更多(16)
登录 后发表内容