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

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

3天內不再提示

HarmonyOS開發案例:【音樂播放器】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-23 15:44 ? 次閱讀

介紹

使用ArkTS語言實現了一個簡易的音樂播放器應用,主要包含以下功能:

  1. 播放應用中的音頻資源文件,并可進行上一曲、下一曲、播放、暫停、切換播放模式(順序播放、單曲循環、隨機播放)等操作。
  2. 結合后臺任務管理模塊,實現熄屏后繼續播放音頻。

相關概念

  • [AVPlayer]:AVPlayer主要工作是將Audio/Video媒體資源轉碼為可供渲染的圖像和可聽見的音頻模擬信號,并通過輸出設備進行播放,同時對播放任務進行管理,包括開始播放、暫停播放、停止播放、釋放資源、設置音量、跳轉播放位置、獲取軌道信息等功能控制。
  • [后臺任務管理]:針對應用或業務模塊處于后臺(無可見界面)時,有需要繼續執行或者后續執行的業務,可基于業務類型,申請短時任務延遲掛起或者長時任務避免進入掛起狀態;如后臺播放音樂可使用長時任務避免進入掛起狀態。
  • 鴻蒙開發指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

約束與限制

  1. 本篇Codelab部分能力依賴于系統API,需下載full-SDK并替換DevEco Studio自動下載的public-SDK。具體操作可參考指南[《如何替換full-SDK》]。
  2. 本篇Codelab使用的部分API僅系統應用可用,需要提升應用等級。

環境搭建

軟件要求

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

硬件要求

  • 開發板類型:[潤和RK3568開發板]。
  • OpenHarmony系統:3.2 Release。

環境搭建

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:

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

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

代碼結構解讀

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

├──entry/src/main/ets               // 代碼區
│  ├──common              
│  │  ├──constants                   
│  │  │  └──CommonConstants.ets     // 公共常量
│  │  ├──model                   
│  │  │  └──PlayBarModel            // 播放欄數據模型
│  │  └──utils
│  │     ├──AvSessionUtil.ets  	    // 媒體會話工具類	
│  │     ├──BackgroundTaskUtil.ets  // 后臺任務工具類
│  │     ├──CommonUtil.ets  	    // 公共工具類	
│  │     ├──GlobalContext.ets  	    // 公共工具類	
│  │     ├──Logger.ets              // 日志類          
│  │     └──ResourceManagerUtil.ets // 資源管理工具類
│  ├──controller           
│  │  ├──AudioPlayerController.ets  // 音樂播放器控制器
│  │  └──PlayBarController.ets      // 播放欄控制器
│  ├──entryability                    
│  │  └──EntryAbility.ets           // 程序入口類
│  ├──pages                          
│  │  ├──AudioStartUp.ets           // 啟動頁
│  │  ├──MusicList.ets              // 歌單頁
│  │  └──Play.ets                   // 播放頁
│  ├──view                         
│  │  ├──MusicCardView.ets          // 播放卡片模塊
│  │  ├──MusicView.ets              // 歌單音樂模塊
│  │  ├──PlayBarView.ets            // 播放控制模塊
│  │  ├──PlayListDialogView.ets     // 彈窗模塊
│  │  ├──PlayListMusicView.ets      // 彈窗音樂模塊
│  │  └──ProgressView.ets           // 播放頁
│  └──viewmodel  
│     ├──MusicItem.ets              // 音樂類
│     └──MusicViewModel.ets         // 歌單音樂模型
└──entry/src/main/resources         // 應用資源目錄

實現音頻播放

本案例使用播放管理類AVPlayer,實現應用內音頻資源的播放,并可進行上一曲、下一曲、播放、暫停、切換播放模式(順序播放、單曲循環、隨機播放)等操作。

使用AVPlayer播放器,需要先創建一個AVPlayer實例。在AudioPlayerController中使用createAVPlayer方法完成音頻播放實例的創建。

// AudioPlayerController.ets
initAudioPlayer() {
  media.createAVPlayer((error, video) = > {
    if (video === undefined) {
      this.avPlayer = video;
      Logger.error(TAG, `createAVPlayer fail, error: ${error}`);
    } else {
      this.avPlayer = video;
      Logger.info(TAG, 'createAVPlayer success');
    }
  });
}

根據業務需要設置監聽事件,搭配播放場景使用。

