色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS開發(fā)案例:【視頻播放器】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-23 17:25 ? 次閱讀

介紹

使用ArkTS語言實(shí)現(xiàn)視頻播放器,主要包括主界面和視頻播放界面,我們將一起完成以下功能:

  1. 主界面頂部使用Swiper組件實(shí)現(xiàn)視頻海報(bào)輪播。
  2. 主界面下方使用List組件實(shí)現(xiàn)視頻列表。
  3. 播放界面使用Video組件實(shí)現(xiàn)視頻播放。
  4. 在不使用視頻組件默認(rèn)控制器的前提下,實(shí)現(xiàn)自定義控制器。
  5. 播放界面底部使用圖標(biāo)控制視頻播放/暫停。
  6. 播放界面底部使用Slider組件控制和實(shí)現(xiàn)視頻播放進(jìn)度。
  7. 播放界面使用Stack容器組件的[Z序控制]實(shí)現(xiàn)在視頻播放畫面上添加開始/暫停/加載圖標(biāo)。

相關(guān)概念

  • [Swiper]組件:滑動容器,提供切換子組件顯示的能力。
  • [List]組件:列表包含一系列相同寬度的列表項(xiàng)。適合連續(xù)、多行呈現(xiàn)同類數(shù)據(jù),例如圖片和文本。
  • [Video]組件:用于播放視頻文件并控制其播放狀態(tài)的組件。
  • [Navigator]組件:路由容器組件,提供路由跳轉(zhuǎn)能力。
  • [ForEach]組件:基于數(shù)組類型數(shù)據(jù)執(zhí)行循環(huán)渲染。
  • 鴻蒙開發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

環(huán)境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開發(fā)板類型:[潤和RK3568開發(fā)板]。
  • OpenHarmony系統(tǒng):3.2 Release。

環(huán)境搭建

完成本篇Codelab我們首先要完成開發(fā)環(huán)境的搭建,本示例以RK3568開發(fā)板為例,參照以下步驟進(jìn)行:

  1. [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)。以3.2 Release版本為例:
  2. 搭建燒錄環(huán)境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發(fā)板的燒錄]
  3. 搭建開發(fā)環(huán)境。
    1. 開始前請參考[工具準(zhǔn)備],完成DevEco Studio的安裝和開發(fā)環(huán)境配置。
    2. 開發(fā)環(huán)境配置完成后,請參考[使用工程向?qū)創(chuàng)建工程(模板選擇“Empty Ability”)。
    3. 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測]。
    4. HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

搜狗高速瀏覽器截圖20240326151344.png

代碼結(jié)構(gòu)解讀

本篇Codelab只對核心代碼進(jìn)行講解,對于完整代碼,我們會在gitee中提供。

├──entry/src/main/ets             // 代碼區(qū)
│  ├──common
│  │  └──constants
│  │     └──CommonConstants.ets   // 樣式常量類
│  ├──entryability
│  │  └──EntryAbility.ts          // 程序入口類
│  ├──model
│  │  └──VideoControll.ets        // 視頻播放控制相關(guān)方法類
│  ├──pages
│  │  ├──SimpleVideoIndex.ets     // 主界面
│  │  └──SimpleVideoPlay.ets      // 視頻播放界面
│  ├──view
│  │  ├──IndexModule.ets          // 自定義首頁List模塊組件文件
│  │  ├──IndexSwiper.ets          // 自定義首頁Swiper組件文件
│  │  ├──VideoPlayer.ets          // 自定義播放界面視頻組件文件
│  │  └──VideoPlaySlider.ets      // 自定義播放界面視頻進(jìn)度條組件文件
│  └──viewmodel
│     ├──HorizontalVideoItem.ets  // 水平視頻類
│     ├──ParamItem.ets            // 參數(shù)
│     ├──SwiperVideoItem.ets      // 自定義播放界面視頻組件文件
│     └──VideoData.ets            // 首頁相關(guān)數(shù)據(jù)
└──entry/src/main/resource        // 應(yīng)用靜態(tài)資源目錄

構(gòu)建主界面

主界面由視頻輪播模塊和多個(gè)視頻列表模塊組成,效果如圖所示:

VideoData.ets中定義的視頻輪播圖數(shù)組SWIPER_VIDEOS和視頻列表圖片數(shù)組HORIZONTAL_VIDEOS。

