• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Video
2
3用于播放视频文件并控制其播放状态的组件。
4
5>  **说明:**
6>
7>  该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9## 权限列表
10
11使用网络视频时,需要申请权限ohos.permission.INTERNET。具体申请方式请参考[声明权限](../../../security/AccessToken/declare-permissions.md)。
12
13
14## 子组件
15
16不支持子组件。
17
18
19## 接口
20
21Video(value: VideoOptions)
22
23**参数:**
24
25| 参数名 | 参数类型 | 必填 | 参数描述 |
26| -------- | -------- | -------- | -------- |
27| value | [VideoOptions](#videooptions对象说明) | 是 | 视频信息。 |
28
29##  VideoOptions对象说明
30
31| 参数名              | 参数类型                                                     | 必填 | 参数描述                                                     |
32| ------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
33| src                 | string \| [Resource](ts-types.md#resource)                            | 否   | 视频播放源的路径,支持本地视频路径和网络路径。<br>支持在resources下面的video或rawfile文件夹里放置媒体资源。<br>支持dataability://的路径前缀,用于访问通过Data Ability提供的视频路径,具体路径信息详见 [DataAbility说明](../../../application-models/dataability-overview.md)。<br/>- 支持file:///data/storage路径前缀的字符串,用于读取应用沙箱路径内的资源。需要保证目录包路径下的文件有可读权限。<br/>**说明:**<br/>视频支持的格式是:mp4、mkv、TS。 |
34| currentProgressRate | number&nbsp;\|&nbsp;string&nbsp;\|&nbsp;[PlaybackSpeed<sup>8+</sup>](#playbackspeed8枚举说明) | 否   | 视频播放倍速。<br/>**说明:**<br/>number取值仅支持:0.75,1.0,1.25,1.75,2.0。<br/>默认值:1.0 \| PlaybackSpeed.Speed_Forward_1_00_X |
35| previewUri          | string&nbsp;\| [PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7)&nbsp;\|&nbsp;[Resource](ts-types.md)  | 否   | 视频未播放时的预览图片路径,默认不显示图片。                 |
36| controller          | [VideoController](#videocontroller)                          | 否   | 设置视频控制器,可以控制视频的播放状态。                     |
37
38
39## PlaybackSpeed<sup>8+</sup>枚举说明
40
41| 名称                   | 描述        |
42| -------------------- | --------- |
43| Speed_Forward_0_75_X | 0.75倍速播放。 |
44| Speed_Forward_1_00_X | 1倍速播放。    |
45| Speed_Forward_1_25_X | 1.25倍速播放。 |
46| Speed_Forward_1_75_X | 1.75倍速播放。 |
47| Speed_Forward_2_00_X | 2倍速播放。    |
48
49## 属性
50
51除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性:
52
53| 名称        | 参数类型                                     | 描述                           |
54| --------- | ---------------------------------------- | ---------------------------- |
55| muted     | boolean                                  | 是否静音。<br/>默认值:false          |
56| autoPlay  | boolean                                  | 是否自动播放。<br/>默认值:false        |
57| controls  | boolean                                  | 控制视频播放的控制栏是否显示。<br/>默认值:true |
58| objectFit | [ImageFit](ts-appendix-enums.md#imagefit) | 设置视频显示模式。<br/>默认值:Cover      |
59| loop      | boolean                                  | 是否单个视频循环播放。<br/>默认值:false    |
60
61## 事件
62
63除支持[通用事件](ts-universal-events-click.md)外,还支持以下事件:
64
65| 名称                                                         | 功能描述                                                     |
66| ------------------------------------------------------------ | ------------------------------------------------------------ |
67| onStart(event:()&nbsp;=&gt;&nbsp;void)                       | 播放时触发该事件。                                           |
68| onPause(event:()&nbsp;=&gt;&nbsp;void)                       | 暂停时触发该事件。                                           |
69| onFinish(event:()&nbsp;=&gt;&nbsp;void)                      | 播放结束时触发该事件。                                       |
70| onError(event:()&nbsp;=&gt;&nbsp;void)                       | 播放失败时触发该事件。                                       |
71| onPrepared(callback:(event:&nbsp;{&nbsp;duration:&nbsp;number&nbsp;})&nbsp;=&gt;&nbsp;void) | 视频准备完成时触发该事件。<br/>duration:当前视频的时长,单位为秒(s)。 |
72| onSeeking(callback:(event:&nbsp;{&nbsp;time:&nbsp;number&nbsp;})&nbsp;=&gt;&nbsp;void) | 操作进度条过程时上报时间信息。<br/>time:当前视频播放的进度,单位为s。 |
73| onSeeked(callback:(event:&nbsp;{&nbsp;time:&nbsp;number&nbsp;})&nbsp;=&gt;&nbsp;void) | 操作进度条完成后,上报播放时间信息。<br/>time:当前视频播放的进度,单位为s。 |
74| onUpdate(callback:(event:&nbsp;{&nbsp;time:&nbsp;number&nbsp;})&nbsp;=&gt;&nbsp;void) | 播放进度变化时触发该事件。<br/>time:当前视频播放的进度,单位为s。 |
75| onFullscreenChange(callback:(event:&nbsp;{&nbsp;fullscreen:&nbsp;boolean&nbsp;})&nbsp;=&gt;&nbsp;void) | 在全屏播放与非全屏播放状态之间切换时触发该事件。<br/>fullscreen:返回值为true表示进入全屏播放状态,为false则表示非全屏播放。 |
76
77
78## VideoController
79
80一个VideoController对象可以控制一个或多个video,可用视频播放实例请参考[@ohos.multimedia.media](../../apis-media-kit/js-apis-media.md)。
81
82
83### 导入对象
84
85```ts
86let controller: VideoController = new VideoController()
87```
88
89
90### start
91
92start(): void
93
94开始播放。
95
96### pause
97
98pause(): void
99
100暂停播放,显示当前帧,再次播放时从当前位置继续播放。
101
102### stop
103
104stop(): void
105
106停止播放,显示当前帧,再次播放时从头开始播放。
107
108### setCurrentTime
109
110setCurrentTime(value: number)
111
112指定视频播放的进度位置。
113
114**参数:**
115
116| 参数名   | 参数类型   | 必填   | 参数描述           |
117| ----- | ------ | ---- | -------------- |
118| value | number | 是    | 视频播放进度位置,单位为s。 |
119
120### requestFullscreen
121
122requestFullscreen(value: boolean)
123
124请求全屏播放。
125
126**参数:**
127
128| 参数名 | 参数类型 | 必填 | 参数描述                         |
129| ------ | -------- | ---- | -------------------------------- |
130| value  | boolean  | 是   | 是否全屏(填充满应用窗口)播放。 |
131
132### exitFullscreen
133
134exitFullscreen()
135
136退出全屏播放。
137
138### setCurrentTime<sup>8+</sup>
139
140setCurrentTime(value: number, seekMode: SeekMode)
141
142指定视频播放的进度位置,并指定跳转模式。
143
144**参数:**
145
146| 参数名      | 参数类型     | 必填   | 参数描述           |
147| -------- | -------- | ---- | -------------- |
148| value    | number   | 是    | 视频播放进度位置,单位为s。 |
149| seekMode | [SeekMode](#seekmode8枚举说明) | 是    | 跳转模式。          |
150
151## SeekMode<sup>8+</sup>枚举说明
152
153| 名称               | 描述             |
154| ---------------- | -------------- |
155| PreviousKeyframe | 跳转到前一个最近的关键帧。  |
156| NextKeyframe     | 跳转到后一个最近的关键帧。  |
157| ClosestKeyframe  | 跳转到最近的关键帧。     |
158| Accurate         | 精准跳转,不论是否为关键帧。 |
159
160
161
162## 示例
163
164```ts
165// xxx.ets
166@Entry
167@Component
168struct VideoCreateComponent {
169  @State videoSrc: Resource = $rawfile('video1.mp4')
170  @State previewUri: Resource = $r('app.media.poster1')
171  @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
172  @State isAutoPlay: boolean = false
173  @State showControls: boolean = true
174  controller: VideoController = new VideoController()
175
176  build() {
177    Column() {
178      Video({
179        src: this.videoSrc,
180        previewUri: this.previewUri,
181        currentProgressRate: this.curRate,
182        controller: this.controller
183      })
184        .width('100%')
185        .height(600)
186        .autoPlay(this.isAutoPlay)
187        .controls(this.showControls)
188        .onStart(() => {
189          console.info('onStart')
190        })
191        .onPause(() => {
192          console.info('onPause')
193        })
194        .onFinish(() => {
195          console.info('onFinish')
196        })
197        .onError(() => {
198          console.info('onError')
199        })
200        .onPrepared((e?: DurationObject) => {
201          if (e != undefined) {
202            console.info('onPrepared is ' + e.duration)
203          }
204        })
205        .onSeeking((e?: TimeObject) => {
206          if (e != undefined) {
207            console.info('onSeeking is ' + e.time)
208          }
209        })
210        .onSeeked((e?: TimeObject) => {
211          if (e != undefined) {
212            console.info('onSeeked is ' + e.time)
213          }
214        })
215        .onUpdate((e?: TimeObject) => {
216          if (e != undefined) {
217            console.info('onUpdate is ' + e.time)
218          }
219        })
220
221      Row() {
222        Button('src').onClick(() => {
223          this.videoSrc = $rawfile('video2.mp4') // 切换视频源
224        }).margin(5)
225        Button('previewUri').onClick(() => {
226          this.previewUri = $r('app.media.poster2') // 切换视频预览海报
227        }).margin(5)
228        Button('controls').onClick(() => {
229          this.showControls = !this.showControls // 切换是否显示视频控制栏
230        }).margin(5)
231      }
232
233      Row() {
234        Button('start').onClick(() => {
235          this.controller.start() // 开始播放
236        }).margin(5)
237        Button('pause').onClick(() => {
238          this.controller.pause() // 暂停播放
239        }).margin(5)
240        Button('stop').onClick(() => {
241          this.controller.stop() // 结束播放
242        }).margin(5)
243        Button('setTime').onClick(() => {
244          this.controller.setCurrentTime(10, SeekMode.Accurate) // 精准跳转到视频的10s位置
245        }).margin(5)
246      }
247
248      Row() {
249        Button('rate 0.75').onClick(() => {
250          this.curRate = PlaybackSpeed.Speed_Forward_0_75_X // 0.75倍速播放
251        }).margin(5)
252        Button('rate 1').onClick(() => {
253          this.curRate = PlaybackSpeed.Speed_Forward_1_00_X // 原倍速播放
254        }).margin(5)
255        Button('rate 2').onClick(() => {
256          this.curRate = PlaybackSpeed.Speed_Forward_2_00_X // 2倍速播放
257        }).margin(5)
258      }
259    }
260  }
261}
262
263interface DurationObject {
264  duration: number;
265}
266
267interface TimeObject {
268  time: number;
269}
270```
271