• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 视频播放 (Video)
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @sd-wu-->
5<!--Designer: @sunbees-->
6<!--Tester: @liuli0427-->
7<!--Adviser: @HelloCrease-->
8
9
10Video组件用于播放视频文件并控制其播放状态,常用于短视频和应用内部视频的列表页面。当视频完整出现时会自动播放,用户点击视频区域则会暂停播放,同时显示播放进度条,通过拖动播放进度条指定视频播放到具体位置。具体用法请参考[Video](../reference/apis-arkui/arkui-ts/ts-media-components-video.md)。
11
12
13## 创建视频组件
14
15Video通过调用接口来创建,接口调用形式如下:
16
17`Video(value: VideoOptions)`
18
19## 加载视频资源
20
21Video组件支持加载本地视频和网络视频。具体的数据源配置请参考[VideoOptions对象说明](../reference/apis-arkui/arkui-ts/ts-media-components-video.md#videooptions对象说明)。
22
23
24### 加载本地视频
25
26- 普通本地视频。
27
28  加载本地视频时,首先在本地rawfile目录指定对应的文件,如下图所示。
29
30  ![zh-cn_image_0000001562700409](figures/zh-cn_image_0000001562700409.png)
31
32  再使用资源访问符$rawfile()引用视频资源。
33
34  ```ts
35  // xxx.ets
36  @Component
37  export struct VideoPlayer {
38    private controller: VideoController = new VideoController()
39    private previewUris: Resource = $r('app.media.preview')
40    private innerResource: Resource = $rawfile('videoTest.mp4')
41
42    build() {
43      Column() {
44        Video({
45          src: this.innerResource,  // 设置视频源
46          previewUri: this.previewUris, // 设置预览图
47          controller: this.controller //设置视频控制器,可以控制视频的播放状态
48        })
49      }
50    }
51  }
52  ```
53
54
55- [Data Ability](../application-models/dataability-overview.md)提供的视频路径带有dataability://前缀,使用时确保对应视频资源存在。
56
57  ```ts
58  // xxx.ets
59  @Component
60  export struct VideoPlayer {
61    private controller: VideoController = new VideoController()
62    private previewUris: Resource = $r('app.media.preview')
63    private videoSrc: string = 'dataability://device_id/com.domainname.dataability.videodata/video/10'
64
65    build() {
66      Column() {
67        Video({
68          src: this.videoSrc,
69          previewUri: this.previewUris,
70          controller: this.controller
71        })
72      }
73    }
74  }
75  ```
76
77### 加载沙箱路径视频
78
79支持file://路径前缀的字符串,用于读取应用沙箱路径内的资源,需要确保应用沙箱目录路径下的文件存在并且有可读权限。
80
81```ts
82// xxx.ets
83@Component
84export struct VideoPlayer {
85  private controller: VideoController = new VideoController()
86  private videoSrc: string = 'file:///data/storage/el2/base/haps/entry/files/show.mp4'
87
88  build() {
89    Column() {
90      Video({
91        src: this.videoSrc,
92        controller: this.controller
93      })
94    }
95  }
96}
97```
98
99
100### 加载网络视频
101
102加载网络视频时,需要申请ohos.permission.INTERNET权限,具体申请方式请参考[声明权限](../security/AccessToken/declare-permissions.md)。此时,Video的src属性为网络视频的链接。
103
104
105```ts
106// xxx.ets
107@Component
108export struct VideoPlayer {
109  private controller: VideoController = new VideoController()
110  private previewUris: Resource = $r('app.media.preview')
111  private videoSrc: string = 'https://www.example.com/example.mp4' // 使用时请替换为实际视频加载网址
112
113  build() {
114    Column() {
115      Video({
116        src: this.videoSrc,
117        previewUri: this.previewUris,
118        controller: this.controller
119      })
120    }
121  }
122}
123```
124
125
126## 添加属性
127
128Video组件[属性](../reference/apis-arkui/arkui-ts/ts-media-components-video.md#属性)主要用于设置视频的播放形式。例如设置视频播放是否静音、播放是否显示控制条等。
129
130
131```ts
132// xxx.ets
133@Component
134export struct VideoPlayer {
135  private controller: VideoController = new VideoController()
136
137  build() {
138    Column() {
139      Video({
140        controller: this.controller
141      })
142        .muted(false) // 设置是否静音
143        .controls(false) // 设置是否显示默认控制条
144        .autoPlay(false) // 设置是否自动播放
145        .loop(false) // 设置是否循环播放
146        .objectFit(ImageFit.Contain) // 设置视频填充模式
147    }
148  }
149}
150```
151
152
153## 事件调用
154
155  Video组件回调事件主要包括播放开始、播放暂停、播放结束、播放失败、播放停止、视频准备和操作进度条等事件,除此之外,Video组件也支持通用事件的调用,如点击、触摸等事件的调用。详细事件请参考[事件说明](../reference/apis-arkui/arkui-ts/ts-media-components-video.md#事件)。
156
157```ts
158// xxx.ets
159@Entry
160@Component
161struct VideoPlayer {
162  private controller: VideoController = new VideoController()
163  private previewUris: Resource = $r('app.media.preview')
164  private innerResource: Resource = $rawfile('videoTest.mp4')
165
166  build() {
167    Column() {
168      Video({
169        src: this.innerResource,
170        previewUri: this.previewUris,
171        controller: this.controller
172      })
173        .onUpdate((event) => { // 更新事件回调
174          console.info("Video update.");
175        })
176        .onPrepared((event) => { // 准备事件回调
177          console.info("Video prepared.");
178        })
179        .onError(() => { // 失败事件回调
180          console.error("Video error.");
181        })
182        .onStop(() => { // 停止事件回调
183          console.info("Video stopped.");
184        })
185    }
186  }
187}
188```
189
190
191## Video控制器使用
192
193Video控制器主要用于控制视频的状态,包括播放、暂停、停止以及设置进度等,详细使用请参考[VideoController使用说明](../reference/apis-arkui/arkui-ts/ts-media-components-video.md#videocontroller)。
194
195- 默认控制器
196
197  默认的控制器支持视频的开始、暂停、进度调整、全屏显示四项基本功能。
198
199  ```ts
200  // xxx.ets
201  @Entry
202  @Component
203  struct VideoGuide {
204    @State videoSrc: Resource = $rawfile('videoTest.mp4')
205    @State previewUri: string = 'common/videoIcon.png'
206    @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
207
208    build() {
209      Row() {
210        Column() {
211          Video({
212            src: this.videoSrc,
213            previewUri: this.previewUri,
214            currentProgressRate: this.curRate // 设置视频播放倍速
215          })
216        }
217        .width('100%')
218      }
219      .height('100%')
220    }
221  }
222  ```
223
224- 自定义控制器
225
226  使用自定义的控制器,先关闭默认控制器,然后使用[Button](../reference/apis-arkui/arkui-ts/ts-basic-components-button.md)以及[Slider](../reference/apis-arkui/arkui-ts/ts-basic-components-slider.md)等组件进行自定义的控制与显示,适合自定义较强的场景下使用。
227
228  ```ts
229  // xxx.ets
230  @Entry
231  @Component
232  struct VideoGuide {
233    @State videoSrc: Resource = $rawfile('videoTest.mp4')
234    @State previewUri: string = 'common/videoIcon.png'
235    @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
236    @State currentTime: number = 0
237    @State durationTime: number = 0
238    controller: VideoController = new VideoController()
239
240    build() {
241      Row() {
242        Column() {
243          Video({
244            src: this.videoSrc,
245            previewUri: this.previewUri,
246            currentProgressRate: this.curRate,
247            controller: this.controller
248          })
249            .controls(false)
250            .autoPlay(true)
251            .onPrepared((event) => {
252              if (event) {
253                this.durationTime = event.duration
254              }
255            })
256            .onUpdate((event) => {
257              if (event) {
258                this.currentTime = event.time
259              }
260            })
261          Row() {
262            Text(JSON.stringify(this.currentTime) + 's')
263            Slider({
264              value: this.currentTime,
265              min: 0,
266              max: this.durationTime
267            })
268              .onChange((value: number, mode: SliderChangeMode) => {
269                this.controller.setCurrentTime(value); // 设置视频播放的进度跳转到value处
270              })
271              .width("90%")
272            Text(JSON.stringify(this.durationTime) + 's')
273          }
274          .opacity(0.8)
275          .width("100%")
276        }
277        .width('100%')
278      }
279      .height('40%')
280    }
281  }
282  ```
283
284
285## 其他说明
286
287Video组件已经封装好了视频播放的基础能力,开发者无需进行视频实例的创建,视频信息的设置获取,只需要设置数据源以及基础信息即可播放视频,相对扩展能力较弱。如果开发者想自定义视频播放,请参考[视频播放](../media/media/video-playback.md)。
288
289## 相关实例
290
291针对Video组件开发,有以下相关实例可供参考:
292
293- [ 媒体库视频(ArkTS)(API9)](https://gitcode.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/VideoShow)
294
295- [简易视频播放器(ArkTS)(API9)](https://gitee.com/openharmony/codelabs/tree/master/Media/SimpleVideo)
296<!--RP1--><!--RP1End-->