// VideoData.ets
import { HorizontalVideoItem } from './HorizontalVideoItem';
import { SwiperVideoItem } from './SwiperVideoItem';

export const SWIPER_VIDEOS: SwiperVideoItem[] = [
  new SwiperVideoItem($r('app.media.ic_banner1')),
  new SwiperVideoItem($r('app.media.ic_banner2')),
  new SwiperVideoItem($r('app.media.ic_banner3'))
];

export const HORIZONTAL_VIDEOS: HorizontalVideoItem[] = [
  new HorizontalVideoItem(1, $r('app.media.ic_video_list0'), '視頻1'),
  new HorizontalVideoItem(2, $r('app.media.ic_video_list1'), '視頻2'),
  new HorizontalVideoItem(3, $r('app.media.ic_video_list2'), '視頻3')
];

IndexSwiper.ets文件中定義的輪播圖子組件SwiperVideo,點(diǎn)擊輪播圖片,頁面跳轉(zhuǎn)到視頻播放頁面,并攜帶本地視頻flag,效果如圖所示:

// IndexSwiper.ets
@Component
export struct SwiperVideo {
  build() {
    Column() {
      Swiper() {
        ForEach(SWIPER_VIDEOS, (item: SwiperVideoItem) = > {
          SwiperItem({ imageSrc: item.image, source: $rawfile('videoTest.mp4') })
        }, (item: SwiperVideoItem) = > JSON.stringify(item))
      }
      .autoPlay(true)
    }
    // 樣式設(shè)置
    ...
  }
}

@Component
struct SwiperItem {
  private imageSrc: Resource = $r('app.string.empty');
  private source: Resource = $r('app.string.empty');
  private paramItem: ParamItem = new ParamItem();
  ...
  build() {
    // 跳轉(zhuǎn)一:使用Navigator組件跳轉(zhuǎn)到視頻播放界面
    Navigator({ target: SECOND_PAGE, type: NavigationType.Push }) {
      Image(this.imageSrc)
        .borderRadius(MARGIN_FONT_SIZE.FIRST_MARGIN)
    }
    .params(this.paramItem)
  }
}

IndexModule.ets文件中定義的視頻列表圖片子組件VideoModule,點(diǎn)擊子組件中的圖片,頁面跳轉(zhuǎn)到視頻播放頁面,并攜帶網(wǎng)絡(luò)視頻flag,效果如圖所示:

// IndexModule.ets
@Component
export struct VideoModule {
  private moduleName: string = '';

  build() {
    Column() {
      // 視頻列表上方的文本信息
      ...
      // 視頻列表組件
      List({ space: MARGIN_FONT_SIZE.FIRST_MARGIN }) {
        ForEach(HORIZONTAL_VIDEOS, (item: HorizontalVideoItem) = > {
          ListItem() {
            HorizontalItem({
              imageSrc: item.image,
              source: NET,
              videoName: item.name
            })
          }
        }, (item: HorizontalVideoItem) = > JSON.stringify(item))
      }
      // 設(shè)置列表橫向排列
      .listDirection(Axis.Horizontal)
    }
    // 樣式設(shè)置
    ...
  }
}

@Component
struct HorizontalItem {
  private imageSrc: Resource = $r('app.string.empty');
  private source: string = '';
  private videoName: string = '';

  build() {
    // 跳轉(zhuǎn)二:使用route跳轉(zhuǎn)到視頻播放界面
    Column() {
      Image(this.imageSrc)
        .width(MARGIN_FONT_SIZE.SEVENTH_MARGIN)
        .height(MARGIN_FONT_SIZE.SIXTH_MARGIN)
        .onClick(() = > {
          router.pushUrl({
            url: SECOND_PAGE,
            params: { source: this.source }
          });
        })
     ...
    }
    .justifyContent(FlexAlign.Center)
  }
}

在SimpleVideoIndex.ets主界面中引用SwiperVideo和VideoModule子組件。

// SimpleVideoIndex.ets
@Entry
@Component
struct SimpleVideoIndex {
  build() {
    Column({ space: MARGIN_FONT_SIZE.FOURTH_MARGIN }) {
      // 視頻輪播組件
      SwiperVideo()
      List() {
        ForEach(LIST, (item: string) = > {
          ListItem() {
            VideoModule({ moduleName: item })
              .margin({ top: MARGIN_FONT_SIZE.FIRST_MARGIN })
          }
        }, (item: string) = > JSON.stringify(item))
      }
      .listDirection(Axis.Vertical)
      .margin({ top: MARGIN_FONT_SIZE.THIRD_MARGIN })
    }
    ...
  }
}