// AudioPlayerController.ets
// 注冊AVPlayer回調函數
setEventCallBack() {
  ...
  // 狀態變更回調函數。
  this.avPlayer.on('stateChange', async (state) = > {
    ...
    switch (state) {
      case StateEvent.IDLE: // 調用reset成功后觸發此狀態。
        ...
      case StateEvent.INITIALIZED: // 設置播放源觸發此狀態。
        ...
      case StateEvent.PREPARED:
        ...
      case StateEvent.PLAYING:
        ...
      case StateEvent.COMPLETED:
        ...
      default:
        Logger.error('unknown state: ' + state);
        break;
    }
  })
}

設置音頻資源,AVPlayer進入initialized狀態。在initialized狀態回調中,調用prepare方法,準備播放,AVPlayer進入prepared狀態。

// AudioPlayerController.ets
async play(src: media.AVFileDescriptor, seekTo: number) {
  Logger.info(TAG, 'audioPlayer play');
  ...
  // 設置播放源
  this.avPlayer.fdSrc = src;
}

setEventCallBack() {
  ...
  this.avPlayer.on('stateChange', async (state) = > {
    ...
    switch (state) {
      ...
      case StateEvent.INITIALIZED:// 設置播放源后進入initialized狀態
        Logger.info(TAG, 'state initialized called');
        this.avPlayerState = PlayerState.INITIALIZED;
        this.avPlayer.prepare().then(() = > {
          Logger.info(TAG, 'prepare success');
        }, (err) = > {
          Logger.error(TAG, `prepare failed,error message is: ${err.message}`);
        })
        break;
      ...
    }
  })
}

AVPlayer進入prepared狀態,可進行音頻播控操作。包括播放play()、跳轉至指定位置播放seek()、暫停pause()、停止stop()等操作。

// AudioPlayerController.ets
setEventCallBack() {
  ...
  this.avPlayer.on('stateChange', async (state) = > {
    ...
    switch (state) {
      ...
      case StateEvent.PREPARED:
        Logger.info(TAG, 'state prepared called');
        this.avPlayer.play();
        break;
      ...
    }
  })
}

切換歌曲播放時,需調用reset()重置資源。此時AVPlayer重新進入idle狀態,允許更換資源。

// AudioPlayerController.ets
async play(src: media.AVFileDescriptor, seekTo: number) {
  ...
  if (this.avPlayerState === PlayerState.INITIALIZED) {
    await this.avPlayer.reset();
    Logger.info(TAG, 'play reset success');
  }
  ...
}

說明: 只能在initialized/prepared/playing/paused/complete/stopped/error狀態調用reset()。

調用release()銷毀實例,AVPlayer進入released狀態,退出播放。

// AudioPlayerController.ets
async release() {
  Logger.info(TAG, 'audioPlayer release');
  if (typeof (this.avPlayer) !== 'undefined') {
    if (this.timeId === CommonConstants.DEFAULT_TIME_ID) {
      clearInterval(this.timeId);
    }
    await this.avPlayer.release();
    this.avPlayer = undefined;
  }
}

實現熄屏后播放

通過后臺任務管理模塊申請長時任務,可避免設備熄屏后,應用進入掛起狀態。

首先在module.json5文件中配置長時任務權限和后臺模式類型。

"module": {
  ...
  "abilities": [
    {
      ...
      "backgroundModes": [
        "audioPlayback"
      ],
      ...
    }
  ],
  "requestPermissions": [
    {
      "name": "ohos.permission.KEEP_BACKGROUND_RUNNING"
    }
  ],
}

在播放音樂時,申請長時任務。這樣在應用切換至后臺或設備熄屏后,仍可以繼續播放音樂。

// BackgroundTaskUtil.ets
import wantAgent from '@ohos.app.ability.wantAgent';
import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager';
...
export class BackgroundTaskUtil {
  ...
  public static startContinuousTask(context: Context) {
    if (context === undefined) {
      Logger.info(TAG, 'startContinuousTask fail,context is empty.');
      return;
    }
    let wantAgentInfo = {
      // 點擊通知后需要執行的動作
      wants: [
        {
          bundleName: CommonConstants.BUNDLE_NAME,
          abilityName: CommonConstants.ABILITY_NAME
        }
      ],
      // 單擊通知后的動作類型
      operationType: wantAgent.OperationType.START_ABILITY,
      // 用戶定義的私有屬性
      requestCode: CommonConstants.BACKGROUND_REQUEST_CODE
    } as wantAgent.WantAgentInfo;

    // 通過WanAgent模塊的方法獲取WanAgent對象
    wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) = > {
      try {
        backgroundTaskManager.startBackgroundRunning(context, backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,
          wantAgentObj).then(() = > {
          Logger.info(TAG, 'startBackgroundRunning succeeded');
        }).catch((err: Error) = > {
          Logger.error(TAG, 'startBackgroundRunning failed, Cause: ' + JSON.stringify(err));
        });
      } catch (error) {
        Logger.error(TAG, `startBackgroundRunning failed. code is ${error.code} message is ${error.message}`);
      }
    });
  }
  ...
}

