找回密码
 立即注册
首页 业界区 业界 鸿蒙运动开发实战:打造专属运动视频播放器 ...

鸿蒙运动开发实战:打造专属运动视频播放器

圣罩 2025-6-15 09:52:50
##鸿蒙核心技术##运动开发##Media Kit(媒体服务)#
在当今数字化时代,运动健身已经成为许多人生活的一部分。今天我将在应用中添加视频播放器,帮助用户在运动前、运动后更好地进行热身和拉伸。这篇文章将从代码核心点入手,带你一步步了解开发过程中的关键技术和实现细节。
1.png

一、项目背景与需求分析

在开发任何应用之前,明确需求是至关重要的。对于运动视频播放器,我们需要考虑以下几个核心功能:

  • 视频播放:支持播放运动相关的视频,如热身、拉伸等。
  • 用户交互:提供简单的按钮操作,如播放、暂停、继续等。
二、代码核心点梳理与解析

接下来,我们将通过代码的核心部分,逐步解析实现运动视频播放器的关键步骤。
(一)页面布局与导航

在鸿蒙开发中,页面布局是用户体验的基础。我们使用了LibNav和LibPage来构建页面的导航和内容布局。以下是代码的核心部分:
  1. @Component
  2. export struct SportHelperPage {
  3.   @Builder
  4.   pageNavBuilder(){
  5.     LibNav({
  6.       pageTitle: "运动助手"
  7.     }).width("100%")
  8.   }
  9.   @Builder
  10.   pageContentBuilder(){
  11.     Column() {
  12.       Text('运动助手')
  13.         .fontSize(20)
  14.         .fontWeight(FontWeight.Bold)
  15.         .margin({ top: 20 })
  16.       Button('跑前热身')
  17.         .onClick(() => this.playVideo('https://video.111.com/p/bms/warmup_before_running.mp4'))
  18.         .margin({ top: 10 })
  19.       Button('跑后拉伸')
  20.         .onClick(() => this.playVideo('https://video.111.com/p/bms/stretch_after_running.mp4'))
  21.         .margin({ top: 10 })
  22.       Button('暂停播放')
  23.         .onClick(() => {
  24.           this.avPlayer?.pause()
  25.         })
  26.       Button('继续播放')
  27.         .onClick(() => {
  28.           this.avPlayer?.play()
  29.         })
  30.       XComponent({ type: XComponentType.SURFACE, controller: mXComponentController })
  31.         .width('100%')
  32.         .height(300)
  33.     }
  34.     .padding(20)
  35.     .backgroundColor(Color.White)
  36.   }
  37. }
复制代码

  • 页面导航:通过LibNav设置页面标题为“运动助手”,并将其宽度设置为100%,以确保导航栏能够覆盖整个屏幕顶部。
  • 页面内容:使用Column布局,将文本、按钮和视频播放组件(XComponent)依次排列。每个按钮都绑定了点击事件,用于触发视频播放或控制播放状态。
(二)视频播放器的初始化与控制

视频播放是应用的核心功能,我们使用了鸿蒙的media.AVPlayer来实现。以下是初始化和播放控制的代码:
  1. async initPlay() {
  2.   try {
  3.     this.avPlayer = await media.createAVPlayer();
  4.     this.setAVPlayerCallback(this.avPlayer);
  5.   } catch (error) {
  6.     console.error('初始化视频失败:', error);
  7.   }
  8. }
  9. async playVideo(url: string) {
  10.   try {
  11.     if(this.avPlayer){
  12.       this.avPlayer.url = url;
  13.       this.avPlayer.play();
  14.     }
  15.   } catch (error) {
  16.     console.error('播放视频失败:', error);
  17.   }
  18. }
复制代码

  • 初始化播放器:通过media.createAVPlayer()创建一个AVPlayer实例,并注册回调函数来监听播放状态的变化。
  • 播放视频:通过设置avPlayer.url属性为视频的URL,并调用play()方法开始播放。这里需要注意的是,视频URL必须是有效的,否则会导致播放失败。
(三)状态机回调与错误处理

在视频播放过程中,可能会出现各种状态变化和错误。通过注册回调函数,我们可以更好地管理这些情况:
  1. setAVPlayerCallback(avPlayer: media.AVPlayer) {
  2.   avPlayer.on('startRenderFrame', () => {
  3.     console.info(`AVPlayer start render frame`);
  4.   });
  5.   avPlayer.on('seekDone', (seekDoneTime: number) => {
  6.     console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
  7.   });
  8.   avPlayer.on('error', (err: BusinessError) => {
  9.     console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
  10.     avPlayer.reset();
  11.   });
  12.   avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
  13.     switch (state) {
  14.       case 'idle':
  15.         avPlayer.release();
  16.         break;
  17.       case 'initialized':
  18.         const id = mXComponentController.getXComponentSurfaceId();
  19.         avPlayer.surfaceId = id;
  20.         avPlayer.prepare();
  21.         break;
  22.       case 'prepared':
  23.         avPlayer.play();
  24.         break;
  25.       case 'paused':
  26.         console.info('AVPlayer state paused called.');
  27.         break;
  28.       case 'completed':
  29.         avPlayer.stop();
  30.         break;
  31.       case 'stopped':
  32.         avPlayer.reset();
  33.         break;
  34.       case 'released':
  35.         console.info('AVPlayer state released called.');
  36.         break;
  37.       default:
  38.         console.info('AVPlayer state unknown called.');
  39.         break;
  40.     }
  41.   });
  42. }
复制代码

  • 状态回调:通过监听stateChange事件,我们可以根据不同的状态(如initialized、prepared、playing等)执行相应的操作。例如,在initialized状态时,设置播放画面的surfaceId,并调用prepare()方法准备播放。
  • 错误处理:通过监听error事件,捕获播放过程中可能出现的错误,并调用reset()方法重置播放器状态。
三、开发中的注意事项与优化建议

在开发过程中,我们需要注意以下几个关键点,以确保应用的稳定性和用户体验:

  • 视频URL的有效性:在调用playVideo()方法时,必须确保传入的URL是有效的。如果URL无效或网络不可用,播放器将无法正常工作。建议在实际开发中,对视频URL进行校验,并提供友好的错误提示。
  • 性能优化:为了减少视频加载时间,可以考虑在应用启动时预先加载视频资源。此外,合理管理播放器的生命周期,避免在不需要时占用系统资源。
  • 用户体验:在页面布局中,按钮和文本的排布要简洁明了,避免过于复杂的操作。同时,可以考虑添加进度条、音量控制等功能,进一步提升用户体验。
四、总结

在实际开发中,开发者可以根据需求进一步扩展功能,例如添加更多运动视频类别、支持离线下载等。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册