支付宝小程序媒体组件 视频·video
版本需求:基础库版本 1.10.0 开始支持,低版本需要做 兼容处理。
用户可通过 video 组件播放视频。相关 API:my.createVideoContext。
说明:
- css 动画对 video 组件无效。
- 自定义竖屏观看视频时两边出现的白色填充:
- 如果是因为视频的宽高比跟 video 组件的宽高比不一致,请通过 object-fit 进行调整 ;
- 如果是由于 poster 实际的宽高比跟容器的宽高比不一致,请通过 poster-size 进行调整。
扫码体验
效果示例
示例代码
<view>
<video id="myVideo"
src="{{video.src}}"
controls="{{video.showAllControls}}"
loop="{{video.isLooping}}"
muted="{{video.muteWhenPlaying}}"
show-fullscreen-btn="{{video.showFullScreenButton}}"
show-play-btn="{{video.showPlayButton}}"
show-center-play-btn="{{video.showCenterButton}}"
object-fit="{{video.objectFit}}"
autoplay="{{video.autoPlay}}"
direction="{{video.directionWhenFullScreen}}"
initial-time="{{video.initTime}}"
mobilenetHintType="{{video.mobilenetHintType}}"
onPlay="onPlay"
onPause="onPause"
onEnded="onEnded"
onError="onPlayError"
onTimeUpdate="onTimeUpdate"
/>
</view>
Page({
data: {
status: "inited",
time: "0",
video: {
src: "XNDM0OTQzMDc2OA==",
showAllControls: false,
showPlayButton: false,
showCenterButton: true,
showFullScreenButton: true,
isLooping: false,
muteWhenPlaying: false,
initTime: 0,
objectFit: "contain",
autoPlay: false,
directionWhenFullScreen: 90,
mobilenetHintType: 2,
},},
onPlay(e) {
console.log('onPlay');
},
onPause(e) {
console.log('onPause');
},
onEnded(e) {
console.log('onEnded');
},
onPlayError(e) {
console.log('onPlayError, e=' + JSON.stringify(e));
},
onTimeUpdate(e) {
console.log('onTimeUpdate:', e.detail.currentTime);
},
});
属性
属性名 | 类型 | 默认值 | 说明 | 最低版本 |
---|---|---|---|---|
style | String | - | 内联样式。 | - |
class | String | - | 外部样式名。 | - |
src | String | - | 要播放视频的资源地址,支持优酷视频编码(支付宝客户端10.1.75)。src支持的协议如下:vid/showId: XMzg2Mzc5MzMwMA==apFilePath: https://resource/xxx.video | - |
poster | String | - | 视频封面图的 url,支持 jpg、png 等图片,如https://***.jpg。如果不传的话,默认取视频的首帧图作为封面图。 | - |
poster-size | String | contain | 当 poster 高宽比跟视频高宽不匹配时,如何显示 poster,设置规则同 background-size 一致。 | - |
object-fit | String | contain | 当视频大小与 video 容器大小不一致时,视频的表现形式。contain:包含,fill:填充。 | - |
initial-time | Number | - | 指定视频初始播放位置,单位s | 1.9.0 |
duration | Number | - | 指定视频时长,单位s,默认读取视频本身时长信息 | - |
controls | Boolean | true | 是否显示默认播放控件(底部工具条,包括播放/暂停按钮、播放进度、时间) | - |
autoplay | Boolean | false | 是否自动播放 | - |
direction | Number | - | 设置全屏时视频的方向,不指定则根据宽高比自动判断。有效值为 0(正常竖向), 90(屏幕逆时针90度), -90(屏幕顺时针90度) | 1.12.0 |
loop | Boolean | false | 是否循环播放 | 1.9.0 |
muted | Boolean | false | 是否静音播放 | 1.9.0 |
show-fullscreen-btn | Boolean | true | 是否显示全屏按钮 | 1.9.0 |
show-play-btn | Boolean | true | 是否显示视频底部控制栏的播放按钮 | 1.9.0 |
show-center-play-btn | Boolean | true | 是否显示视频中间的播放按钮 | 1.9.0 |
show-mute-btn | Boolean | true | 是否展示工具栏上的静音按钮 | 1.13.7 |
show-thin-progress-bar | Boolean | false | 当底部工具条隐藏时,是否显示细进度条(controls=false时设置无效) | 1.15.0 |
enable-progress-gesture | Boolean | true | 全屏模式下是否开启控制进度的手势 | 1.9.0 |
mobilenet-hint-type | Number | 1 | 移动网络提醒样式:0-不提醒;1-tip提醒;2-阻塞提醒(无消耗流量大小);3-阻塞提醒(有消耗流量大小提醒) | 1.13.0 |
onPlay | EventHandle | - | 当开始/继续播放时触发play事件 | - |
onPause | EventHandle | - | 当暂停播放时触发 pause 事件 | - |
onEnded | EventHandle | - | 当播放到末尾时触发 ended 事件 | - |
onTimeUpdate | EventHandle | - | 播放进度变化时触发,event.detail = {currentTime: '当前播放时间',userPlayDuration:'用户实际观看时长',videoDuration:'视频总时长'} | 1.9.0 |
onLoading | EventHandle | - | 视频出现缓冲时触发 | - |
onError | EventHandle | - | 视频播放出错时触发(errorCode见下面错误码表) | - |
onFullScreenChange | EventHandle | - | 视频进入和退出全屏时触发,event.detail = {fullScreen, direction},direction取为 vertical 或 horizontal | 1.12.0 |
onTap | EventHandle | - | 点击视频view时触发,event.detail = {ptInView:{x:0,y:0}} | - |
onUserAction | EventHandle | - | 用户操作事件,event.detail = {tag:"mute", value:0},tag为用户操作的元素,目前支持的tag有:play(底部播放按钮)、centerplay(中心播放按钮)、mute(静音按钮)、fullscreen(全屏按钮)、retry(重试按钮)、mobilenetplay(网络提醒的播放按钮) | - |
onStop | EventHandle | - | 视频播放终止。 | 1.9.0 |
onRenderStart | EventHandle | - | 当视频加载完真正开始播放时触发。 | 1.13.6 |
onTap | EventHandle | - | 点击视频 view 时触发,event.detail = {ptInView:{x:0,y:0}}。 | - |
错误码
错误码 | 大类 | 详细说明 |
---|---|---|
1 | loading、playing 过程中都可能抛出 | 未知错误。 |
1002 | loading、playing 过程中都可能抛出 | 播放器内部错误。 |
1005 | loading、playing 过程中都可能抛出 | 网络连接失败。 |
1006 | loading 异常 | 数据源错误。 |
1007 | loading 异常 | 播放器准备失败。 |
1008 | loading 异常 | 网络错误。 |
1009 | loading 异常 | 搜索视频出错(源出错的一种)。 |
1010 | loading 异常 | 准备超时,也可认为是网络太慢或数据源太慢导致的播放失败。 |
400 | loading 异常 | 读 ups 信息超时。 |
3001 | loading 异常 | audio 渲染出错。 |
3002 | loading 异常 | 硬解码错误。 |
2004 | playing 过程中可能抛出 | 播放过程中加载时间超时。 |
1023 | playing 过程中可能抛出 | 播放中内部错误(ffmpeg 内错误)。 |
支持的视频封装格式
iOS、Android 支持以下视频封装格式: mp4、mov、m4v、3gp、m3u8、flv
支持的编码格式
iOS、Android 支持以下编码格式: H.264、H.265、AAC
常见问题
video 组件中播放的视频,当用户加载观看视频一次后,再次进行观看的时候是拉取的缓存,还是再次使用网络重新加载的?
目前的缓存策略是如果视频是循环播放的,再次观看是拉取的缓存,如果不是循环播放,每次都是网络重新加载。 主要是针对一些循环播放的短视频场景提供缓存能力。
缓存中的视频什么时候会清除掉 ?
页面销毁或者关闭小程序会清除掉。
小程序如何获取视频时长?
在视频组件 onTimeUpdate 方法中获取。
video 组件,把 loop 字段设置为循环播放,在播放第二次的时候,把视频资源删除,发现无法播放 ?
虽然再次播放拉取的是缓存中的视频,但是还是会校验视频资源的。