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  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-->