HarmonyOS鸿蒙Next中如何让应用播放本地的音频文件

HarmonyOS鸿蒙Next中如何让应用播放本地的音频文件

现在想写一个音频播放器的应用,但是在上传文件和打开文件这里不知道怎么写了,跪求大佬帮忙看一眼,救救孩子吧~

export async function audioPlayerDemo() {
  // 1. 创建实例
  let audioPlayer = media.createAudioPlayer();
  setCallBack(audioPlayer); // 设置事件回调
  // 2. 用户选择音频,设置uri
  let fdPath = 'fd://'
  // path路径的码流可通过"hdc file send D:\OHOSProjects\MusicPlayer_API9_eTS_Stage\entry\src\main\ets\pages\PlayBulk\New_Soul.mp3 /data/app/el2/100/base/com.example.musicplayer/haps/entry/files" 命令,将其推送到设备上
  let path = '/data/storage/el2/base/haps/entry/files/New_Soul.mp3';      
  await fileIO.open(path).then((fdNumber) => {
    console.info('Leeg : Open Begin')
    fdPath = fdPath + '' + fdNumber;
    console.info('Leeg : open fd success fd is' + fdPath);
  }, (err) => {
    console.info('Leeg : open fd failed err is' + err);
  }).catch((err) => {
    console.info('Leeg : open fd failed err is' + err);
  });
  audioPlayer.src = fdPath; // 设置src属性,并触发'dataLoad'事件回调
}

现在的问题是在打开文件的时候报错

11-07 16:12:21.513 27168-4978/? I 0FEFE/JsApp: Leeg : /data/storage/el2/base/haps/entry/cache
11-07 16:12:21.513 27168-4978/? I 0FEFE/JsApp: Leeg : /data/storage/el2/base/haps/entry/files
11-07 16:12:31.280 27168-4978/com.example.musicplayer I 0FEFE/JsApp: Leeg : open fd failed err isError: No such file or directory
11-07 16:12:31.280 27168-4978/com.example.musicplayer I 0FEFE/JsApp: Leeg : audio error called, errName is BusinessError
11-07 16:12:31.280 27168-4978/com.example.musicplayer I 0FEFE/JsApp: Leeg : audio error called, errCode is 3
11-07 16:12:31.280 27168-4978/com.example.musicplayer I 0FEFE/JsApp: Leeg : audio error called, errMessage is invalid parameters, please check the input parameters

更多关于HarmonyOS鸿蒙Next中如何让应用播放本地的音频文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

15 回复

新建一楼来回复这个问题吧。

看了代码和日志,问题根因不是权限问题,而是路径问题。fileio.open()中传入的路径需是沙箱路径,非沙箱路径,系统是找不到或者是没有操作权限的。附上资源文件的真实路径和沙箱路径的对应关系图,其中沙箱路径中bundle是应用的hap包所在目录,即应用的代码和资源文件都在该目录下。

4.PNG

更多关于HarmonyOS鸿蒙Next中如何让应用播放本地的音频文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我去试下,

你好,借个楼,我想问一下,我将音频文件放在了本地的rawfile文件夹下,要怎么设置成音频url所支持的格式呢

/*

  • 以下为自定义的播放及暂停方法 “./PlayInsance”
  • */

