此问题在真机调试及模拟器运行时表现有所不同。简单地说,就是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 : 500 rpx; height : 500 rpx; } |
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 () { } }) |
真机调试日志输出窗口:
模拟器日志输出窗口:
wx.canvasPutImageData这个操作非常耗时,测试了几款机器,都在1s以上,可以设置成2s,或者等处理完成了再绘制下一帧,不然会因为内存占用过大而崩溃,目前这个接口还不是很成熟,处理速度大概在10fps左右,而CameraContext.onCameraFrame回调是按照30fps的速度输出Buffer,所以直接调用会卡顿或者崩溃
https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.onCameraFrame.html
官网这条代码至今为止还是闪退
我遇到了同样的问题……
我的操作是在回调函数中获取到图像数据,用Unit8ClampedArray数据调第三发插件去做人脸检测,再有人脸特征在把数据转成base4格式(这个操作就很扯,只能通过wx.canvasPutImageData、wx.canvasToTempFIlePath 和wx.getFileSystemManager().readFile来转化格式)
不晓得是不是我的操作太太太复杂耗内存还是怎么的,回调可以执行,我把操作频率降低到1次每秒,有的手机会崩溃
我也出现了同样的问题,请问现在解决了嘛?
问题解决了吗?
麻烦提供能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)
。。。喵喵喵???代码不是贴在上面了吗???
你们是故意的吗??
https://developers.weixin.qq.com/s/GxNp4vmD7X9w
按要求又创建了代码片段,如上(其实就是把上面的代码复制了一下,由于代码片段无法真机调试,我也不知道它能不能复现问题哦~~)
PS:我真是服了你们。究竟是我没有把问题描述清楚还是你们没有读明白?我调试到凌晨一点半还是一直出问题,经过多番验证后认为很大概率是小程序API本身的BUG,出于程序员的责任心,遂又顶着睡意花十几分钟报告了问题才去睡。
结果呢?你们就这样冷冰冰地回复一个“麻烦提供代码片段”?我上面贴的代码该有的都了,你们动手复制一下是会少几两肉还是会累死?
如果说你们已经跑过上面的代码,并验证过并没有我提及的问题,那简单提及一下“我们已经根据汝小奴提供的代码运行过,无法复现问题,麻烦提供一下代码片段”吧啦吧啦的,是不是更好些?
你们这个真是我接触过的除了苹果之外最高冷的官方回复。
在真机调试和预览的时候都有问题,但表现有所不同,以下是我在主贴里的原话:
如果是我说的“模拟器”让你不知道说的是预览的话,我很怀疑你们是不是真的小程序API的开发团队,不然怎么可能不知道模拟器就是预览?
还有,能不能来个可以话事的人?连续回复两次都是要我把原贴里说过的话重复再重复。哪怕你问我一下项目设置里某个项是怎么选择的都好啊。
预览=>
是在真机调试的时候会复现吗?预览的时候呢?