構(gòu)建視頻播放界面

VideoPlayer.ets其中定義了視頻播放子組件VideoPlayer ,onPrepared回調(diào)方法中可以獲取視頻總時(shí)長,onUpdate回調(diào)方法中可實(shí)時(shí)獲取到視頻播放的當(dāng)前時(shí)間戳,onFinish是視頻播放結(jié)束后的回調(diào)方法,onError是視頻播放出錯(cuò)的回調(diào)方法。

// VideoPlayer.ets
@Component
export struct VideoPlayer {
  private source: string | Resource = '';
  private controller: VideoController = new VideoController();
  private previewUris: Resource = $r('app.media.preview');
  @Provide currentTime: number = 0;
  @Provide durationTime: number = 0;
  @Provide durationStringTime: string = START_TIME;
  @Provide currentStringTime: string = START_TIME;
  @Consume isPlay: boolean;
  @Consume isOpacity: boolean;
  @Consume flag: boolean;
  @Consume isLoading: boolean;
  @Consume progressVal: number;

  build() {
    Column() {
      Video({
        src: this.source,
        previewUri: this.previewUris,
        controller: this.controller
      })
        .width(ALL_PERCENT)
        .height(STRING_PERCENT.NINETY_PERCENT)
        .controls(false)
        .autoPlay(false)
        .objectFit(ImageFit.Contain)
        .loop(false)
        .onUpdate((event) = > {
          if (event) {
            this.currentTime = event.time;
            this.currentStringTime = changeSliderTime(this.currentTime);
          }
        })
        .onPrepared((event) = > {
          this.prepared(event?.duration);
        })
        .onFinish(() = > {
          this.finish();
        })
        .onError(() = > {
          prompt.showToast({
            duration: COMMON_NUM_DURATION,
            message: MESSAGE
          });
        })
      VideoSlider({ controller: this.controller })
    }
  }
  ...
}

在自定義組件VideoPlayer底部使用了自定義子組件VideoSlider,VideoSlider自定義組件中顯示和控制視頻播放進(jìn)度,效果如圖所示:

// VideoPlaySlider.ets
@Component
export struct VideoSlider {
  @Consume isOpacity: boolean;
  private controller: VideoController = new VideoController();
  @Consume currentStringTime: string;
  @Consume currentTime: number;
  @Consume durationTime: number;
  @Consume durationStringTime: string;
  @Consume isPlay: boolean;
  @Consume flag: boolean;
  @Consume isLoading: boolean;
  @Consume progressVal: number;

  build() {
    Row({ space: MARGIN_FONT_SIZE.FIRST_MARGIN }) {
      ...
      Slider({
        value: this.currentTime,
        min: 0,
        max: this.durationTime,
        step: 1,
        style: SliderStyle.OutSet
      })
        .blockColor($r('app.color.white'))
        .width(STRING_PERCENT.SLIDER_WITH)
        .trackColor(Color.Gray)
        .selectedColor($r("app.color.white"))
        .showSteps(true)
        .showTips(true)
        .trackThickness(this.isOpacity ? SMALL_TRACK_THICK_NESS : BIG_TRACK_THICK_NESS)
        .onChange((value: number, mode: SliderChangeMode) = > {
          this.sliderOnchange(value, mode);
        })
      ...
    }
    .opacity(this.isOpacity ? DEFAULT_OPACITY : 1)
    ...
  }
  ...
}

在VideoController.ets中的視頻控制和回調(diào)的相關(guān)方法。

// VideoControll.ets
export function changeSliderTime(value: number): string {
  let second: number = value % COMMON_NUM_MINUTE;
  let min: number = Number.parseInt((value / COMMON_NUM_MINUTE).toString());
  let head = min < COMMON_NUM_DOUBLE ? `${ZERO_STR}${min}` : min;
  let end = second < COMMON_NUM_DOUBLE ? `${ZERO_STR}${second}` : second;
  let nowTime = `${head}${SPLIT}${end}`;
  return nowTime;
}

在SimpleVideoPlay.ets播放界面,引用VideoPlayer子組件,并在視頻播放頁面使用堆疊容器,在視頻播放畫面中心堆疊控制、視頻加載圖標(biāo),效果如圖所示:

