HarmonyOS鸿蒙Next视频播放组件与流媒体协议支持

HarmonyOS鸿蒙Next视频播放组件与流媒体协议支持 在HarmonyOS Next中,视频播放组件支持多种视频格式和流媒体协议。请简要说明如何配置视频播放组件支持流媒体视频,并展示一个使用流媒体协议(如RTSP或HLS)的简单代码示例。

3 回复

参考: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/streaming-media-playback-development-guide-V5

import { media } from '@kit.MediaKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export class AVPlayerDemo {
  private count: number = 0;
  private isSeek: boolean = true; // 用于区分模式是否支持seek操作

  // 注册avplayer回调函数
  setAVPlayerCallback(avPlayer: media.AVPlayer) {
    // seek操作结果回调函数
    avPlayer.on('seekDone', (seekDoneTime: number) => {
      console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
    })
    // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
    avPlayer.on('error', (err: BusinessError) => {
      console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
      avPlayer.reset(); // 调用reset重置资源,触发idle状态
    })
    // 状态机变化回调函数
    avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
      switch (state) {
        case 'idle': // 成功调用reset接口后触发该状态机上报
          console.info('AVPlayer state idle called.');
          avPlayer.release(); // 调用release接口销毁实例对象
          break;
        case 'initialized': // avplayer 设置播放源后触发该状态上报
          console.info('AVPlayer state initialized called.');
          this.avPlayer.audioRendererInfo = {
            usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
            rendererFlags: 0
          }
          avPlayer.prepare();
          break;
        case 'prepared': // prepare调用成功后上报该状态机
          console.info('AVPlayer state prepared called.');
          avPlayer.play(); // 调用播放接口开始播放
          break;
        case 'playing': // play成功调用后触发该状态机上报
          console.info('AVPlayer state playing called.');
          break;
        case 'paused': // pause成功调用后触发该状态机上报
          console.info('AVPlayer state paused called.');
          break;
        case 'completed': // 播放结束后触发该状态机上报
          console.info('AVPlayer state completed called.');
          avPlayer.stop(); //调用播放结束接口
          break;
        case 'stopped': // stop接口成功调用后触发该状态机上报
          console.info('AVPlayer state stopped called.');
          avPlayer.reset(); // 调用reset接口初始化avplayer状态
          break;
        case 'released':
          console.info('AVPlayer state released called.');
          break;
        default:
          console.info('AVPlayer state unknown called.');
          break;
      }
    })
    // 获取流媒体缓冲状态和缓冲进度
    avPlayer.on('bufferingUpdate', (infoType : media.BufferingInfoType, value : number) => {
      console.info(`AVPlayer bufferingUpdate, infoType is ${infoType}, value is ${value}.`);
    })
  }

  // 以下demo为通过url设置网络地址来实现播放流媒体HLS点播视频
  async avPlayerVodDemo() {
    // 创建avPlayer实例对象
    let avPlayer: media.AVPlayer = await media.createAVPlayer();
    // 创建状态机变化回调函数
    this.setAVPlayerCallback(avPlayer);
    this.isSeek = true; // 点播支持seek操作
    avPlayer.url = 'http://xxx.xxx.xxx.xxx:xx/xx/index.m3u8';
  }

  // 以下demo为通过url设置网络地址来实现播放流媒体HLS直播视频
  async avPlayerLiveDemo() {
    // 创建avPlayer实例对象
    let avPlayer: media.AVPlayer = await media.createAVPlayer();
    // 创建状态机变化回调函数
    this.setAVPlayerCallback(avPlayer);
    this.isSeek = false; // 直播不支持seek操作
    avPlayer.url = 'http://xxx.xxx.xxx.xxx:xx/xx/index.m3u8';
  }

  // 以下demo为通过setMediaSource设置自定义头域及媒体播放优选参数实现初始播放参数设置,以流媒体Https点播为例
  async preDownloadDemo() {
    // 创建avPlayer实例对象
    let avPlayer: media.AVPlayer = await media.createAVPlayer();
    // 创建状态机变化回调函数
    this.setAVPlayerCallback(avPlayer);
    this.isSeek = true; // 点播支持seek操作
    // 创建mediaSource实例对象,设置媒体来源,定制HTTP请求,如需要,可以键值对的形式设置User-Agent、Cookie、Referer等字段
    let mediaSource : media.MediaSource = media.createMediaSourceWithUrl("https://xxx.xxx", {"User-Agent" : "User-Agent-Value", "Cookie" : "Cookie-Value", "Referer" : "Referer-Value"});
    // 设置播放策略,播放片源的尺寸为1920*1080、设置缓冲区大小为20MB
    let playbackStrategy : media.PlaybackStrategy = {preferredWidth: 1920, preferredHeight: 1080, preferredBufferDuration: 20, preferredHdr: false};
    // 为avPlayer设置媒体来源和播放策略
    avPlayer.setMediaSource(mediaSource, playbackStrategy);
  }
}

更多关于HarmonyOS鸿蒙Next视频播放组件与流媒体协议支持的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS鸿蒙Next在视频播放方面提供了强大的组件支持和流媒体协议兼容性。系统内置的VideoPlayer组件支持本地和在线视频播放,能够处理常见的视频格式如MP4、MKV、AVI等。同时,鸿蒙Next通过MediaPlayer接口实现了对多种流媒体协议的支持,包括HLS(HTTP Live Streaming)、DASH(Dynamic Adaptive Streaming over HTTP)以及RTSP(Real-Time Streaming Protocol)。

对于开发者而言,鸿蒙Next提供了简洁的API接口,便于快速集成视频播放功能。例如,通过VideoPlayer组件的setSource方法,可以轻松加载本地或网络视频资源。系统还支持自适应码率切换,确保在不同网络条件下提供流畅的播放体验。

此外,鸿蒙Next的视频播放组件还支持字幕、音轨切换、播放速度调整等常用功能,满足了多样化的播放需求。流媒体协议的广泛兼容性使得开发者能够在鸿蒙平台上轻松实现复杂的视频应用场景,如直播、点播等。

HarmonyOS Next的视频播放组件支持多种流媒体协议,包括但不限于HLS、DASH、RTMP等,确保高效的视频传输和播放。组件优化了缓存机制,提升播放流畅度,并支持自适应码率调整,以适应不同网络环境。此外,还提供了丰富的API接口,便于开发者进行自定义功能开发,如播放控制、字幕加载等,满足多样化的应用场景需求。

回到顶部