Uniapp零基础开发学习笔记(9) -媒体组件音视频摄像头等的练习使用

2023-11-17

Uniapp零基础开发学习笔记(9) -媒体组件音视频摄像头等的练习使用

基础组件部分,最后就只剩余媒体组件以及地图,和画布Canvas,以及浏览器组件web-view。
此次先看看媒体组件,重点学习前面几个。
链接如下:
https://uniapp.dcloud.net.cn/component/audio.html#
在这里插入图片描述

1.媒体组件的用法

1. audio音频组件
在这里插入图片描述
在这里插入图片描述
这是演示案例的效果。
在这里插入图片描述
示例源代码,其中src播放地址,poster封面图片地址,以及name音频名称,author作者,播放动作action这个貌似不在所列属性之内。如果定义loop=‘true’则循环播放。

<!-- 音频播放 -->
<view class="uni-padding-wrap uni-common-mt">
	<view class="page-section page-section-gap" style="text-align: center;">
		<audio style="text-align: left" :src="current.src" :poster="current.poster" :name="current.name" 				
		:author="current.author" :action="audioAction" controls></audio>
	</view>		
</view>
<!-- 音频播放结束 -->

JS代码如下,补充了变量定义。

export default {
	data() {
		return {
			current: {
				poster: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/7fbf26a0-4f4a-11eb-b680-7980c8a877b8.png',
				name: '致爱丽丝',
				author: '贝多芬',
				src: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3',
			},
			audioAction: {
				method: 'pause'
			}
		}
	}
}

微信小程序以及其它很多小程序已经不支持audio组件了,试试用API来写一下,见uni.createInnerAudioContext
在这里插入图片描述
加入一个按钮播放音乐,定义click触发播放音乐函数playAudio

<button type="primary"  @click="playAudio">播放音乐</button>

函数定义:

playAudio() {
	const innerAudioContext = uni.createInnerAudioContext();
	innerAudioContext.autoplay = true;
	innerAudioContext.src = this.current.src;
	innerAudioContext.obeyMuteSwitch=true;//根据系统音量开关切换
	innerAudioContext.volume=0.8;//音量
	innerAudioContext.onPlay(() => {
		console.info('开始播放');//开始播放
			});
	innerAudioContext.onError((res) => {
	  	console.log(res.errMsg);
	  	console.log(res.errCode);
	});
	innerAudioContext.onEnded(() => {
		console.info('结束播放');//结束播放
			});
	}	

2. camera摄像头组件
在这里插入图片描述
APP和H5都不支持该组件,反而微信小程序支持,因为没有下载微信小程序开发,示例代码看看但运行不了。
几个重要属性:
mode有效值为 normal, scanCode即拍照和扫码
resolution分辨率,类型为string,默认medium,不清楚还有其它哪些值
device-position前后摄像头front/back
flash闪光灯auto,on,off
在这里插入图片描述
示例代码:

<view>
     <camera device-position="back" flash="off" @error="error" style="width: 100%; height: 300px;"></camera>
     <button type="primary" @click="takePhoto">拍照</button>
     <view>预览</view>
     <image mode="widthFix" :src="src"></image>
 </view>

JS:

export default {
    data() {
        return {
            src:"" //临时存放照片的地址
        }
    },
    methods: {
         takePhoto() {
            const ctx = uni.createCameraContext();
            ctx.takePhoto({
                quality: 'high',
                success: (res) => {
                    this.src = res.tempImagePath
                }
            });
        },
        error(e) {
            console.log(e.detail);
        }
    }
}

用API实现:uni.chooseImage(OBJECT)从本地相册选择图片或使用相机拍照
在这里插入图片描述

data() {
			return {}
		},
GetImg(){
		uni.chooseImage({
		count: 6, //默认9
		sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
		sourceType: ['album'],//从相册选择album,相机camera,默认二者都有
		success: function (res) {
		console.log(JSON.stringify(res.tempFilePaths));
				}
		});
	}

