HarmonyOS 鸿蒙Next怎么在应用里面播放音频(只要声音),能播放视频的话更好。(把播放动作绑定到按钮或者文字、图片等)
HarmonyOS 鸿蒙Next怎么在应用里面播放音频(只要声音),能播放视频的话更好。(把播放动作绑定到按钮或者文字、图片等) 官方文档:
使用AVPlayer播放音频(ArkTS)-播放-媒体开发指导(ArkTS)-Media Kit(媒体服务)-媒体 - 华为HarmonyOS开发者
[@ohos.multimedia.media (媒体服务)-ArkTS API-Media Kit(媒体服务)-媒体 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-media-V5#mediacreateavplayer9)
[@ohos.multimedia.audio (音频管理)-ArkTS API-Audio Kit(音频服务)-媒体 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-audio-V13)
相关问答:
基于AVPlayer音频后台播放-华为开发者问答 | 华为开发者联盟
关于SoundPool播放音频的问题-华为开发者问答 | 华为开发者联盟
基于AVPlayer音频后台播放-华为开发者问答 | 华为开发者联盟
官方示例:
VideoPlay: 视频播放的主要工作是将视频数据转码并输出到设备进行播放,同时管理播放任务。
结果:
-
在官方示例中音乐卡片能够在模拟器中成功运行,视频播放在模拟器中会提示网络问题,稍显卡顿,加载半天,加载成功不能快进。
-
相关的参考文档和问答中提供了相关代码,但是本人水平有限确实是看不懂。(在哪里修改本地文件地址,支持啥格式,文件有要求么,怎么给UI绑定动作)
这个示例代码怎么从HelloWorld搭建起来的,成果可以白嫖,但是过程本人实在是脑补不出来。
需求:
-
APP播放本地的mp3、mp4等格式的文件,能播放网页上的资源更好。
-
有UI绑定,即能直接复制粘贴运行的。如需配置相关环境请列出步骤。
-
如果有相关的代码请告诉我
(1)本地文件是放在中么还是另有安排?
(2)在代码中如何修改读取的文件位置,格式是什么src/main/resources/rawfile/DiDi.mp3能用么?
(3)如何把音乐或者视频播放的动作绑定到按钮或者文字图形上。
(4)如果您有类似于HarmonyOS_Samples/MusicCard的完整工程的话,能教教我怎么实现的么?
- 我先想到的是把资料给AI,帮我梳理一下,但是输出的内容是TypeScript,和ArkTs并不严格兼容。有的配置项在DevEco中并不叫这个名字。有好用的AI推荐么?
GPT确实可以,但是4.0有限制次数。
-
您是如何看懂官方文档的,有需求是如何实现的,这个过程能描述一下么?
-
学生愚钝,如您肯指导一二,不胜感激。
以下是喂给AI数据之后手动修改能勉强运行出界面的产物,只有一个按钮,不知道为什么没能成功播放出声音,要改的话怎么改呀
// AVPlayerDemo.ets
import media from '[@ohos](/user/ohos).multimedia.media';
import { fileIo as fs } from '@kit.CoreFileKit';
interface GeneratedTypeLiteralInterface_1 {
code: number;
message: string;
}
@Entry
@Component
struct AVPlayerDemo {
private count: number = 0; // A counter for play/pause actions
private isSeek: boolean = true; // Flag to control seeking behavior
private fileSize: number = -1; // Holds the size of the media file
private fd: number = 0; // File descriptor for accessing the media file
// Callback function to handle AVPlayer events like state changes and errors
private setAVPlayerCallback(avPlayer: media.AVPlayer) {
avPlayer.on('seekDone', (seekDoneTime: number) => {
console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
});
avPlayer.on('error', (err: GeneratedTypeLiteralInterface_1) => {
console.error(`Invoke AVPlayer failed. Code: ${err.code}, Message: ${err.message}`);
avPlayer.reset(); // Reset player on error
});
avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
switch (state) {
case 'idle':
console.info('AVPlayer state: idle.');
avPlayer.release(); // Release resources if idle
break;
case 'initialized':
console.info('AVPlayer state: initialized.');
avPlayer.prepare(); // Prepare the player
break;
case 'prepared':
console.info('AVPlayer state: prepared.');
avPlayer.play(); // Start playing the audio once prepared
break;
case 'playing':
console.info('AVPlayer state: playing.');
if (this.count === 0) {
setTimeout(() => {
console.info('Pausing AVPlayer after 3 seconds.');
avPlayer.pause(); // Pause after 3 seconds
}, 3000);
} else if (this.isSeek) {
console.info('Seeking to the end of the audio.');
avPlayer.seek(avPlayer.duration); // Seek to the end after playing
}
this.count++;
break;
case 'paused':
console.info('AVPlayer state: paused.');
setTimeout(() => {
console.info('Resuming playback after 3 seconds.');
avPlayer.play(); // Resume playback after a delay
}, 3000);
break;
case 'completed':
console.info('AVPlayer state: completed.');
avPlayer.stop(); // Stop when playback is complete
break;
case 'stopped':
console.info('AVPlayer state: stopped.');
avPlayer.reset(); // Reset on stop
break;
case 'released':
console.info('AVPlayer state: released.');
break;
default:
console.info('AVPlayer state: unknown.');
}
});
}
// Method to play a local file
async playLocalFileDemo() {
const filePath = 'src/main/resources/rawfile/DiDi.mp3'; // Path to the audio file
try {
const avPlayer: media.AVPlayer = await media.createAVPlayer();
this.setAVPlayerCallback(avPlayer); // Attach event handlers
const file = await fs.open(filePath, fs.OpenMode.READ_WRITE);
this.fd = file.fd; // Get the file descriptor
this.fileSize = (await fs.stat(filePath)).size; // Get the file size
// Setting up the data source for the AVPlayer
const src: media.AVDataSrcDescriptor = {
fileSize: this.fileSize,
callback: (buffer: ArrayBuffer, length: number, pos: number | undefined) => {
if (!buffer || length === undefined || pos === undefined) {
return -1;
}
const bytesRead = fs.readSync(this.fd, buffer, { offset: pos, length });
return bytesRead > 0 ? bytesRead : -1;
},
};
this.isSeek = true; // Enable seeking to the end after play starts
avPlayer.dataSrc = src; // Assign data source to AVPlayer
} catch (error) {
console.error('Error initializing AVPlayer:', error);
}
}
// Render UI components
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceBetween }) {
Text('Play Audio Example').fontSize(9).fontColor(0xCCCCCC);
Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) {
Button('Play Audio', { type: ButtonType.Normal, stateEffect: true })
.borderRadius(8)
.backgroundColor(0x317aff)
.width(120)
.height(40)
.onClick(() => {
console.info("Play button clicked");
this.playLocalFileDemo(); // Trigger file playback
});
};
}.height(400).padding({ left: 35, right: 35, top: 35 });
}
}
更多关于HarmonyOS 鸿蒙Next怎么在应用里面播放音频(只要声音),能播放视频的话更好。(把播放动作绑定到按钮或者文字、图片等)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
-
视频播放的demo可以运行啊,都有声音,也都可以倍速播放,模拟器和手机均可以,是不是你的模拟器的网络不太行。
-
本地文件地址都在
resources/rawfile
路径下面,你可以对照demo页面看到文件名,然后去代码中搜索文件名,就可以看到在哪里修改文件地址了。主流的视频文件格式都是支持的,如果碰到不支持的格式,也可以进行反馈;至于怎么给UI绑定动作,还是一样的方法:看demo运行效果,然后根据UI的样式去代码里面找,比如你可以先找播放的图标文件名是什么,然后去代码中找在何处使用,就可以看到UI如何绑定动作了。
需求:
- APP播放本地的mp3、mp4等格式的文件?如何播放网络资源
找demo运行效果中的播放按钮在代码中哪里使用到了(比如代码中搜索"app.media.ic_video_play"),那里就是播放mp3、mp4文件的代码;网络资源,视频里的demo也有,项目中搜索"http",就可以找到网络资源如何使用。
- 有UI绑定,即能直接复制粘贴运行的
播放按钮的 onclick
事件,就是UI绑定播放暂停事件了
3.1. 本地音视频资源文件一般放在 rawfile
,可以有二级目录,引用的时候注意路径即可
3.2. 可以用,如果你就是 src/main/resources/rawfile/DiDi.mp3
这个路径,那你用的时候直接写 "DiDi.mp3"
就可以,如果你的路径是 src/main/resources/rawfile/test/DiDi.mp3
,那你的路径就写 "test/DiDi.mp3"
3.3. 参考播放按钮的绑定事件就行
3.4. 完整工程如何实现很难说清楚啊,你只能跟着demo一点点学,结合api的文档和demo UI,一个模块一个方法的学习。
-
现在的 GPT 应该都不太适配鸿蒙,因为鸿蒙更新太快了,我用 chat GPT 搜的结果都是很老的答案。阿里的【通义千问】应该相对好一点
-
看官方文档可以结合文档下面的使用案例一起看,实际运行下demo,比较容易理解。如果实在理解不了,可以像这样在社区提问,慢慢的资料就会多起来,学习来就简单了。
-
可以参考下 codelab 里面的音乐播放demo,直接就可以播放: https://developer.huawei.com/consumer/cn/codelabsPortal/carddetails/tutorials_NEXT-MusicHome
更多关于HarmonyOS 鸿蒙Next怎么在应用里面播放音频(只要声音),能播放视频的话更好。(把播放动作绑定到按钮或者文字、图片等)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,要在应用里播放音频或视频,并将播放动作绑定到按钮、文字或图片等控件上,可以通过以下方式实现:
-
音频播放:
- 使用HarmonyOS提供的媒体播放API,如
MediaPlayer
类。 - 创建一个
MediaPlayer
实例,并设置音频文件的路径或URI。 - 将
MediaPlayer
的播放控制绑定到UI控件的事件监听器上,如按钮的点击事件。 - 在事件监听器中调用
MediaPlayer
的start()
方法来播放音频。
- 使用HarmonyOS提供的媒体播放API,如
-
视频播放:
- 使用
VideoPlayer
控件来播放视频。 - 在布局文件中添加
VideoPlayer
控件,并设置其属性。 - 在代码中获取
VideoPlayer
控件的实例,并设置视频文件的路径或URI。 - 同样,将播放控制绑定到UI控件的事件监听器上,如按钮的点击事件。
- 在事件监听器中调用
VideoPlayer
的start()
方法来播放视频。
- 使用
请注意,具体的实现细节可能因项目需求和HarmonyOS版本的不同而有所差异。如果在使用过程中遇到问题,建议查阅HarmonyOS的官方文档或相关开发资料。如果问题依旧没法解决请联系官网客服,官网地址是: