在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于HarmonyOS Player類實現的應用程序——Codelab技術

鴻蒙系統HarmonyOS ? 來源:鴻蒙社區 ? 作者:attitude ? 2021-03-17 15:59 ? 次閱讀

1. 介紹

本篇Codelab將實現的內容

本篇Codelab旨在讓開發者了解手機HarmonyOS應用開發,常用布局、典型控件、FA組件、媒體-視頻、跨設備協同的體驗以及從工程創建到代碼和布局的編寫,再到編譯構建、部署和運行全過程。

您將構建一個基于HarmonyOSPlayer類實現的應用程序,該應用程序功能為播放本地視頻資源或從Internet獲得的視頻資源。效果圖如下:

您將會學到什么

●如何使用Player類播放視頻
●如何使用自定義控件來控制視頻播放
●如何添加并使用媒體事件的事件偵聽器和回調

硬件要求

操作系統:Windows10 64位
●內存:8GB及以上
●硬盤:100GB及以上
●分辨率:1280*800像素及以上

軟件要求

●安裝Huawei DevEco Studio,詳情請參考下載和安裝軟件
●設置Huawei DevEco Studio開發環境,Huawei DevEco Studio開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用,可以根據如下兩種情況來配置開發環境
1.如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作
2.如果網絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發環境

說明

如需要在手機中運行程序,則需要提前申請證書,如使用模擬器可忽略

●生成秘鑰和申請證書,詳情請參考準備簽名文件

技能要求

●具備DevEco Studio中創建、構建和運行應用經驗
●熟悉Ability和AbilitySlice生命周期及使用PA/FA的能力

2. 代碼結構

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們在參考提供下載方式。接下來我們會講解整個工程的代碼結構,如下圖:

●api:視頻播放狀態改變及屏幕狀態變化監聽。
●constant:定義視頻狀態、進度條和控制器狀態。

●factoty:創建SourceFactory類來根據視頻來源創建視頻源。
●manager:創建HmPlayerLifecycle來處理Player類的生命周期。
●view:創建PlayerLoading、SimplePlayerController類分別為視頻加載狀態及進度條控制類文件。
●HmPlayer:封裝播放器的主要功能方法。
●slice:創建MainAbilitySlice、SimplePlayerAbilitySlice分別為進入應用的主程序頁面和視頻播放頁面。
●utils:存放所有封裝好的公共方法,如DateUtils,LogUtils等。
●resources:存放工程使用到的資源文件,其中resourcesaselayout下存放xml布局文件;resourcesasemedia下存放視頻文件。
●config.json:Ability聲明及權限配置。

3. 創建視頻播放業務邏輯

該應用程序可播放的視頻格式包括mp4、mov、3gp、mkv,首先準備一份視頻文件并復制到"resources/base/layout/media"文件目錄。下面將會介紹視頻列表布局及播放邏輯。

創建視頻播放頁面文件及布局

Step 1 -創建simple_video_play_layout.xml布局文件展示視頻列表。

    xmlns:ohos="http://schemas.huawei.com/res/ohos" 
    ohos:id="$+id:parent" 
    ohos:height="match_parent" 
    ohos:width="match_parent"> 
     

該布局文件有兩個id,parent是整個播放頁面的布局id,parent_layout是視頻畫面的布局id。

Step 2- 創建SimplePlayerAbilitySlice類,初次創建該頁面進行初始化。

@Override 
public void onStart(Intent intent) { 
    super.onStart(intent); 
    super.setUIContent(ResourceTable.Layout_simple_video_play_layout); 
    // 在Constants中定義視頻播放的起始位置 
    startMillisecond = intent.getIntParam(Constants.INTENT_STARTTIME_PARAM, 0); 
    // 初始化surface布局 
    initView(); 
    player.getLifecycle().onStart(); 
}

將預置的視頻資源初始化為url對象,并通過initView方法對視頻播放的控件進行初始化及賦值。

private String url = "entry/resources/base/media/gubeishuizhen.mp4"; 
private void initView() { 
    DependentLayout playerLayout = (DependentLayout) findComponentById(ResourceTable.Id_parent_layout); 
    player = new HmPlayer.Builder(this).setStartMillisecond(mStartMillisecond).setFilePath(url).create(); 
    playerLayout.addComponent(player.getPlayerView()); 
    player.play(); 
}

結束

創建HmPlayer

HmPlayer類是繼承自對HarmonyOS Player封裝的ImPlayer。如果您還不了解HarmonyOS Player,請參考視頻播放開發指導。