3. image图片组件
image图片使用非常频繁。
在这里插入图片描述
重要属性有:
src:图片地址,静态资源和网络地址都可以
mode:对于放图片的容器尺寸,有裁剪,缩放等模式
lazy-load:图片懒加载。只针对page与scroll-view下的image有效,为了改善页面效果,先把页面框架显示出来图片位置先占位再显示。
还有是否可拖动draggable
事件方面有@load 加载完毕之后触发,@error出错之后触发
在这里插入图片描述
示例代码效果:
在这里插入图片描述
页面代码:
image属性中定义主要有宽/高/背景色,填充模式mode,下面展示所有模式的效果。

<view class="page">
	<view class="image-list">
		<view class="image-item" v-for="(item,index) in array" :key="index">
			<view class="image-content">
				<image style="width: 200px; height: 200px; background-color: #eeeeee;" :mode="item.mode" :src="src"
					@error="imageError"></image>
			</view>
			<view class="image-title">{{item.text}}</view>
		</view>
	</view>
</view>

JS:

src: 'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/6acec660-4f31-11eb-a16f-5b3e54966275.jpg',
array: [{
            mode: 'scaleToFill',
              text: 'scaleToFill:不保持纵横比缩放图片,使图片完全适应'
          }, {
              mode: 'aspectFit',
              text: 'aspectFit:保持纵横比缩放图片,使图片的长边能完全显示出来'
          }, {
              mode: 'aspectFill',
              text: 'aspectFill:保持纵横比缩放图片,只保证图片的短边能完全显示出来'
          }, {
              mode: 'top',
              text: 'top:不缩放图片,只显示图片的顶部区域'
          }, {
              mode: 'bottom',
              text: 'bottom:不缩放图片,只显示图片的底部区域'
          }, {
              mode: 'center',
              text: 'center:不缩放图片,只显示图片的中间区域'
          }, {
              mode: 'left',
              text: 'left:不缩放图片,只显示图片的左边区域'
          }, {
              mode: 'right',
              text: 'right:不缩放图片,只显示图片的右边边区域'
          }, {
              mode: 'top left',
              text: 'top left:不缩放图片,只显示图片的左上边区域'
          }, {
              mode: 'top right',
              text: 'top right:不缩放图片,只显示图片的右上边区域'
          }, {
              mode: 'bottom left',
              text: 'bottom left:不缩放图片,只显示图片的左下边区域'
          }, {
              mode: 'bottom right',
              text: 'bottom right:不缩放图片,只显示图片的右下边区域'
          }]		

4. video视频组件
曾经用过一次,但播放不成功,这次看看问题在哪里。
这次终于成功了,原因是必须运行到chrome里,内置浏览器不可以。
在这里插入图片描述
示例代码:
input v-model="danmuValue"双向绑定了待发送的弹幕的值
弹幕还可以定义颜色,这里定义了一个随机颜色的函数getRandomColor();

<!-- 视频播放 -->
<view class="uni-padding-wrap uni-common-mt">
	<view>
		<video id="myVideo" src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-	app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4"
			@error="videoErrorCallback" :danmu-list="danmuList"
			show-loading='true'
			enable-danmu danmu-btn controls ></video>
	</view>
	<!-- 定义条件编译,除了支付宝小程序别的都可以 -->
	<!-- #ifndef MP-ALIPAY -->
	<view class="uni-list uni-common-mt">
		<view class="uni-list-cell">
			<view>
				<view class="uni-label">弹幕内容</view>
			</view>
			<view class="uni-list-cell-db">
				<input v-model="danmuValue" class="uni-input" type="text" placeholder="在此处输入弹幕内容" />
			</view>
		</view>
	</view>
	<view class="uni-btn-v">
		<button @click="sendDanmu" class="page-body-button">发送弹幕</button>
	</view>
	<!-- #endif -->
</view>
<!-- 视频频播放结束 -->

JS:

