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