HarmonyOS 鸿蒙Next怎么在应用里面播放音频(只要声音),能播放视频的话更好。(把播放动作绑定到按钮或者文字、图片等)

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next怎么在应用里面播放音频(只要声音),能播放视频的话更好。(把播放动作绑定到按钮或者文字、图片等) 官方文档:

音频播放开发概述 - 华为HarmonyOS开发者

使用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音频后台播放-华为开发者问答 | 华为开发者联盟

官方示例:

HarmonyOS_Samples/MusicCard

VideoPlay: 视频播放的主要工作是将视频数据转码并输出到设备进行播放,同时管理播放任务。

结果:

  1. 在官方示例中音乐卡片能够在模拟器中成功运行,视频播放在模拟器中会提示网络问题,稍显卡顿,加载半天,加载成功不能快进。

  2. 相关的参考文档和问答中提供了相关代码,但是本人水平有限确实是看不懂。(在哪里修改本地文件地址,支持啥格式,文件有要求么,怎么给UI绑定动作)

这个示例代码怎么从HelloWorld搭建起来的,成果可以白嫖,但是过程本人实在是脑补不出来。

需求:

  1. APP播放本地的mp3、mp4等格式的文件,能播放网页上的资源更好。

  2. 有UI绑定,即能直接复制粘贴运行的。如需配置相关环境请列出步骤。

  3. 如果有相关的代码请告诉我

(1)本地文件是放在中么还是另有安排?

(2)在代码中如何修改读取的文件位置,格式是什么src/main/resources/rawfile/DiDi.mp3能用么?

(3)如何把音乐或者视频播放的动作绑定到按钮或者文字图形上。

(4)如果您有类似于HarmonyOS_Samples/MusicCard的完整工程的话,能教教我怎么实现的么?

  1. 我先想到的是把资料给AI,帮我梳理一下,但是输出的内容是TypeScript,和ArkTs并不严格兼容。有的配置项在DevEco中并不叫这个名字。有好用的AI推荐么?

GPT确实可以,但是4.0有限制次数。

  1. 您是如何看懂官方文档的,有需求是如何实现的,这个过程能描述一下么?

  2. 学生愚钝,如您肯指导一二,不胜感激。

以下是喂给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

2 回复
  1. 视频播放的demo可以运行啊,都有声音,也都可以倍速播放,模拟器和手机均可以,是不是你的模拟器的网络不太行。

  2. 本地文件地址都在 resources/rawfile 路径下面,你可以对照demo页面看到文件名,然后去代码中搜索文件名,就可以看到在哪里修改文件地址了。主流的视频文件格式都是支持的,如果碰到不支持的格式,也可以进行反馈;至于怎么给UI绑定动作,还是一样的方法:看demo运行效果,然后根据UI的样式去代码里面找,比如你可以先找播放的图标文件名是什么,然后去代码中找在何处使用,就可以看到UI如何绑定动作了。

需求:

  1. APP播放本地的mp3、mp4等格式的文件?如何播放网络资源

找demo运行效果中的播放按钮在代码中哪里使用到了(比如代码中搜索"app.media.ic_video_play"),那里就是播放mp3、mp4文件的代码;网络资源,视频里的demo也有,项目中搜索"http",就可以找到网络资源如何使用。

  1. 有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,一个模块一个方法的学习。

  1. 现在的 GPT 应该都不太适配鸿蒙,因为鸿蒙更新太快了,我用 chat GPT 搜的结果都是很老的答案。阿里的【通义千问】应该相对好一点

  2. 看官方文档可以结合文档下面的使用案例一起看,实际运行下demo,比较容易理解。如果实在理解不了,可以像这样在社区提问,慢慢的资料就会多起来,学习来就简单了。

  3. 可以参考下 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系统中,要在应用里播放音频或视频,并将播放动作绑定到按钮、文字或图片等控件上,可以通过以下方式实现:

  1. 音频播放:

    • 使用HarmonyOS提供的媒体播放API,如MediaPlayer类。
    • 创建一个MediaPlayer实例,并设置音频文件的路径或URI。
    • MediaPlayer的播放控制绑定到UI控件的事件监听器上,如按钮的点击事件。
    • 在事件监听器中调用MediaPlayerstart()方法来播放音频。
  2. 视频播放:

    • 使用VideoPlayer控件来播放视频。
    • 在布局文件中添加VideoPlayer控件,并设置其属性。
    • 在代码中获取VideoPlayer控件的实例,并设置视频文件的路径或URI。
    • 同样,将播放控制绑定到UI控件的事件监听器上,如按钮的点击事件。
    • 在事件监听器中调用VideoPlayerstart()方法来播放视频。

请注意,具体的实现细节可能因项目需求和HarmonyOS版本的不同而有所差异。如果在使用过程中遇到问题,建议查阅HarmonyOS的官方文档或相关开发资料。如果问题依旧没法解决请联系官网客服,官网地址是:

回到顶部