export default {
    data() {
        return {
            src: '',
            danmuList: [{
                    text: '第 1s 出现的弹幕',
                    color: '#ff0000',
                    time: 1
                },
                {
                    text: '第 3s 出现的弹幕',
                    color: '#ff00ff',
                    time: 3
                }
            ],
            danmuValue: ''
        }
    },
    onReady: function(res) {
        // #ifndef MP-ALIPAY
        this.videoContext = uni.createVideoContext('myVideo')
        // #endif
    },
    methods: {
        sendDanmu: function() {
            this.videoContext.sendDanmu({
                text: this.danmuValue,
                color: this.getRandomColor()
            });
            this.danmuValue = '';
        },
        videoErrorCallback: function(e) {
            uni.showModal({
                content: e.target.errMsg,
                showCancel: false
            })
        },
        getRandomColor: function() {
            const rgb = []
            for (let i = 0; i < 3; ++i) {
                let color = Math.floor(Math.random() * 256).toString(16)
                color = color.length == 1 ? '0' + color : color
                rgb.push(color)
            }
            return '#' + rgb.join('')
        }
    }
}

5. live-player视频组件
实时音视频播放,也称直播拉流。这个不太用得着。看看示例代码就行了。
App的实时音视频播放,不是使用 live-player,而是直接使用 video 组件。
关键属性:
mode:live(直播),RTC(实时通话,该模式时延更低)
sound-mode:声音输出方式;可选值speaker扬声器、ear听筒
object-fit :contain-图像长边填满屏幕,短边区域会被填充;fillCrop-图像铺满屏幕,超出显示区域的部分将被截掉

<!-- 直播拉流 -->
<live-player
  src="https://domain/pull_stream"
  autoplay
  @statechange="statechange"
  @error="error"
  style="width: 300px; height: 225px;"
/>
<!-- 直播拉流结束 -->

JS

export default {
    methods:{
        statechange(e){
            console.log('live-player code:', e.detail.code)
        },
        error(e){
            console.error('live-player error:', e.detail.errMsg)
        }
    }
}

无法测试,因此了解一下就行。
6. live-pusher实时音视频录制,也称直播推流
主要的一些属性:
在这里插入图片描述
示例代码

 <view>
      <live-pusher id='livePusher' ref="livePusher" class="livePusher" url=""
       mode="SD" :muted="true" :enable-camera="true" :auto-focus="true" :beauty="1" whiteness="2"
       aspect="9:16" @statechange="statechange" @netstatus="netstatus" @error = "error"
       ></live-pusher>
       <button class="btn" @click="start">开始推流</button>
       <button class="btn" @click="pause">暂停推流</button>
       <button class="btn" @click="resume">resume</button>
       <button class="btn" @click="stop">停止推流</button>
       <button class="btn" @click="snapshot">快照</button>
       <button class="btn" @click="startPreview">开启摄像头预览</button>
       <button class="btn" @click="stopPreview">关闭摄像头预览</button>
       <button class="btn" @click="switchCamera">切换摄像头</button>
    </view>

JS

<script>
    export default {
        data() {
			return {}
        },
        onReady() {
            // 注意:需要在onReady中 或 onLoad 延时
            this.context = uni.createLivePusherContext("livePusher", this);
        },
        methods: {
            statechange(e) {
                console.log("statechange:" + JSON.stringify(e));
            },
            netstatus(e) {
                console.log("netstatus:" + JSON.stringify(e));
            },
            error(e) {
                console.log("error:" + JSON.stringify(e));
            },
            start: function() {
                this.context.start({
                    success: (a) => {
                        console.log("livePusher.start:" + JSON.stringify(a));
                    }
                });
            },
            close: function() {
                this.context.close({
                    success: (a) => {
                        console.log("livePusher.close:" + JSON.stringify(a));
                    }
                });
            },
            snapshot: function() {
                this.context.snapshot({
                    success: (e) => {
                        console.log(JSON.stringify(e));
                    }
                });
            },
            resume: function() {
                this.context.resume({
                    success: (a) => {
                        console.log("livePusher.resume:" + JSON.stringify(a));
                    }
                });
            },
            pause: function() {
                this.context.pause({
                    success: (a) => {
                        console.log("livePusher.pause:" + JSON.stringify(a));
                    }
                });
            },
            stop: function() {
                this.context.stop({
                    success: (a) => {
                        console.log(JSON.stringify(a));
                    }
                });
            },
            switchCamera: function() {
                this.context.switchCamera({
                    success: (a) => {
                        console.log("livePusher.switchCamera:" + JSON.stringify(a));
                    }
                });
            },
            startPreview: function() {
                this.context.startPreview({
                    success: (a) => {
                        console.log("livePusher.startPreview:" + JSON.stringify(a));
                    }
                });
            },
            stopPreview: function() {
                this.context.stopPreview({
                    success: (a) => {
                        console.log("livePusher.stopPreview:" + JSON.stringify(a));
                    }
                });
            }
        }
    }
</script>

H5上不支持预览,因此也只是了解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Uniapp零基础开发学习笔记(9) -媒体组件音视频摄像头等的练习使用 的相关文章

  • 如何使用 javascript 从 Audio Element 录制音频

    我正在使用 HTML5 和 Javascript 制作录音机 并且不想包含任何第三方 API 我的第一步是使用以下命令创建音频检索器和播放器
  • TypeError:req.checkBody 不是包含 bodyparser 和expressvalidator 模块的函数

    我收到错误 req checkBody 不是一个函数 我认为我已经包含了express validator和body parser 这是我的代码 var express require express var bodyParser requ
  • 将输入字段添加到 div 容器 (javascript)

    我想将一些 html 数据添加到 div 容器的末尾 目前 我使用innerHtml来做到这一点
  • 如何从捆绑 .spec.js 文件中排除 webpack

    我的 Package bundle 读取 var reqContext require context true js reqContext keys map reqContext 其中基本上包括所有 js 文件 我希望表达式排除任何 sp
  • 无法使用 Karma 运行 Coverage

    我正在尝试使用 karma 运行覆盖率 但收到警告 警告 预处理 无法加载 覆盖率 它未注册 我以为我在运行 npm install g karma coverage save dev 时安装了覆盖范围 这是我的配置文件 module ex
  • 类似于 iPhone(老虎机)的网络“选择器”选择框? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个类似 iPhone 的 选择器 控件 我可以在网络上使用它 可访问性不是问题 JavaS
  • 如何从模板脚本访问 AngularJS 变量

    我的控制器 scope totals totals 我的模板 按 html 注入的预期工作 totals 但我需要的是访问变量totals在模板的脚本中 如下所示 我试过了 scope totals totals totals 等 均无济于
  • 如何在 Angular 2 中禁用浏览器后退按钮

    我正在使用 Angular 2 开发一个网站 有没有办法使用 Angular 2 禁用或触发浏览器后退按钮 Thanks 不确定这是否已经排序 但仍然发布答案 以供将来参考 为了解决这个问题 您基本上需要在应用程序组件中添加一个侦听器并设置
  • Firebug 说“此页面上没有 Javascript”,即使页面上确实存在 JavaScript

    为什么Firebug说有No Javascript on this page当页面上明显有 JavaScript 负载时 我什至多次重新加载页面以确保但它仍然显示相同的消息 它以前从来没有这样做过 但突然间它就行为不当了 是因为某些配置问题
  • 转义双引号 JavaScript

    我试图在 iPhone 上查看时运行某种图像格式 在其他情况下运行一些 Flash 视频 var uagent navigator userAgent toLowerCase if uagent search iphone gt 1 doc
  • 在模型对象上设置属性?

    Hi 我正在构建 ASP NET MVC 站点并遇到了问题 在我的项目中 我得到了一个 modelview 类 其中包含几个属性 例如 public class myModelView public int MyProperty1 get
  • 是否可以模拟 isTrusted=true

    我希望在调用 touchStart 事件时能够模拟 isTrusted true 是否有任何库或任何类型的解决方法可以实现这一点 以下是我以编程方式运行 touchStart 时的输出与实际调用 touchStart 时的输出 我正在使用移
  • 什么是 TypeScript?为什么我要用它代替 JavaScript? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 您能描述一下 TypeScript 语言是什么吗 它能做什么 JavaScript 或可用库不能做的事情 这让我有理由考虑它 我最初写
  • 如何将java数组列表转换为javascript数组? [复制]

    这个问题在这里已经有答案了 我们如何将 String 对象的 java arraylist 转换为 javascript 数组 这就是我正在做的事情 但我正在寻找更好的方法来做到这一点 我不想迭代数组列表 var myArray
  • 如何暂时停止标题属性显示工具提示?

    我在右键单击时显示了一个弹出 div 我知道这会破坏预期的功能 但 Google 文档会这样做 所以为什么不呢 但是 我在弹出窗口上显示的元素有一个 标题 属性集 该属性集出现在我的分区 我仍然希望工具提示能够工作 但当弹出窗口出现时就不行
  • Jquery 手风琴默认不折叠

    我正在使用 bootstrap 提供的折叠插件 这是一个 jquery 简单插件 但是它默认折叠 如何修改以使折叠项默认隐藏 只有当我按下标题时 该项目才会折叠并显示 谢谢 插件的文档 只有几行 所以只需要一分钟 http twitter
  • 如何以编程方式移动 OpenLayers Vector?

    API 文档为OpenLayers Feature Vector http dev openlayers org apidocs files OpenLayers Feature Vector js html说 Vector 本身根本没有方
  • 如何了解来自不同...“命名空间”的变量?

    如何从外部 javascript 文件中访问在另一个地方声明的某个变量 假设在一个 html 文件中我有以下内容 在 otherfile html 的部分中 我有 alert a 我如何确保收到一条提示消息 某事 我认为Google Ads
  • Java 将函数添加到 json 对象而不使用引号。

    我正在用 java 构建一个 json 对象 我需要将一个函数传递到我的 javascript 中并使用 jquery isFunction 对其进行验证 我遇到的问题是我必须将 json 对象中的函数设置为字符串 但 json 对象将周围
  • JS 中的展开/休息运算符如何工作? [复制]

    这个问题在这里已经有答案了 我正在努力完全理解扩展 休息运算符在 JS 中的工作原理 我已经阅读了 MDN 文档 但我仍然不完全清楚 我在下面提供了一个示例 我在其中使用了它并且它按预期工作 const users name Samir a

