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
新建一楼来回复这个问题吧。
看了代码和日志,问题根因不是权限问题,而是路径问题。fileio.open()
中传入的路径需是沙箱路径,非沙箱路径,系统是找不到或者是没有操作权限的。附上资源文件的真实路径和沙箱路径的对应关系图,其中沙箱路径中bundle
是应用的hap包所在目录,即应用的代码和资源文件都在该目录下。
更多关于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
感谢您的反馈,如后期有疑问可以随时发帖,感谢您的支持。
你好,请问那个url是怎么写的,mp3放在哪里呢
-
如何获取设备的数据区位置?
-
可以理解以下文件路径就是沙箱路径么?
let cacheDir = this.context.cacheDir
console.info('Leeg : ' + cacheDir)
let fileDir = this.context.filesDir
console.info('Leeg : ' + fileDir)
通过context获取的路径都是沙箱路径,
在HarmonyOS鸿蒙Next中,应用播放本地音频文件可以通过AVPlayer
类实现。首先,确保音频文件已存储在设备的本地路径中。使用AVPlayer
的setSource
方法指定音频文件的路径,然后调用prepare
方法进行初始化。初始化完成后,调用play
方法开始播放。可以通过pause
和stop
方法控制播放的暂停和停止。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
权限。