需要注意的是當頁面初始化Player類執行play方法時,視頻并沒有出現畫面。圖像渲染在屏幕上需要使用SurfaceProvider,該類控制surface的尺寸和格式,修改surface的像素,監視surface的變化等等。當底層顯示系統第一次創建surface之后會調用surfaceCreated(SurfaceOps surfaceOps)回調函數。HmPlayer中通過設置回調增加對視頻的播放開始或停止控制。

private SurfaceOps.Callback surfaceCallback = new SurfaceOps.Callback() { 
    @Override 
    public void surfaceCreated(SurfaceOps surfaceOps) { 
        // 標記surfaceView狀態 
        isSurfaceViewCreated = true; 
        surface = surfaceOps.getSurface(); 
        start(); 
    } 
  
    @Override 
    public void surfaceChanged(SurfaceOps surfaceOps, int i, int width, int height) { 
        LogUtil.info(TAG, "surfaceChanged i is " + i + ",width is " + width + ",height is " + height); 
    } 
  
    @Override 
    public void surfaceDestroyed(SurfaceOps surfaceOps) { 
        LogUtil.info(TAG, "surfaceDestroyed"); 
        isSurfaceViewCreated = false; 
    } 
};

surfaceView的初始化在HmPlayer構造函數中:
private HmPlayer(Builder builder) {

    ... 
    surfaceView = new SurfaceProvider(playerBuilder.mContext); 
    DependentLayout.LayoutConfig layoutConfig = new DependentLayout.LayoutConfig(); 
    layoutConfig.addRule(DependentLayout.LayoutConfig.CENTER_IN_PARENT); 
    // 設置surfaceView布局 
    surfaceView.setLayoutConfig(layoutConfig); 
    surfaceView.setVisibility(Component.VISIBLE); 
    surfaceView.setFocusable(Component.FOCUS_ENABLE); 
    surfaceView.setTouchFocusable(true); 
    surfaceView.requestFocus(); 
    // 設置surfaceView是否在最上方 
    surfaceView.pinToZTop(playerBuilder.isTopPlay); 
    surfaceView.getSurfaceOps().get().addCallback(surfaceCallback); 
}

在執行surfaceCreated回調時會執行HarmonyOS中Player的play方法。

private void start() { 
    if (isSurfaceViewCreated) { 
        threadPoolExecutor.execute(() -> { 
            player.setVideoSurface(surface); 
            player.prepare(); 
            if (playerBuilder.startMillisecond > 0) { 
                int microsecond = playerBuilder.startMillisecond * MICRO_MILLI_RATE; 
                player.rewindTo(microsecond); 
            } else { 
                player.play(); 
            } 
        }); 
    } 
}

編譯運行該應用程序

應用啟動后,視頻文件將被打開并開始播放,持續播放到最后。效果如下圖:

4. 創建視頻控制業務邏輯

上面的章節實現了視頻播放的基本功能,本小節將創建一個控制器,包含基本的媒體控制UI元素如播放、暫停、恢復、重新加載按鈕以及進度條。該控制器將與HmPlayer類一起提供一個基本功能全面且可操作的視頻播放器。

創建SimpleVideoPlayerController

SimplePlayerController類為自定義組件,包括控制視頻的播放、暫停、恢復以及進度條等控件。此處使用HarmonyOS EventHandler來進行UI更新,請參考HarmonyOS開發者文檔線程間通信

public SimplePlayerController(Context context, ImplPlayer player) { 
    super(context); 
    this.context = context; 
    implPlayer = player; 
    // 創建子線程給自己發消息來及時更新UI 
    createHandler(); 
    initView(); 
    initListener(); 
}

其中initView方法初始化播放控制的控件。

Component playerController = LayoutScatter.getInstance(context).parse( 
        ResourceTable.Layout_simple_player_controller_layout, null, false); 
addComponent(playerController); 
if (playerController.findComponentById(ResourceTable.Id_play_controller) instanceof Image) { 
    // 播放或者暫停按鈕 
    playToogle = (Image) playerController.findComponentById(ResourceTable.Id_play_controller); 
} 
if (playerController.findComponentById(ResourceTable.Id_play_forward) instanceof Image) { 
    // 前進按鈕 
    imageForward = (Image) playerController.findComponentById(ResourceTable.Id_play_forward); 
} 
if (playerController.findComponentById(ResourceTable.Id_play_backward) instanceof Image) { 
    // 后退按鈕 
    imageBackward = (Image) playerController.findComponentById(ResourceTable.Id_play_backward); 
} 
if (playerController.findComponentById(ResourceTable.Id_progress) instanceof Slider) { 
    // 進度條 
    progressBar = (Slider) playerController.findComponentById(ResourceTable.Id_progress); 
}