随机推荐

  • 形态学的图像处理

    数字形态学是图像处理与分析领域的重要工具之一 数学形态学可以用来解决抑制噪声 特征提取 边缘检测 图像分割 形状识别 纹理分析 图像恢复与重建 图像压缩等图像处理问题 本文将会对形态学的图像处理进行一些通俗的原理解释和Matlab代码验证
  • 初始C语言——数组的行和列互换

    define CRT SECURE NO WARNINGS 1 防止visual studio2013以上版本scanf报错 vc6 0环境可忽略 include
  • 小案例:页面滚动事件以及导航栏点击

    HTML html实现方法一 导航栏a标签href 要与下列div中id属性对应 点击a标签即可滑动到对应id的div div class navbar 导航栏 ul class rightheader li a class page sc
  • 5G承载网络技术发展趋势

    导读 随着5G建设的日渐加快 5G与云网融合共生互促 推动承载网络技术不断发展演进 云网融合必将成为行业高质量发展的必然趋势 当前云网融合面临着新需求与新挑战 5G承载网络技术在确定性保障 定制化服务和智能管控运维等技术方面也面临着新的发展
  • 5个最流行的可用于移动开发的嵌入式数据库简介

    嵌入式数据库是轻量级的 独立的库 没有服务器组件 无需管理 一个小的代码尺寸 以及有限的资源需求 目前有几种嵌入式数据库 你可以在移动应用程序中使用 让我们来看看这些最流行的数据库 数据库 数据类型存储 License 支持平台 Berke
  • 【2019.11.12】C语言中求最大值和最小值的两种方法

    C语言中求最大值和最小值的两种方法 编写完整的程序 输入三个数 输出其中的最大数 最小数 输入说明 两个整数N1 N2 N3 输出说明 最大数 最小数 输入样例 5 4 9 输出样例 9 4 方法一 include
  • C++学习教程大纲

    以下是C 学习教程的大纲 第一部分 基础知识 C 简介 什么是C C 的历史 C 的特点和优势 开发环境的搭建 安装C 编译器 配置开发环境 第一个C 程序 Hello World程序 程序的结构 编译和运行程序 数据类型和变量 基本数据类
  • jQuery的三种$()

    号是jQuery 类 的一个别称 构造了一个jQuery对象 所以 可以叫做jQuery的构造函数 个人观点 呵呵 1 可以是 expresion 即css选择器 Xpath或html元素 也就是通过上述表达式来匹配目标元素 比如 a 构造
  • 应急响应篇:windows入侵排查

    前言 应急响应 Incident Response Service IRS 是当企业系统遭受病毒传播 网络攻击 黑客入侵等安全事件导致信息业务中断 系统宕机 网络瘫痪 数据丢失 企业声誉受损 并对组织和业务运行产生直接或间接的负面影响时 急
  • 《码上行动:零基础学会Python编程》书籍分享

    Python是一种高级的 面向对象的编程语言 由Guido van Rossum于1991年开发 它具有简洁 易读和可维护的语法 被广泛用于科学计算 Web开发 数据分析 人工智能等领域 以下是Python的一些特点和优势 简洁易读 Pyt
  • 还对Flutter理解不透?看完这些迟早成为大佬~

    Flutter是什么 Flutter简介 Flutter是谷歌的移动UI框架 可以快速在iOS和Android上构建高质量的原生用户界面 一份代码可以同时生成iOS和Android两个高性能 高保真的应用程序 Flutter目标是使开发人员
  • 2023年最火副业:Python爬虫兼职,一周赚7800元,一天只要两小时 !

    现在学习python的人越来越多了 跟大家简单如何利用python搞副业赚钱的 想要利用 Python 赚钱的方式还是比较多的 其中接单和投稿算是两种比较简单的方式了 如果你是业余学python爬虫 可以去淘宝上加了找了几个店铺直接问需要爬
  • 数据结构和算法(4):栈与队列

    栈 ADT 及实现 栈 stack 是存放数据对象的一种特殊容器 其中的数据元素按线性的逻辑次序排列 故也可定义首 末元素 尽管栈结构也支持对象的插入和删除操作 但其操作的范围仅限于栈的某一特定端 也就是说 若约定新的元素只能从某一端插入其
  • 文本域左边的文字处理

    文本域左边文字默认是bottom 如果想要左边文字与文本域顶部平齐 那么只需要设置label的vertical align的属性值为top即可 设置前 设置后
  • 代码分析(一)

    2021SC SDUSC 分析前言 对于APIJSON的代码分析首先就是 看一下该项目的作用以及如何进行 看一下原来不部署这个项目的正常流程 再来看一下部署上APIJSON后项目的流程走向 接下来开始按照这个流程对相应的代码进行分析 Abs
  • windows xcopy 复制文件夹命令 覆盖 或 跳过

    xcopy 拓展的复制命令 复制目录和下面的文件 保持目录结构 不能复制系统文件 隐藏文件 xcopy 源路径 目标路径 常用 复制并且覆盖 xcopy y srcPath dstPath 复制目录和目录下文件并且对目录下的子目录和子目录的
  • 一款好用的国产软件源代码缺陷分析平台 — CodeSense

    CodeSense是新一代的软件源代码缺陷深度分析平台 包含多个自研的代码分析引擎 同时提供开放的方案 支持多种商业 开源分析引擎集成并对结果进行集中展示 与目前市面的国外商业工具对比 在语言种类 功能 标准 缺陷分类数量上 已达到一致 额
  • 论文阅读-Training a Helpful and Harmless Assistant withReinforcement Learning from Human Feedback

    一 论文信息 论文名称 Training a Helpful and Harmless Assistant withReinforcement Learning from Human Feedback Github GitHub anthr
  • JavaWeb - 仿小米商场(4):首页商品分类展示

    JavaWeb 仿小米商场 4 首页线路分类展示 1 功能描述 接上篇JavaWeb 仿小米商场 3 登录与退出本篇博客将分析和实现旅游线路分类内容的查询和展示 此功能旨在控制 banner 顶部的展示内容 如以下H5页面所示 2 功能分析
  • Uniapp零基础开发学习笔记(9) -媒体组件音视频摄像头等的练习使用

    Uniapp零基础开发学习笔记 9 媒体组件音视频摄像头等的练习使用 基础组件部分 最后就只剩余媒体组件以及地图 和画布Canvas 以及浏览器组件web view 此次先看看媒体组件 重点学习前面几个 链接如下 https uniapp