当前位置: 首页 > news >正文

图片上传不了网站洛阳网站建设培训学校

图片上传不了网站,洛阳网站建设培训学校,建行,女子录视频车流中热舞🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 功能实现需要用到MediaRecorder、navigator.mediaDevices.getUserMedia、Blob等API,uniapp App端不支持,需要借助renderjs来实现 实现逻辑 通过naviga…

🧑‍💻 写在开头
点赞 + 收藏 === 学会🤣🤣🤣

功能实现需要用到MediaRecorder、navigator.mediaDevices.getUserMedia、Blob等API,uniapp App端不支持,需要借助renderjs来实现

实现逻辑

  1. 通过navigator.mediaDevices.getUserMedia调用设备麦克风,获取音频流
  2. 使用MediaRecorder录制音频数据
  3. 用Blob、FileReader将音频数据转为转为base64格式
  4. 调用fs.root.getFile创建空白amr/mp3文件
  5. 通过h5plus调用安卓APIjava.io.FileOutputStream将数据保存进文件中

代码实现

获取音频流
申请媒体权限
首先需要提前申请下权限。App 端调用navigator.mediaDevices.getUserMedia时不像浏览器上会弹框申请权限,插件市场有官方提供的免费插件:App权限判断和提示 - DCloud 插件市场。

async onLoad() {// 申请麦克风权限let isRecord = await permision.requestAndroidPermission('android.permission.RECORD_AUDIO')if (isRecord == -1) {uni.showModal({title: '提示',content: '未获取到麦克风权限,可能导致应用运行出现问题',confirmText: '去开启',cancelText: "暂不开启",success: res => {if (res.confirm) {// 跳转权限页面permision.gotoAppPermissionSetting()}}})}
}

获取音频流代码

mediaRecorder.start(60 * 1000); 表示60秒执行一次ondataavailable,可用来实现分段录制。不传参数则只在stop时执行一次

<script lang="renderjs">
export default {async startRecord() {try {let localStream = await navigator.mediaDevices.getUserMedia({video: false, audio: true,});let mediaRecorder = new MediaRecorder(localStream);mediaRecorder.ondataavailable = event => {const blob = new Blob([event.data]);var reader = new FileReader();reader.readAsDataURL(blob);reader.onload = (e) => {let base64str = e.target.result// 调用外层script中的base64ToFile方法,将base64传入。this.$ownerInstance.callMethod('base64ToFile', base64str)}}// 录制停止mediaRecorder.onstop = (e) => { }mediaRecorder.start(60 * 1000); // 60秒执行一次ondataavailable,可实现分段录制,不传参数只在stop时执行一次} catch (e) {console.log('麦克风权限获取失败')}}
}
</script>

保存amr/mp3文件

文件保存在uniapp_save文件夹下可以通过uni.getSavedFileList方法获取到。
plus.io.PRIVATE_DOC 位置参考:内部存储>Android>data>io.dcloud.HBuilder>apps>HBuilder>doc。

<script>export default {base64ToFile(base64Str, fileName = `uniapp_save/${new Date().valueOf()}.amr`) {// 去除base64前缀 var index = base64Str.indexOf(',')var base64Str = base64Str.slice(index + 1, base64Str.length)plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {fs.root.getFile(fileName, {create: true}, function(entry) {// 获得本地路径URL,file:///xxx/doc/1663062980631.amr var fullPath = entry.fullPath;var FileOutputStream = plus.android.importClass("java.io.FileOutputStream");try {function base64ToByteArray(base64Str) {const binaryString = atob(base64Str);const uint8Array = new Uint8Array(binaryString.length);for (let i = 0; i < binaryString.length; i++) {uint8Array[i] = binaryString.charCodeAt(i);}let arr = []Array.from(uint8Array).map(num => {arr.push(num >= 128 ? (num - 256) : num)})return arr;}var out = new FileOutputStream(fullPath);let bytes = base64ToByteArray(base64Str);if (bytes == null || bytes.length == 0) {out.close();uni.hideLoading();uni.showModal({title: "生成失败",content: "nativeJS限制参数长度无法获取文件!",showCancel: false})return} else {out.write(bytes);out.close();console.log(`保存成功,文件地址为:_doc/${fileName}`)}} catch (e) {console.log(e.message);}})})}}
</script>

参考资料

  • 在base64转本地文件(如pdf,apk,音频等)如果base64长度过长 在 安卓中 Base64.decode(str, 0) 返回 null 的解决问题 - DCloud问答

  • HTML5+ API

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

在这里插入图片描述

http://www.yayakq.cn/news/151415/

相关文章:

  • 建立网站的注意事项网站开发商城1688
  • 一个网站同时做百度和360 百度商桥都可以接收客户信息吗免费域名解析ip
  • 网站建设jiage做网站怎么那么难
  • 什么网站做h5不收费js怎么做网页
  • 专业做化妆品的网站公众号网页版
  • 丹东 网站开发外包网站建设是什么意思
  • 网站开发招标采购需求网站报备流程
  • 天津网站seo策划上海招聘信息最新招聘2021
  • 工作室做网站北京工程建设交易信息网官网
  • 网站开发怎么谈调兵山网站建设
  • 东莞seo建站优化工具网站做视频
  • 洛阳做网站哪家专业wordpress 表格 链接地址
  • 很多网站没有后台做医疗的网站
  • 阿里网站域名要购卖吗wordpress时间排序
  • 门户网站和网站的区别深圳市宝安区邮编
  • wordpress 多备份淄博网络优化哪家专业
  • 惠州网站建设推广装修网页设计网站
  • 太原制作微信网站阜宁县住房和城乡建设局网站
  • 网页设计制作一个餐饮网站wordpress linux权限设置
  • php网站开发打不开购物网站app制作
  • 网站建设顺序宁波网页设计招聘
  • 网站免费php空间申请wordpress影视网站
  • 如何百度搜到网站如何注册网站名称
  • 如何建设一个商城网站公司形象vi设计
  • 平台型网站制作南昌网站开发公司哪家公司好
  • 网站域名备案电子商务网站开发的流程
  • 南昌网站建设托管安居客看房网
  • wordpress分享卡片插件北京网络排名优化
  • 公司做企业网站的哪家好怎样创建快捷方式
  • 汉滨区城乡建设规划局 网站营销网站的方法