initListener方法是對HmPlayer和播放控制器相互之間狀態變化的監聽處理。

implPlayer.addPlayerStatusCallback(statusChangeListener);

添加HmPlayer狀態變化的監聽,例如當視頻播放完畢時,回調StatusChangeListener的statusCallback來刷新對控制器中各種組件的狀態和顯示值。HmPlayer中HmPlayerCallback中通過底層播放回調onPlayBackComplete來對界面視頻狀態進行更改。

@Override

public void onPlayBackComplete() { 
    for (StatusChangeListener callback : statusChangeCallbacks) { 
        status = PlayerStatus.COMPLETE; 
        callback.statusCallback(PlayerStatus.COMPLETE); 
    } 
    stop(); 
}

在SimplePlayerController的statusCallback中更新控制按鈕狀態。

if (status == PlayerStatus.STOP || status == PlayerStatus.COMPLETE) {

    controllerHandler.sendEvent(Constants.PLAYER_PROGRESS_RUNNING, EventHandler.Priority.IMMEDIATE); 
    playToogle.setPixelMap(ResourceTable.Media_ic_update); 
    progressBar.setEnabled(false); 
}

此時播放按鈕更新成待刷新圖標,進度條不可拖拽。

創建PlayerLoading

在視頻畫面緩沖沒有完成時,播放界面如果提供加載進度信息,用戶體驗更好。創建的PlayerLoading類設置一個布局并且添加StatusChangeListener監聽回調,使得該控件可以根據狀態顯示或隱藏。

public PlayerLoading(Context context, ImplPlayer player) {

    super(context); 
    this.player = player; 
    initView(context); 
    initListener(); 
} 
private void initListener() { 
    player.addPlayerStatusCallback(new StatusChangeListener() { 
        @Override 
        public void statusCallback(PlayerStatus status) { 
            //獲取主線程更新UI 
            mContext.getUITaskDispatcher().delayDispatch( 
                    new Runnable() { 
                        @Override 
                        public void run() { 
                            if (status == PlayerStatus.PREPARING || status == PlayerStatus.BUFFERING) { 
                                show(); 
                            } else if (status == PlayerStatus.PLAY) { 
                                hide(); 
                            } else { 
                                LogUtil.info(PlayerLoading.class.getName(), "statuCallback else message"); 
                            } 
                        } 
                    }, 0); 
        } 
    }); 
}

編譯運行該應用程序

經過上面的步驟,此時運行程序就可以看到一個有前進、后退、播放、暫停的界面,用戶可以自主控制該視頻播放,效果如下圖:


