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

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}`);
    }
  }
}

審核編輯 黃宇

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

    關注

    57

    文章

    2339

    瀏覽量

    42805
  • HarmonyOS
    +關注

    關注

    79

    文章

    1973

    瀏覽量

    30143
  • OpenHarmony
    +關注

    關注

    25

    文章

    3713

    瀏覽量

    16255
收藏 人收藏

    評論

    相關推薦

    基于RTT-LVGL的音樂播放器設計案例

    此次項目主要是基于瑞薩HMI board 開發板實現音樂播放器功能,主要可以實現sd卡wav 文件掃描,音樂播放,音量調節、上一曲、下一曲
    的頭像 發表于 09-18 11:07 ?2225次閱讀
    基于RTT-LVGL的<b class='flag-5'>音樂</b><b class='flag-5'>播放器</b>設計案例

    音樂播放器

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

    網頁音樂播放器代碼

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

    Windows Media Player音樂播放器代碼

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

    rm格式音樂播放器代碼

      rm格式音樂播放器代碼
    發表于 01-10 11:15 ?1259次閱讀

    基于單片機的音樂播放器

    基于單片機的音樂播放器,內容包含程序代碼和電路proteus仿真。
    發表于 03-10 11:14 ?35次下載

    音樂播放器

    音樂播放器,比較簡單。能實現基本的播放停止暫停等功能。喜歡研究可以改進
    發表于 09-09 17:32 ?38次下載

    基于單片機音樂播放器

    本單片機音樂播放器適合初學者
    發表于 08-10 17:16 ?19次下載

    基于Android音樂播放器的研究

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

    數碼播放器開發案

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

    基于Labview制作的音樂播放器源碼分享

    基于Labview制作的音樂播放器源碼分享
    發表于 12-01 10:07 ?70次下載

    基于Arduino的音樂播放器設計

    厭倦了呆板的音響設備,那就動手制作一個音樂播放器吧。本項目可播放WAV格式音樂,用戶只需簡單的接線和焊接技能即可完成制作。
    發表于 03-25 11:27 ?6146次閱讀
    基于Arduino的<b class='flag-5'>音樂</b><b class='flag-5'>播放器</b>設計

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

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

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

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

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

    使用ArkTS語言實現視頻播放器,主要包括主頁面和視頻播放頁面
    的頭像 發表于 04-24 14:52 ?881次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發案</b>例:【視頻<b class='flag-5'>播放器</b>】
    主站蜘蛛池模板: 97精品在线播放| 中文字幕不卡在线高清| 综合伊人久久| 动态抽插图视频| 精品久久久99大香线蕉| 欧美另类jizzhd| 亚洲AV永久无码精品老司机蜜桃| 中文字幕不卡在线高清| 国产精品18久久久久网站| 久久亚洲精品成人| 神马伦理2019影院不卡片| 在线亚洲中文字幕36页| 国产VA精品午夜福利视频| 绿巨人www在线观看| 三级电影免费看| 自拍黄色片| 国产私拍福利精品视频| 欧美视频精品一区二区三区| 亚洲免费网站在线观看| 成人免费一级毛片在线播放视频| 娇妻玩4P被三个男人伺候电影| 日本精品无码久久久久APP| 在线观看免费毛片| 国产精品一区二区激情| 男同志在线观看| 一本道高清无码v| 国产扒开美女双腿屁股流白浆| 免费99精品国产自在现线| 亚洲精品成人AV在线观看爽翻| Zoofilivideo人馿交| 久久免费特黄毛片| 午夜射精日本三级| xxx性欧美在线| 伦理片免费秋霞e| 亚洲免费中文| 国产精品爆乳尤物99精品| 欧美视频 亚洲视频| 69国产精品成人无码视频| 精品高潮呻吟99AV无码| 乌克兰少妇大胆大BBW| 成人高清网站|