HarmonyOS NEXT AudioDemo(音频开发示例)

56 阅读1分钟

1.MediaPlayer.ets

/**
 *作者:lgf
 *时间:2025/6/11 14:32
 *功能:音乐播放
 **/
import { media } from "@kit.MediaKit";
import { BusinessError } from "@kit.BasicServicesKit";
import { promptAction } from "@kit.ArkUI";

export class MediaPlayer {
  private player: media.AVPlayer
  private source: media.AVFileDescriptor | string
  private state: media.AVPlayerState = 'idle'

  constructor(player: media.AVPlayer, source: media.AVFileDescriptor | string) {
    // 创建出来player
    this.player = player;
    // 设置监听
    this.setListener()
    this.source = source;
    // 设置播放资源
    if (typeof source == 'string') {
      this.player.url = source
    } else {
      this.player.fdSrc = source
    }
  }

  // 设置监听
  private setListener() {
    // 播放错误
    this.player.on('error', (err: BusinessError) => {
      console.error('gxxt play err: ', err.message)
    })
    // 播放完毕
    this.player.on("endOfStream", () => {
      console.log('gxxt play 完毕')
    })
    this.player.on("stateChange", (state, reason) => {
      // 更新当前状态
      this.state = state
      switch (state) {
        case 'idle':
          console.log('gxxt play 刚创建')
          break;
        case 'initialized':
          console.log('gxxt play 初始化好了播放资源')
          this.player.prepare()
          break;
        case 'prepared':
          console.log('gxxt  play 准备好的状态')
          break;
        case 'playing':
          console.log('gxxt play 播放中状态')
          break;
        case 'paused':
          console.log('gxxt play 暂停的状态')
          break;
        case 'stopped':
          console.log('gxxt play 停止的状态')
          break;
        case 'released':
          console.log('gxxt play 释放资源')
          break;
      }
    })
  }

  play() {
    // 如果当前状态是准备态或者暂停可以直接播放  否则先准备
    if (this.state == 'prepared' || this.state == 'paused') {
      this.player.play()
    } else if (this.state == 'stopped') {
      this.player.prepare(() => {
        // 停止状态进来的 要先准备 再开始播放
        this.player.play()
      })
    }
  }

  pause() {
    // 只有是播放状态才能暂停
    if (this.state == 'playing') {
      this.player.pause()
    } else {
      promptAction.showToast({ message: '当前状态不支持暂停' })
    }
  }
  // 停止播放
  stop() {
    this.player.stop()
  }
  //释放资源
  release() {
    this.player.release()
  }

  seekto(time: number) {
    // 滑动播放时间
    if (time < this.player.duration) {
      this.player.seek(time)
    }
  }
}

2.Index.ets

import media from '@ohos.multimedia.media';
import {MediaPlayer} from '../common/MediaPlayer'

@Entry
@Component
struct Index {
  private player: MediaPlayer | undefined; //
  async aboutToAppear(): Promise<void> {
    //   创建播放器
    let avplayer = await media.createAVPlayer()
    // 获取test.mp3的文件描述符
    let filedes = getContext(this).resourceManager.getRawFdSync('moon.mp3')
    // 创建播放资源
    let source: media.AVFileDescriptor = { offset: filedes.offset, fd: filedes.fd, length: filedes.length }
    this.player = new MediaPlayer(avplayer, source)
  }
  aboutToDisappear(): void {
    this.player?.release()
  }
  build() {
    Row() {
      Column() {
        Button('播放')
          .width('60%')
          .margin(20)
          .onClick(() => {
            this.player?.play()
          })
        Button('暂停')
          .width('60%')
          .margin(20)
          .onClick(() => {
            this.player?.pause()
          })
        Button('停止')
          .width('60%')
          .margin(20)
          .onClick(() => {
            this.player?.stop()
          })

      }
      .height('100%')
      .width('100%')
    }
  }
}