// SimpleVideoPlay.ets
@Entry
@Component
struct Play {
  // 取到Index頁面跳轉(zhuǎn)來時(shí)攜帶的source對應(yīng)的數(shù)據(jù)。
  private source: string = (router.getParams() as Record< string, Object >).source as string;
  private startIconResource: Resource = $r('app.media.ic_public_play');
  private backIconResource: Resource = $r('app.media.ic_back');
  @Provide isPlay: boolean = false;
  @Provide isOpacity: boolean = false;
  controller: VideoController = new VideoController();
  @Provide isLoading: boolean = false;
  @Provide progressVal: number = 0;
  @Provide flag: boolean = false;

  ...
  onPageHide() {
    this.controller.pause();
  }

  build() {
    Column() {
      // 頂部返回以及標(biāo)題
...
      Stack() {
        // 不同的播放狀態(tài)渲染不同得控制圖片
        if (!this.isPlay && !this.isLoading) {
          Image(this.startIconResource)
            .width(MARGIN_FONT_SIZE.FIFTH_MARGIN)
            .height(MARGIN_FONT_SIZE.FIFTH_MARGIN)
            // 同一容器中兄弟組件顯示層級關(guān)系,z值越大,顯示層級越高 用于控制圖片在視頻上。
            .zIndex(STACK_STYLE.IMAGE_Z_INDEX)
        }
        if (this.isLoading) {
          Progress({
            value: STACK_STYLE.PROGRESS_VALUE,
            total: STACK_STYLE.PROGRESS_TOTAL,
            type: ProgressType.ScaleRing
          })
            .color(Color.Grey)
            .value(this.progressVal)
            .width(STACK_STYLE.PROGRESS_WIDTH)
            .style({
              strokeWidth: STACK_STYLE.PROGRESS_STROKE_WIDTH,
              scaleCount: STACK_STYLE.PROGRESS_SCALE_COUNT,
              scaleWidth: STACK_STYLE.PROGRESS_SCALE_WIDTH
            })
            .zIndex(STACK_STYLE.PROGRESS_Z_INDEX)
        }
        VideoPlayer({
          source: this.source,
          controller: this.controller
        })
          .zIndex(0)
      }
    }
    .height(ALL_PERCENT)
    .backgroundColor(Color.Black)
  }
}

sf

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 視頻播放器
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    11856
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2339

    瀏覽量

    42805
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1973

    瀏覽量

    30143
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3713

    瀏覽量

    16254
