視頻播放(Video)

2024-01-25 13:17 更新

Video組件用于播放視頻文件并控制其播放狀態(tài),常用于為短視頻應(yīng)用和應(yīng)用內(nèi)部視頻的列表頁面。當(dāng)視頻完整出現(xiàn)時會自動播放,用戶點擊視頻區(qū)域則會暫停播放,同時顯示播放進(jìn)度條,通過拖動播放進(jìn)度條指定視頻播放到具體位置。具體用法請參考Video

創(chuàng)建視頻組件

Video通過調(diào)用接口來創(chuàng)建,接口調(diào)用形式如下:

  1. Video(value: {src?: string | Resource, currentProgressRate?: number | string | PlaybackSpeed, previewUri?: string | PixelMap | Resource, controller?: VideoController})

該接口用于創(chuàng)建視頻播放組件。其中,src指定視頻播放源的路徑,加載方式請參考加載視頻資源,currentProgressRate用于設(shè)置視頻播放倍速,previewUri指定視頻未播放時的預(yù)覽圖片路徑,controller設(shè)置視頻控制器,用于自定義控制視頻。

加載視頻資源

Video組件支持加載本地視頻和網(wǎng)絡(luò)視頻。

加載本地視頻

  • 普通本地視頻。

    加載本地視頻時,首先在本地rawfile目錄指定對應(yīng)的文件,如下圖所示。

    再使用資源訪問符$rawfile()引用視頻資源。

    1. @Component
    2. export struct VideoPlayer{
    3. private controller:VideoController;
    4. private previewUris: Resource = $r ('app.media.preview');
    5. private innerResource: Resource = $rawfile('videoTest.mp4');
    6. build(){
    7. Column() {
    8. Video({
    9. src: this.innerResource,
    10. previewUri: this.previewUris,
    11. controller: this.controller
    12. })
    13. }
    14. }
    15. }
  • Data Ability提供的視頻路徑帶有dataability://前綴,使用時確保對應(yīng)視頻資源存在即可。
    1. @Component
    2. export struct VideoPlayer{
    3. private controller:VideoController;
    4. private previewUris: Resource = $r ('app.media.preview');
    5. private videoSrc: string = 'dataability://device_id/com.domainname.dataability.videodata/video/10'
    6. build(){
    7. Column() {
    8. Video({
    9. src: this.videoSrc,
    10. previewUri: this.previewUris,
    11. controller: this.controller
    12. })
    13. }
    14. }
    15. }

加載沙箱路徑視頻

支持file:///data/storage路徑前綴的字符串,用于讀取應(yīng)用沙箱路徑內(nèi)的資源。需要保證應(yīng)用沙箱目錄路徑下的文件存在并且有可讀權(quán)限。

  1. @Component
  2. export struct VideoPlayer {
  3. private controller: VideoController;
  4. private videoSrc: string = 'file:///data/storage/el2/base/haps/entry/files/show.mp4'
  5. build() {
  6. Column() {
  7. Video({
  8. src: this.videoSrc,
  9. controller: this.controller
  10. })
  11. }
  12. }
  13. }

加載網(wǎng)絡(luò)視頻

加載網(wǎng)絡(luò)視頻時,需要申請權(quán)限ohos.permission.INTERNET,具體申請方式請參考權(quán)限申請聲明。此時,Video的src屬性為網(wǎng)絡(luò)視頻的鏈接。

  1. @Component
  2. export struct VideoPlayer{
  3. private controller:VideoController;
  4. private previewUris: Resource = $r ('app.media.preview');
  5. private videoSrc: string= 'https://www.example.com/example.mp4' // 使用時請?zhí)鎿Q為實際視頻加載網(wǎng)址
  6. build(){
  7. Column() {
  8. Video({
  9. src: this.videoSrc,
  10. previewUri: this.previewUris,
  11. controller: this.controller
  12. })
  13. }
  14. }
  15. }

添加屬性

Video組件屬性主要用于設(shè)置視頻的播放形式。例如設(shè)置視頻播放是否靜音、播放時是否顯示控制條等。

  1. @Component
  2. export struct VideoPlayer {
  3. private controller: VideoController;
  4. build() {
  5. Column() {
  6. Video({
  7. controller: this.controller
  8. })
  9. .muted(false) //設(shè)置是否靜音
  10. .controls(false) //設(shè)置是否顯示默認(rèn)控制條
  11. .autoPlay(false) //設(shè)置是否自動播放
  12. .loop(false) //設(shè)置是否循環(huán)播放
  13. .objectFit(ImageFit.Contain) //設(shè)置視頻適配模式
  14. }
  15. }
  16. }