export function audio_On_Play(audioPlayer) { audioPlayer.on(‘dataLoad’, () => { // 设置’dataLoad’事件回调,src属性设置成功后,触发此回调 audioPlayer.play(); // 需等待’dataLoad’事件回调完成后,才可调用play进行播放,触发’play’事件回调 console.info(‘Leeg : audio set source success’); }); }

export function audio_On_Pause(audioPlayer) { audioPlayer.pause(); // 触发’pause’事件回调,暂停播放 console.info(‘pause : audio pause success’); }

export function audio_On_Continue(audioPlayer) { audioPlayer.play(); // 触发’play’事件回调,继续播放 console.info(‘play : audio play success’); }

export function audio_On_Stop(audioPlayer) { audioPlayer.on(‘stop’, () => { // 设置’play’事件回调 audioPlayer.stop(); // 触发’stop’事件回调,暂停播放 console.info(‘Leeg : audio stop success’); }); }

附音频播放的完整代码

import media from '@ohos.multimedia.media'
import fileIO from '@ohos.fileio'
/*
 *  从播放方法中导入播放、暂定、继续、停止方法
 * */
import { audio_On_Play, audio_On_Pause, audio_On_Continue, audio_On_Stop } from "./PlayInsance"

/*
 *  创建播放器实例,设置audio的播放路径
 * */
// 1. 创建实例
let audioPlayer = media.createAudioPlayer();
// 2. 用户选择音频,设置uri
let fdPath = 'fd://'
// path路径的码流可通过"hdc file send D:\OHOSProjects\MusicPlayer_API9_eTS_Stage\entry\src\main\ets\pages\PlayBulk\New_Soul.mp3 /data/user/0/com.leeg.musicplayer8/files" 命令,将其推送到设备上
let path = '/data/user/0/com.leeg.musicplayer8/files/New_Soul.mp3';
let dest = '/data/user/0/com.leeg.musicplayer8/files/cache_files/New_Soul.mp3'

/*
 *  由于上传文件后操作权限不足,需要先将文件copy之后再进行下一步的open操作,如何获取权限还在研究【未完待续,我迟早会回来的】
 * */
fileIO.copyFile(path, dest, 0).then(function () {
  console.info("Leeg : copyFile succeed");
  console.info('Leeg : Current File Path is ' + dest)
}).catch(function (err) {
  console.info("Leeg : copyFile failed with error:" + err);
});

/*
 *  打开文件成功之后使用音频播放器进行播放
 * */
fileIO.open(dest).then((fdNumber) => {
  console.info('Leeg : Open Begin')
  fdPath = fdPath + '' + fdNumber;
  console.info('Leeg : open fd success fd is' + fdPath);
  console.info('Leeg : Current fdPath is ' + fdPath)
}, (err) => {
  console.info('Leeg : open fd failed err is' + err);
}).catch((err) => {
  console.info('Leeg : open fd failed err is' + err);
});


@Component
export default struct PlayBulkPage {
  @State PlayState: string = '/pages/PlayBulk/play_white.svg'
  firstClickFlag: boolean = true    //设置一个标志位,第一次点击界面上的播放按键实现加载播放,后续使用暂停、继续的功能

  build() {
    Flex() {
      Row() {
        Image($r('app.media.favorite_taylor'))
          .width(50).height(50).margin({ left: 20, top: 6 })
          .borderRadius(25)
        Text('Enchanted')
          .fontSize(16)
          .fontColor($r('app.color.PlayColor'))
          .width(180)
          .margin({ left: 30 })
          .fontStyle(FontStyle.Normal)
        Blank('20%')
        Image(this.PlayState).height(30).width(30).margin(5)   //播放按键的图标
          .onClick(() => {
            if (this.PlayState === "/pages/PlayBulk/play_white.svg" && this.firstClickFlag == true) {   //判断是否为第一次点击
              this.PlayState = "/pages/PlayBulk/pause_white.svg";
              this.firstClickFlag = false;
              audio_On_Play(audioPlayer);
              audioPlayer.src = fdPath
              console.info('Leeg : Current Play Audio src is ' + fdPath)
              console.info('Leeg : Play Success')
            }
            else if (this.PlayState === "/pages/PlayBulk/pause_white.svg" && this.firstClickFlag == false) {    //不是第一次点击,走暂停流程
              this.PlayState = "/pages/PlayBulk/play_white.svg";
              audio_On_Pause(audioPlayer);
              console.info('Leeg : Pause Success')
            }
            else {    //其余走继续流程
              this.PlayState = "/pages/PlayBulk/pause_white.svg";
              audio_On_Continue(audioPlayer);
              console.info('Leeg : Continue Success')
            }
          })
        Image($r('app.media.play_view_list')).height(30).width(30).margin({ left: 20 })
      }
    }
    .height('7%')
    .width('100%')
    .backgroundColor('#77d4a88a')
  }
}

实现的效果就是点击UI上的播放按键可以实现,歌曲的播放,暂停。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

自问自答吧:

cke_228.png

emmm,获取到了文件的沙箱地址了,不过在打开的时候提示报错,估计是权限的问题了

https://www.hmxthome.com/develop/81.html

感谢您的反馈,如后期有疑问可以随时发帖,感谢您的支持。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

你好,请问那个url是怎么写的,mp3放在哪里呢

HarmonyOS类型的设备

  1. 如何获取设备的数据区位置?

  2. 可以理解以下文件路径就是沙箱路径么?

let cacheDir = this.context.cacheDir
console.info('Leeg : ' + cacheDir)

let fileDir = this.context.filesDir
console.info('Leeg : ' + fileDir)

通过context获取的路径都是沙箱路径,

在HarmonyOS鸿蒙Next中,应用播放本地音频文件可以通过AVPlayer类实现。首先,确保音频文件已存储在设备的本地路径中。使用AVPlayersetSource方法指定音频文件的路径,然后调用prepare方法进行初始化。初始化完成后,调用play方法开始播放。可以通过pausestop方法控制播放的暂停和停止。AVPlayer还提供了seek方法用于跳转到指定时间点播放。播放过程中,可以通过监听stateChanged事件来获取播放状态的变化。

在HarmonyOS鸿蒙Next中,播放本地音频文件可以通过AVPlayer类实现。首先,使用AVPlayer.createAVPlayer()创建播放器实例,然后通过setSource()方法设置音频文件路径,最后调用prepare()play()方法进行播放。示例代码如下:

AVPlayer avPlayer = AVPlayer.createAVPlayer();
avPlayer.setSource(new AVPlayer.AVSource("/sdcard/audio.mp3"));
avPlayer.prepare();
avPlayer.play();

确保应用具有读取存储权限,并在config.json中声明ohos.permission.READ_MEDIA权限。

回到顶部