編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30577
收藏 人收藏

    評論

    相關推薦

    HarmonyOS應用開發-視頻播放

    一、介紹本篇Codelab實現的內容HarmonyOS是面向全場景多終端的分布式操作系統,使得應用程序的開發打破了智能終端互通的性能和數據壁壘,業務邏輯原子化開發,適配多端。通過一個
    發表于 09-11 17:25

    HarmonyOS應用開發-元程序交互

    1. 介紹本篇CodeLab實現的內容HarmonyOS是面向全場景多終端的分布式操作系統,使得應用程序的開發打破了智能終端互通的性能和數據壁壘,業務邏輯原子化開發,適配多端。通過一
    發表于 09-21 15:23

    應用程序開發

    應用程序開發不少開發者還針對AI Camera、手表做一些應用和前端展示,這里給到的應用程序開發資料可能有所幫助,主要內容有:鴻蒙OS應用程序開發HarmonyOS開發文檔(一)
    發表于 11-24 11:58

    【線上】華為 HarmonyOS Codelab 挑戰賽,你過關來我發獎【第二期】

    禮品與勛章。 4月16日~4月21日,新一輪福利又?叒來啦!挑戰賽Round②正式開啟,無論你是技術大佬還是入門小白,完成三步,即可參與抽獎領取HarmonyOS限量精美禮品。三步完成挑戰第一步 下載
    發表于 04-16 09:50

    【基于HarmonyOS開發購物應用】SetllatWood Codelab第二期記錄帖

    【基于HarmonyOS開發購物應用】SetllatWood Codelab第二期記錄帖圖片在附件
    發表于 04-21 14:44

    HarmonyOS技術社區HDD期間Codelab活動獲獎人名單公布

    HDD期間,HarmonyOS技術社區舉辦了2期的Codelab活動,主題分別有:第一期1、HarmonyOS JAVA通用組件(模塊-Java 布局)2、基于圖像模塊
    發表于 04-22 10:02

    基于HarmonyOS Player實現音頻的播放、管理控制和采集

    收集和系統音量控制的用法。本篇Codelab實現的內容您將構建一個應用程序實現以下內容:基于HarmonyOS
    發表于 09-16 15:07

    基于HarmonyOS Player實現視頻文件的播放

    和布局的編寫,再到編譯構建、部署和運行全過程。您將構建一個基于HarmonyOS Player實現應用程序,該
    發表于 09-18 13:51

    使用JS實現一款簡單的HarmonyOS購物應用

    1. 介紹本篇Codelab將會使用UI組件開發出一個HarmonyOS購物應用。HarmonyOS為開發者提供了多種組件,每個組件通過對數據和方法的簡單封裝,實現獨立的可視、可交互功
    發表于 09-23 10:40

    VC++程序開發范例寶典MP3Player

    VC++程序開發范例寶典MP3Player
    發表于 09-06 16:42 ?2次下載

    HarmonyOS Codelabs軟件應用視頻操作指南

    HarmonyOS 是面向全場景多終端的分布式操作系統,使得應用程序的開發打破了智能終 端互通的性能和數據壁壘,業務邏輯原子化開發,適配多端。通過一個簡單應用開發,體 驗 HarmonyOS
    發表于 10-14 14:24 ?0次下載
    <b class='flag-5'>HarmonyOS</b> Codelabs軟件應用視頻操作指南

    HarmonyOS應用程序Ability的作用

    什么是Ability Ability意為能力,是HarmonyOS應用程序提供的抽象功能。在Android應用程序中,Activity是整個應用程序的核心,其意為活動。無論是活動還是能
    的頭像 發表于 03-17 15:46 ?2599次閱讀

    華為開發者分論壇HarmonyOS學生公開課-照著做Codelab操作步驟

    2021華為開發者分論壇HarmonyOS學生公開課-照著做Codelab操作步驟
    的頭像 發表于 10-24 09:53 ?1734次閱讀
    華為開發者分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-照著做<b class='flag-5'>Codelab</b>操作步驟

    華為開發者分論壇HarmonyOS學生公開課-基于開發樣例Codelab進行改裝

    2021華為開發者分論壇HarmonyOS學生公開課-基于開發樣例Codelab進行改裝 推薦鏈接:http://t.elecfans.com/live/1713.html 責任編輯:pj
    的頭像 發表于 10-24 09:56 ?1406次閱讀
    華為開發者分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-基于開發樣例<b class='flag-5'>Codelab</b>進行改裝

    泰凌微電子| OpenThread組Telink Codelab正式上線

    。而通過Telink Codelab,開發人員可以更輕松地集成OpenThread到其應用程序中,從而實現與泰
    的頭像 發表于 08-17 08:40 ?873次閱讀
    泰凌微電子| OpenThread組Telink <b class='flag-5'>Codelab</b>正式上線
    主站蜘蛛池模板: 伊人五月婷婷 | 国产成人小视频 | 美女张开大腿让男人捅 | 亚洲啪啪网站 | 日本美女黄色一级片 | 四虎永久在线免费观看 | 午夜视频在线看 | 手机在线看片国产 | 欧美日韩色综合网站 | 香蕉成人999视频 | 午夜久久久久久亚洲国产精品 | 国产亚洲视频在线 | 97就要鲁就要鲁夜夜爽 | 午夜精品区 | ww免费视频 | videossexotv极度另类高清 | 午夜小视频免费观看 | 亚洲综合校园春色 | 午夜精品免费 | 1024手机在线观看你懂的 | 日日夜夜狠狠 | 成人中文字幕一区二区三区 | 手机福利在线观看 | 久久久免费视频播放 | 亚洲欧美4444kkkk| 日韩精品一级毛片 | 欧美性猛交xxxx免费看久久 | 婷婷射 | 黄色录像日本 | 午夜精品久久久久久久 | 亚洲1卡二卡3卡四卡不卡 | 91大神在线免费观看 | 色y情视频免费看 | 中国胖女人一级毛片aaaaa | 国产伦子一区二区三区四区 | 色婷婷视频在线观看 | 午夜精品在线观看 | 日韩毛片免费线上观看 | 国产美女动态免费视频 | 亚洲午夜久久影院 | 天天爽夜夜爽一区二区三区 |