收藏 人收藏

    評論

    相關(guān)推薦

    在(Linux)ubuntu下通過GTK調(diào)用libvlc開發(fā)視頻播放器

    本項(xiàng)目實(shí)現(xiàn)了一個(gè)基于GTK和libvlc的視頻播放器。使用GTK創(chuàng)建GUI界面,使用libvlc播放視頻。用戶可以通過選擇視頻文件,然后啟動
    的頭像 發(fā)表于 06-01 15:42 ?2089次閱讀
    在(Linux)ubuntu下通過GTK調(diào)用libvlc<b class='flag-5'>開發(fā)</b><b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>

    鴻蒙開發(fā)-視頻播放器方案

    HarmonyOS系統(tǒng)中,提供兩種視頻播放開發(fā)的方案: [AVPlayer]:功能較完善的音視頻播放ArkTS/JS API,集成了流媒體
    發(fā)表于 02-19 17:20

    靈活電影播放器視頻/音頻播放軟件

    東京,2008年4月24日--瑞薩科技公司(Renesas Techno logy Corp.)今天宣布,推出為采用移動電話SH-Mobile*1應(yīng)用處理的嵌入式系統(tǒng)開發(fā)的靈活電影播放器
    發(fā)表于 03-06 19:52

    HarmonyOS應(yīng)用開發(fā)-視頻播放

    HarmonyOS應(yīng)用開發(fā)E2E體驗(yàn),學(xué)到了:如何創(chuàng)建一個(gè)HarmonyOS Demo Project如何構(gòu)建一個(gè)Hap并且將其部署到真機(jī)在HarmonyOS上如何使用
    發(fā)表于 09-11 17:25

    HarmonyOS IoT 硬件開發(fā)案例分享

    ``許思維老師HiSpark Wi-Fi IoT 開發(fā)案例分享:案例一:AHT20溫濕度傳感開發(fā)、調(diào)試;案例二:oled屏驅(qū)動庫移植,調(diào)試;案例三:用OLED屏播放
    發(fā)表于 10-27 17:30

    基于HarmonyOS ets開發(fā)的簡易視頻播放器

    這是我們使用HarmonyOS的codelab簡易視頻播放器的codelab簡易播放器。內(nèi)容就是一個(gè)主視頻界面,包括頂部的
    發(fā)表于 04-18 10:41

    網(wǎng)頁視頻播放器代碼

    網(wǎng)頁視頻播放器代碼
    發(fā)表于 01-10 11:23 ?102次下載
    網(wǎng)頁<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>代碼

    flv視頻播放器代碼

    flv視頻播放器代碼 FlV視頻播放器代碼 代碼如下這里只是介紹幾個(gè)例子,現(xiàn)在把代碼公布一下,大家可以參考著做,也可以把你喜歡的視頻連接
    發(fā)表于 01-10 12:36 ?2057次閱讀

    MP4播放器視頻播放格式有哪些?

    MP4播放器視頻播放格式有哪些?        
    發(fā)表于 12-21 15:51 ?2.4w次閱讀

    LXE播放器

    lxe視頻播放器軟件是免費(fèi)軟件,可以完全免費(fèi)使用、可以自由傳播,exe視頻播放器用于播放屏幕錄像專家錄制的LXE和EXE格式的錄像文件,安裝
    發(fā)表于 11-23 16:14 ?0次下載

    關(guān)于VR電影視頻播放器 盤點(diǎn)12款VR播放器

    VR電影和視頻那個(gè)播放器好,哪些播放器更為實(shí)用,由于視頻資源格式多樣,在一個(gè)播放器播放不了的
    發(fā)表于 06-27 15:50 ?12.6w次閱讀

    數(shù)碼播放器開發(fā)案

    數(shù)碼播放器開發(fā)案例說明。
    發(fā)表于 05-19 11:07 ?6次下載

    HarmonyOS開發(fā)案例:【視頻播放器

    基于video、swiper和slider組件,實(shí)現(xiàn)簡單的視頻播放器,可支持海報(bào)輪播、視頻播放等功能。
    的頭像 發(fā)表于 04-22 21:06 ?459次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發(fā)案</b>例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【音樂播放器

    使用ArkTS語言實(shí)現(xiàn)了一個(gè)簡易的音樂播放器應(yīng)用
    的頭像 發(fā)表于 04-23 15:44 ?994次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發(fā)案</b>例:【音樂<b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【視頻播放器

    使用ArkTS語言實(shí)現(xiàn)視頻播放器,主要包括主頁面和視頻播放頁面
    的頭像 發(fā)表于 04-24 14:52 ?880次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發(fā)案</b>例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】
    主站蜘蛛池模板: 日韩影院久久| 一本二卡三卡四卡乱码麻豆| 18禁无遮遮挡羞漫画免费阅读| 赤兔CHINESE最新男18GUY| 久久精品视频uu| 无修肉动漫在线观看影片 | qvod免费电影| 久久成人a毛片免费观看网站| 天天澡夜夜澡人人澡| chinese耄耋70老太性| 久久国产亚洲精品AV麻豆| 武汉美女洗澡| 成人免费视频一区| 免费看亚洲| 诱人的女邻居9中文观看| 国产偷国产偷亚洲高清人乐享| 青青国产在线观看视频| 18禁三级黄| 久久中文字幕免费视频| 亚洲精品久久99蜜芽尤物TV| 国产成人在线视频播放| 日本边添边摸边做边爱边| 99国产强伦姧在线看RAPE| 久久国产精品高清一区二区三区| 亚州AV人片一区二区三区99久| 动漫美女被h动态图| 欧美一区二区三区激情视频| 2021久久99国产熟女人妻| 久久精品久久精品| 亚洲精品久久久久久偷窥| 国产精品一国产精品免费| 色中色成人论坛| 调教美丽的白丝袜麻麻视频| 欧洲video60| 99日精品欧美国产| 男gv纯肉免费视频| 506070老熟肥妇bbwxx视频| 久久综合狠狠综合狠狠| 中国国产不卡视频在线观看| 久久机热视频 这里只有精品首页| 亚洲人成网站在线播放|