HarmonyOS鸿蒙Next中音频mp3文件需要放在工程中哪个目录下才可以正常播放?

HarmonyOS鸿蒙Next中音频mp3文件需要放在工程中哪个目录下才可以正常播放? 现有几个音频mp3文件,需要放在工程中哪个目录下才可以正常播放,查看文档

//创建soundPool实例
let soundPool: media.SoundPool;
let audioRendererInfo: audio.AudioRendererInfo = {
  usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  rendererFlags: 1
}
media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  if (error) {
    console.error(`createSoundPool failed`)
    return;
  } else {
    soundPool = soundPool_;
    console.info(`createSoundPool success`)
    let uri:string = "";
    let file: fs.File;
    //获取fd的uri路径
    fs.open('/test_01.mp3', fs.OpenMode.READ_ONLY).then((file_: fs.File) => {
      file = file_;
      console.info("file fd: " + file.fd);
      uri = 'fd://' + (file.fd).toString()
      soundPool.load(uri, (error: BusinessError, soundId_: number) => {
        if (error) {
          console.error(`load soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
        } else {
          console.info(`load soundPool Success` + JSON.stringify(soundId_))
        }
      });
    }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。
  }
});

文档中/test_01.mp3这个文件应该放在工程中什么位置


更多关于HarmonyOS鸿蒙Next中音频mp3文件需要放在工程中哪个目录下才可以正常播放?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

音频播放可以参考此链接:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/audio-playback-overview-V5

音频管理:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-audio-V5#导入模块

提供个内置音频资源要播放Demo:

import audio from '@ohos.multimedia.audio';
import media from '@ohos.multimedia.media';
import fs from '@ohos.file.fs'
import picker from '@ohos.file.picker';

import { BusinessError } from '@ohos.base';
let urii: string = '';
let soundPool: media.SoundPool;
let streamId: number = 0;
const audioSelectOptions = new picker.AudioSelectOptions();
let soundId: number = 0;
let audioRendererInfo: audio.AudioRendererInfo = {
  usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  rendererFlags: 1
}
let PlayParameters: media.PlayParameters = {
  loop: 3, // 循环4次
  rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
  leftVolume: 0.9, // range = 0.0-1.0
  rightVolume: 0.9, // range = 0.0-1.0
  priority: 3, // 最低优先级
}
let uri: string = "";

@Entry
@Component
struct NormalCapturer {
  @State message: string = '播放音频';

  async aboutToAppear(): Promise<void> {
    create();
  }

  async aboutToDisappear() {
   release();
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button('播放音频').onClick(event => {
          PlaySoundPool();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

async function create() {
  //创建soundPool实例
  soundPool = await media.createSoundPool(5, audioRendererInfo);
  //注册监听
  loadCallback();
  finishPlayCallback();
  setErrorCallback();
  // 加载音频资源

  const audioViewPicker = new picker.AudioViewPicker();
  audioViewPicker.select(audioSelectOptions).then(async (audioSelectResult: Array<string>) => {
    urii = audioSelectResult[0];
    console.info('audioViewPicker.select to file succeed and uri is:' + urii);
    if(urii){
      await fs.open(urii, fs.OpenMode.READ_ONLY).then(file_ => {
        let file=file_;
        console.info("file fd: " + file.fd);
        uri = 'fd://' + (file.fd).toString()
      }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。
      soundPool.load(uri).then(soundIdd => {
        console.info('soundPool load uri success');
        soundId=soundIdd;
      }).catch(err => {
        console.error('soundPool load failed and catch error is ' + err.message);
      })
    }

  }).catch(err => {
    console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
  })
}

async function loadCallback() {
  // 加载完成回调
  soundPool.on('loadComplete', soundId_ => {
    console.info('loadComplete, soundId: ' + soundId_);
  })
}

//设置播放完成监听
async function finishPlayCallback() {
  // 播放完成回调
  soundPool.on('playFinished', () => {
    console.info("recive play finished message");
    // 可进行下次播放
  })
}

//设置错误类型监听
function setErrorCallback() {
  soundPool.on('error', error => {
    console.info('error happened,message is :' + error.message);
  })
}

async function PlaySoundPool() {
  console.log("开始播放");
  // 开始播放,这边play也可带播放播放的参数PlayParameters
  streamId = await soundPool.play(soundId,PlayParameters);
}

async function release() {
  // 终止指定流的播放
  soundPool.stop(streamId);
  // 卸载音频资源
  await soundPool.unload(soundId);
  //关闭监听
  setOffCallback();
  // 释放SoundPool
  await soundPool.release();
}

//关闭监听
function setOffCallback() {
  soundPool.off('loadComplete');
  soundPool.off('playFinished');
  soundPool.off('error');
}

注:fs.open获取的文件只能是沙箱目录下的文件,音频文件可以放到resources/rawfile目录下,通过resourceManager资源管理器getRawFd方法获取文件描述符fd,文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-resource-manager-V5#getrawfd9

更多关于HarmonyOS鸿蒙Next中音频mp3文件需要放在工程中哪个目录下才可以正常播放?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


  • 应用资源目录(如果支持)

    • 通常在一些开发环境中,资源文件(如音频文件)可以放在应用的资源目录下。例如在安卓开发中可能放在 res/raw 目录(这只是类似概念,不确定 DevEco 是否有完全相同的目录结构)。这样可以方便地通过资源访问方式来引用文件,不过从你提供的代码看目前不是这种访问方式。
  • 应用内部存储相关目录

    • 根据代码中的文件访问路径 /test_01.mp3 推测,这可能是应用内部存储的绝对路径。在实际开发中,你可能需要将音频文件放置在应用可以访问的内部存储位置。

    • 不过这种绝对路径的使用方式可能需要在应用初始化阶段或者文件访问阶段确保该文件确实被正确放置在这个路径下。例如,在应用安装或首次启动时,将音频文件从资源目录(如果有)或者外部存储(如果允许)复制到这个内部存储路径。

  • 外部存储目录(如果有适当权限和使用场景)

    • 如果应用有访问外部存储的权限,并且文档允许从外部存储读取文件,音频文件也可以放在外部存储的合适目录下。但这种情况需要谨慎处理权限问题,并且要确保在不同设备上外部存储路径的兼容性。不过从代码看目前不是这种访问模式。

总体而言,文档没有明确说明放置位置的情况下,需要结合应用运行环境和文件访问权限等来确定合适的放置位置,并且可能需要根据代码实际运行情况进行调整。目前代码中的 /test_01.mp3 这种路径看起来像是应用内部存储的一个自定义路径,你可能需要通过应用内部存储管理相关的代码来确保文件在这个位置可被访问。

在HarmonyOS鸿蒙Next中,音频mp3文件需要放在工程的resources/rawfile目录下才能正常播放。这个目录是专门用于存放应用程序的原始资源文件,包括音频、视频等。开发者可以通过ResourceManager类来访问这些资源文件,并在代码中调用相应的API进行播放。确保文件路径正确,并且文件名不包含特殊字符或空格,以避免加载失败。

在HarmonyOS鸿蒙Next中,音频mp3文件应放置在工程的resources/rawfile目录下。该目录用于存放原始资源文件,系统会自动将其打包到应用中。通过ResourceManager可以访问这些文件,确保音频文件能够正常加载和播放。

回到顶部