事件調(diào)用

Video組件回調(diào)事件主要為播放開始、暫停結(jié)束、播放失敗、視頻準(zhǔn)備和操作進(jìn)度條等事件,除此之外,Video組件也支持通用事件的調(diào)用,如點擊、觸摸等事件的調(diào)用。詳細(xì)的事件請參考事件說明。
  1. @Entry
  2. @Component
  3. struct VideoPlayer{
  4. private controller:VideoController;
  5. private previewUris: Resource = $r ('app.media.preview');
  6. private innerResource: Resource = $rawfile('videoTest.mp4');
  7. build(){
  8. Column() {
  9. Video({
  10. src: this.innerResource,
  11. previewUri: this.previewUris,
  12. controller: this.controller
  13. })
  14. .onUpdate((event) => { //更新事件回調(diào)
  15. console.info("Video update.");
  16. })
  17. .onPrepared((event) => { //準(zhǔn)備事件回調(diào)
  18. console.info("Video prepared.");
  19. })
  20. .onError(() => { //失敗事件回調(diào)
  21. console.info("Video error.");
  22. })
  23. }
  24. }
  25. }

Video控制器使用

Video控制器主要用于控制視頻的狀態(tài),包括播放、暫停、停止以及設(shè)置進(jìn)度等,詳細(xì)的使用請參考VideoController使用說明

  • 默認(rèn)控制器

    默認(rèn)的控制器支持視頻的開始、暫停、進(jìn)度調(diào)整、全屏顯示四項基本功能。

    1. @Entry
    2. @Component
    3. struct VideoGuide {
    4. @State videoSrc: Resource = $rawfile('videoTest.mp4')
    5. @State previewUri: string = 'common/videoIcon.png'
    6. @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
    7. build() {
    8. Row() {
    9. Column() {
    10. Video({
    11. src: this.videoSrc,
    12. previewUri: this.previewUri,
    13. currentProgressRate: this.curRate
    14. })
    15. }
    16. .width('100%')
    17. }
    18. .height('100%')
    19. }
    20. }
  • 自定義控制器
    使用自定義的控制器,先將默認(rèn)控制器關(guān)閉掉,之后可以使用button以及slider等組件進(jìn)行自定義的控制與顯示,適合自定義較強(qiáng)的場景下使用。
    1. @Entry
    2. @Component
    3. struct VideoGuide {
    4. @State videoSrc: Resource = $rawfile('videoTest.mp4')
    5. @State previewUri: string = 'common/videoIcon.png'
    6. @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
    7. @State isAutoPlay: boolean = false
    8. @State showControls: boolean = true
    9. @State sliderStartTime: string = '';
    10. @State currentTime: number = 0;
    11. @State durationTime: number = 0;
    12. @State durationStringTime: string ='';
    13. controller: VideoController = new VideoController()
    14. build() {
    15. Row() {
    16. Column() {
    17. Video({
    18. src: this.videoSrc,
    19. previewUri: this.previewUri,
    20. currentProgressRate: this.curRate,
    21. controller: this.controller
    22. }).controls(false).autoPlay(true)
    23. .onPrepared((event)=>{
    24. this.durationTime = event.duration
    25. })
    26. .onUpdate((event)=>{
    27. this.currentTime =event.time
    28. })
    29. Row() {
    30. Text(JSON.stringify(this.currentTime) + 's')
    31. Slider({
    32. value: this.currentTime,
    33. min: 0,
    34. max: this.durationTime
    35. })
    36. .onChange((value: number, mode: SliderChangeMode) => {
    37. this.controller.setCurrentTime(value);
    38. }).width("90%")
    39. Text(JSON.stringify(this.durationTime) + 's')
    40. }
    41. .opacity(0.8)
    42. .width("100%")
    43. }
    44. .width('100%')
    45. }
    46. .height('40%')
    47. }
    48. }

其他說明

Video組件已經(jīng)封裝好了視頻播放的基礎(chǔ)能力,開發(fā)者無需進(jìn)行視頻實例的創(chuàng)建,視頻信息的設(shè)置獲取,只需要設(shè)置數(shù)據(jù)源以及基礎(chǔ)信息即可播放視頻,相對擴(kuò)展能力較弱。如果開發(fā)者想自定義視頻播放,還請參考媒體系統(tǒng)播放音視頻。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號