暫停音樂播放,結束長時任務。

// BackgroundTaskUtil.ets
import wantAgent from '@ohos.app.ability.wantAgent';
import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager';
...
export class BackgroundTaskUtil {
  ...
  public static stopContinuousTask(context: Context) {
    if (context === undefined) {
      Logger.info(TAG, 'stopContinuousTask fail,context is empty.');
      return;
    }
    try {
      backgroundTaskManager.stopBackgroundRunning(context).then(() = > {
        Logger.info(TAG, 'stopBackgroundRunning succeeded');
      }).catch((err: Error) = > {
        Logger.error(TAG, 'stopBackgroundRunning failed Cause: ' + JSON.stringify(err));
      });
    } catch (error) {
      Logger.error(TAG, `stopBackgroundRunning failed. code is ${error.code} message is ${error.message}`);
    }
  }
}

審核編輯 黃宇

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

    關注

    55

    文章

    1966

    瀏覽量

    42222
  • HarmonyOS
    +關注

    關注

    79

    文章

    1910

    瀏覽量

    29497
  • OpenHarmony
    +關注

    關注

    24

    文章

    3443

    瀏覽量

    15331
收藏 人收藏

    評論

    相關推薦

    基于labview的音樂播放器(可用)

    相關課程推薦:《8周LabVIEW視覺項目編程實戰特訓營》 用LabVIEW聲音控件做的音樂播放器,做的比較簡單,用的方法也比較笨,如圖所示。有暫停、調節音量、進度條、偽旋律圖等,不過受控件限制
    發表于 11-24 15:36

    如果我的諾基亞設備在音樂播放器 (或多媒體播放器) 中未能

    如果我的諾基亞設備在音樂播放器 (或多媒體播放器) 中未能顯示新的音樂文件,該怎么辦?刷新或更新音樂庫。打開
    發表于 01-23 17:40

    音樂播放器

    音樂播放器,播放和暫停
    發表于 05-28 17:30

    做一個音樂播放器

    大家集思廣益,做一個音樂播放器,要求能播放多種格式的音樂文件具有選擇播放文件的功能,聲音大小可調能錄音,并能回放,任意設置
    發表于 07-01 11:12

    基于STM32無線音樂播放器

    這是基于STM32VET6的用51單片機控制播放音樂播放器
    發表于 07-06 12:06

    求助,誰有基于labview的音樂播放器

    誰有基于labview的音樂播放器,能實現顯示當前音樂名,播放列表,音量調節,切歌,順序、循環播放
    發表于 01-06 15:00

    音樂播放器制作手冊

    音樂播放器
    發表于 01-17 21:40

    基于戰艦板的遙控音樂播放器

    2012年買的戰艦板,有較長時間放著吃灰覺得很可惜。感覺戰艦板的音樂播放器音質蠻不錯的,于是想就折騰一個遙控音樂播放器。貌似很簡單的事,實際上我折騰一個星期的時間才達到理想效果。思路:
    發表于 07-01 04:35

    網頁音樂播放器代碼

    網頁音樂播放器代碼:有MP3的,有Windows Media Player音樂播放器代碼的,也有視頻的,
    發表于 01-10 11:18 ?86次下載

    Windows Media Player音樂播放器代碼

    Windows Media Player音樂播放器代碼 一、Windows Media Player音樂播放器代碼:
    發表于 01-10 11:14 ?2222次閱讀

    基于Android音樂播放器的研究

    Android平臺是目前智能移動終端的主流系統。隨著人們生活、工作節奏的加快,乘車、運動、學習等碎片時間的增多,音樂播放器成為人們所關心的必備應用之一,廣受大家歡迎。 目前,Android市場上
    發表于 12-11 11:44 ?7次下載
    基于Android<b class='flag-5'>音樂</b><b class='flag-5'>播放器</b>的研究

    數碼播放器開發案

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

    HarmonyOS開發案例:【視頻播放器

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

    HarmonyOS開發案例:【視頻播放器

    使用ArkTS語言實現視頻播放器,主要包括主界面和視頻播放界面,
    的頭像 發表于 04-23 17:25 ?276次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發案</b>例:【視頻<b class='flag-5'>播放器</b>】

    HarmonyOS開發案例:【視頻播放器

    使用ArkTS語言實現視頻播放器,主要包括主頁面和視頻播放頁面
    的頭像 發表于 04-24 14:52 ?307次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發案</b>例:【視頻<b class='flag-5'>播放器</b>】
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>