进阶功能

本文介绍鸿蒙HarmonyOS NEXT播放器SDK进阶功能的使用示例。

播放

短视频列表播放

针对典型的短视频列表播放场景,鸿蒙HarmonyOS NEXT播放器SDK提供了完善的列表播放功能,结合预加载等机制大幅改善短视频的起播速度。长视频场景不建议使用该功能。

使用限制

建议您使用列表播放功能前,提前打开本地缓存开启预加载功能。详细内容请参见预加载

操作步骤

  1. 创建播放器。

    通过AliPlayerFactory类创建AliListPlayer播放器。示例如下:

    let aliyunListPlayer: AliListPlayer = AliPlayerFactory.createAliListPlayer(getContext());
    aliyunListPlayer.setTraceId(traceId);
  2. 可选:设置监听器。

    创建列表播放时,监听器为非必须配置,但如果不设置,将无法收到播放器的播放失败、播放进度等事件通知,因此,建议您设置。其中OnPreparedListenerOnErrorListenerOnCompletionListenerOnLoadingStatusListenerOnInfoListener较为重要,建议您设置。

  3. 设置预加载个数。

    合理设置预加载个数,能够有效的提高起播的速度。示例如下:

    //设置预加载个数。总共加载的个数为: 1 + count*2。
    aliyunListPlayer.setPreloadCount(count);
  4. 添加或移除多个播放源。

    列表播放支持两种播放源:Vid播放(包括VidSts及VidPlayAuth)和UrlSource播放。Url为视频的播放地址。示例如下

    • Url:播放地址可以是第三方点播地址或阿里云点播服务中的播放地址。阿里云播放地址可以调用获取音视频播放地址接口获取。建议您集成点播服务端SDK来获取音视频播放地址,免去自签名的麻烦。调用接口获取音视频播放地址的示例请参见开发者门户

    • Vid:音视频ID,可以在音视频上传完成后通过控制台(路径:媒资库 > 音/视频。)或服务端接口(搜索媒体信息)获取。

    let uid:string = generateUid();//generateXXX方法为本地假定方法,用于示例,非播放器方法
    
    //添加UrlSource播放源
    let url:string = generateUrl();
    aliyunListPlayer.addUrl(url, uid);
    
    //移除某个源
    aliyunListPlayer.removeSource(uid);
    说明

    uid是视频的唯一标志。用于区分视频是否一样。如果uid一样,则认为视频是一样的。如果播放出现串流的情况,请注意查看是不是在不同的界面设置了同一个uid。uid没有格式限制,可以是任意的字符串。

  5. 设置显示View。

    绑定播放器与鸿蒙XComponent组件,实现视频画面渲染。

    展开查看代码

    // 推荐下载并查看Demo最佳实践中,原子接入方案
    // 以下代码为鸿蒙arkTs环境@Component组件示例
    
    /**
     * 原子接入 鸿蒙播放器SDK
     * 基于最底层鸿蒙XC能力,最简单方式集成,为客户自制开发提供高自由度
     * 三步 - 实现视频播放
     */
    
    import { AliPlayerFactory, AliPlayer } from 'premierlibrary';
    
    @Preview
    @Component
    export struct MyPlayerComponent {
    
      private videoUrl: string = 'http播放地址';
      private xComponentController = new XComponentController();
      private aliListPlayer: AliListPlayer = AliPlayerFactory.createAliLstPlayer(getContext(), '');
    
      build() {
        XComponent({
          id: '0', // unique XC id
          type: XComponentType.SURFACE,
          libraryname: 'premierlibrary',
          controller: this.xComponentController
        })
        .onLoad(async () => {
    
          // 准备URL对象
          let url: string = generateUrl();
          let uid: string = generateUid();
    
          // 绑定URL & XC_SurfaceId
          this.aliListPlayer.addUrl(url, uid);
          this.aliListPlayer.setSurfaceId('0'); // surface ID 对应 XC ID
    
          // 播放视频
          this.aliListPlayer.setAutoPlay(true);
          this.aliListPlayer.moveTo(uid);
        })
        .width('100%')
        .height(200)
      }
    
      aboutToDisappear(): void {
        if (this.aliListPlayer) {
          this.aliListPlayer.stop();
          this.aliListPlayer.release();
        }
      }
    }
  6. 播放视频源。

    添加了一个或多个播放源之后并设置自动播放,调用moveTo便可以自动播放某个视频源。示例如下:

    展开查看代码

    //开启自动播放
    aliyunListPlayer.setAutoPlay(true);
    
    //url时使用此接口
    aliyunListPlayer.moveTo(uid);
  7. 播放上一个、下一个视频。

    • 调用moveTo播放某个视频源后,调用moveToPrevmoveToNext接口以moveTo的视频源为锚点进行播放上一个,下一个视频。示例如下:

      说明

      在基于同一个view的情况下,调用moveto或者moveToNext等切换视频源操作时,会出现闪烁黑屏的情况。此时建议在listPlayer初始化时,配置PlayerConfigmClearFrameWhenStop字段为false,并调用setConfig使其生效。

      展开查看代码

      //开启自动播放
      aliyunListPlayer.setAutoPlay(true);
      
      //移动到下一个视频。 注意:只能用于url的源。这个方法不适用于vid的播放。
      aliyunListPlayer.moveToNext();
      //移动到上一个视频。注意:只能用于url的源。这个方法不适用于vid的播放。
      aliyunListPlayer.moveToPrev();
    • 根据vid申请PlayAuth信息,申请成功后再进行MoveTo或MoveToNext等。

      说明

      只有VidPlayAuth播放才需要根据vid申请PlayAuth信息。

      展开查看代码

      requestAuth(source.getVideoId(), new OnRequestAuthResultListener() {
          @Override
          public void onResult(VidAuth vidAuth) {
              mVideoListPlayer.moveToNext(createVidAuth(vidAuth));
          }
      });
      
      private PlayAuthInfo createVidAuth(VidAuth vidAuth) {
          if (vidAuth == null) {
              return new PlayAuthInfo();
          }
          PlayAuthInfo playAuthInfo = new PlayAuthInfo();
          playAuthInfo.setPlayAuth(vidAuth.getPlayAuth());
          return playAuthInfo;
      }

外挂字幕

鸿蒙HarmonyOS NEXT播放器SDK支持添加和切换外挂字幕,现已支持SRT、SSA、ASS、VTT这4种格式的字幕。但还不支持提供外挂字幕的渲染工具,用于直接渲染外挂字幕。示例如下:

  1. 设置字幕相关监听。

    展开查看代码

    private mOnSubtitle: OnSubtitleDisplayListener = {
        onSubtitleExtAdded: (trackIndex: number, url: string): void => {
          //外挂字幕已被添加
        },
        onSubtitleShow: (trackIndex: number, id: number, data: string): void => {
          //获取到外挂字幕的字符信息,获取到data后 做相关显示
        },
        onSubtitleHide: (trackIndex: number, id: number): void => {
          //隐藏显示
        },
        onSubtitleHeader: (trackIndex: number, header: string): void => {
          //字幕头信息
        }
      }
    
      mAliPlayer.setOnSubtitleDisplayListener(this.mOnSubtitle);
  2. 添加字幕。

    mAliPlayer.addExtSubtitle(url);//在播放器onPrepared回调后添加
  3. 显示或隐藏字幕。

    在收到onSubtitleExtAdded回调后,可通过如下方法进行显示或隐藏字幕:

    //trackIndex:传入字幕索引;true:表示显示传入的字幕;false:表示隐藏传入的字幕
    mAliPlayer.selectExtSubtitle(trackIndex, true);

纯音频播放

通过禁用视频播放,达到纯音频播放的效果。在prepare之前配置PlayerConfig。

let config:PlayerConfig | undefined = player.getConfig();
if (config) {
  config.mDisableVideo = true; //设置开启纯音频播放
  player.setConfig(config);
}

软硬解切换

说明

解码方式需要在播放前切换,播放中切换解码方式将不会生效。

鸿蒙HarmonyOS NEXT播放器SDK提供了H.264、H.265的硬解码能力,同时提供了enableHardwareDecoder提供开关。默认开,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。示例如下:

//开启硬解。默认开启
mAliyunVodPlayer.enableHardwareDecoder(true);

如果从硬解自动切换为软解,将会通过onInfo回调,示例如下:

private mOnVideoInfo: OnInfoListener = {
  onInfo: (bean: InfoBean) => {
    if (bean.getCode() === InfoCode.SwitchToSoftwareVideoDecoder) {
      console.log("[HOS DEMO] [DOWNGRADE TO SOFTWARE DECODE]")
      //切换到软解
    }
  }
}

网络自适应切换视频清晰度

说明
  • HLS的多码率自适应视频流可以在视频点播中经过视频打包转码模板组进行转码处理后生成,详细操作请参见点播多码率自适应配置

  • 经过视频点播转码生成的自适应流,如果使用Vid方式播放,则需要指定默认播放清晰度列表为DEFINITION_AUTO,才会获取并播放自适应的视频流;否则将按照默认逻辑选择低清晰度的视频流进行播放,默认清晰播放顺序请参见清晰度相关问题。以VidAuth播放方式为例,指定清晰度列表的示例如下:

    const vidAuthSource: VidAuth = new VidAuth();
    let list: Definition[] = [];
    list.push(Definition.DEFINITION_AUTO);
    vidAuthSource.setDefinition(list);
    
    player.setVidAuthDataSource(vidAuthSource);

鸿蒙HarmonyOS NEXT播放器SDK支持多码率自适应HLS、DASH视频流。在prepare成功之后,通过getMediaInfo可以获取到各个码流的信息,即TrackInfo。示例如下:

let mediaInfo: MediaInfo | null | undefined = player?.getMediaInfo();

let trackInfos: TrackInfo[] | undefined = mediaInfo?.getTrackInfos();

在播放过程中,可以通过调用播放器的selectTrack方法切换播放的码流,取值为AUTO_SELECT_INDEX时,为多码率自适应。示例如下:

let index: number | undefined = trackInfo?.getIndex();
if (index ) {
  player?.selectTrack(index);
}
player?.selectTrack(TrackInfo.AUTO_SELECT_INDEX);

切换的结果会在OnTrackChangedListener监听之后会回调(在调用selectTrack之前设置)。示例如下:

private mOnTrackChange: OnTrackChangedListener = {
  //清晰度切换成功
  onChangedSuccess: (trackInfo: TrackInfo): void => {
    //切换成功
  }
}

截图

鸿蒙HarmonyOS NEXT播放器SDK提供了对当前视频截图的功能,由snapshot接口实现。截取的是原始的数据,并转为ArrayBuffer返回。回调接口为OnSnapShotListener。示例如下:

private mOnSnapShotListener: OnSnapShotListener = {
  onSnapShot: (arrayBuffer: ArrayBuffer, width: number, height: number): void => {
    //必须为BGRA_8888格式
    log.i("arrayBuffer size is " + arrayBuffer.byteLength);
    let opts: image.InitializationOptions = {
      editable: true,
      pixelFormat: 3,
      size: {
        height: height,
        width: width
      }
    };

    image.createPixelMap(arrayBuffer, opts).then((pixelMap: image.PixelMap) => {
      console.log("Succeeded in creating pixelmap");
      this.savePixelMap2SystemFileManager(pixelMap);
    }).catch((error: BusinessError) => {
      console.log(`Failed to create pixelmap. code is ${error.code}, message is ${error.message}`);
    })
  }
}

// 将pixelMap转成图片格式
transferPixelMap2Buffer(pixelMap: image.PixelMap): Promise<ArrayBuffer> {
  return new Promise((resolve, reject) => {
    /**
     * 设置打包参数
     * format:图片打包格式,只支持 jpg 和 webp
     * quality:JPEG 编码输出图片质量
     * bufferSize:图片大小,默认 10M
     */
    let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 98 };
    // 创建ImagePacker实例
    const imagePackerApi = image.createImagePacker();
    imagePackerApi.packing(pixelMap, packOpts).then((buffer: ArrayBuffer) => {
      resolve(buffer);
    }).catch((error: BusinessError) => {
      console.info(`Failed to create pixelmap. code is ${error.code}, message is ${error.message}`);
      reject();
    })
  })
}

//storage image to cache dir
async savePixelMap2SystemFileManager(pixelMap: image.PixelMap) {
  const imgBuffer = await this.transferPixelMap2Buffer(pixelMap);
  const now = new Date();
  const formattedDate = now.toISOString().slice(2, 19).replace(/[-T:]/g, '');
  const fileName = `/${formattedDate}.png`;
  const filePath = getContext().cacheDir + fileName;
  console.info("filepath is " + filePath); // 将图片存储到cache路径下,名称为截图时的时间

  const file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
  console.info("file has been opened " + file.fd);
  await fileIo.write(file.fd, imgBuffer);
  console.info("file has been write");
  await fileIo.close(file.fd);
  console.info("file has been close");
}

player.setOnSnapShotListener(this.mOnSnapShotListener); //设置回调

//截图当前播放的画面
player.snapshot()

试看

鸿蒙HarmonyOS NEXT播放器SDK通过配合点播服务配置,可以实现试看功能,支持VidSts和VidAuth(视频点播推荐使用此方式)两种播放方式。如何配置和使用试看功能,请参见试看视频

配置试看功能之后,通过VidPlayerConfigGen.setPreviewTime()方法设置播放器的试看时长。以VidSts播放方式为例,示例如下:

const vidSts: VidSts = new VidSts();

....
let configGen: VidPlayerConfigGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);//20秒试看
vidSts.setPlayConfig(configGen);//设置给播放源
...

当设置试看的时长,通过鸿蒙HarmonyOS NEXT播放器SDK播放视频时,服务端将不会返回完整的视频内容,而是返回试看时间段的内容。

说明
  • VidPlayerConfigGen支持设置服务端支持的请求参数。请参见请求参数说明

  • FLV和MP3格式视频暂时不支持试看。

设置Referer

鸿蒙HarmonyOS NEXT播放器SDK支持设置Referer,配合控制台的黑白名单Referer,可以控制访问权限,由PlayerConfig方法设置请求Referer。播放器SDK的设置示例如下:

let config:PlayerConfig | undefined = player.getConfig();
if (config) {
  //设置referer,示例:http://example.aliyundoc.com。(注意:设置referer时,需要加上前面的协议部分。)
  config.mReferrer = referer; 
  player.setConfig(config);
}

设置UserAgent

鸿蒙HarmonyOS NEXT播放器SDK提供了PlayerConfig用来设置请求UA。设置之后,播放器请求的过程中将会带上UA信息。示例如下:

let config:PlayerConfig | undefined = player.getConfig();
if (config) {
  //设置UA
  config.mUserAgent = userAgent; 
  player.setConfig(config);
}

配置网络重试时间和次数

支持设置鸿蒙HarmonyOS NEXT播放器SDK的网络超时的时间和重试次数,由PlayerConfig方法实现。示例如下:

let config:PlayerConfig | undefined = player.getConfig();
if (config) {
  //设置网络超时时间,单位:毫秒
  config.mNetworkTimeout = 5000;
  //设置超时重试次数。每次重试间隔为networkTimeout。networkRetryCount=0则表示不重试,重试策略app决定,默认值为2
  config.mNetworkRetryCount=2;
  player.setConfig(config);
}
说明
  • 如果设置了NetworkRetryCount,若此时发生网络问题,导致出现loading后,那么将会重试NetworkRetryCount次,每次的间隔时间为mNetworkTimeout。

  • 如果重试多次之后,还是loading的状态,那么就会回调onError事件,此时,ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT。

  • 如果NetworkRetryCount设置为0,当网络重试超时的时候,播放器就会回调onInfo事件,事件的InfoBean.getCode()=InfoCode.NetworkRetry。 此时,可以调用播放器的reload方法进行重新加载网络,或者进行其他的处理。

配置缓存和延迟控制

鸿蒙HarmonyOS NEXT播放器SDK通过PlayerConfig提供了设置缓存和延迟的控制接口。示例如下:

展开查看代码

let config:PlayerConfig | undefined = player.getConfig();
if (config) {
  //最大延迟。注意:直播有效。当延时比较大时,播放器sdk内部会追帧等,保证播放器的延时在这个范围内。
  config.mMaxDelayTime = 5000;
  // 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。
  config.mMaxBufferDuration = 50000;
  //高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。
  config.mHighBufferDuration = 3000;
  // 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。
  config.mStartBufferDuration = 500;
  ....//其他设置
  //往前缓存的最大时长。单位ms。默认为0。
  config.mMaxBackwardBufferDurationMs = 0;
  player.setConfig(config);
}
重要
  • 三个缓冲区时长的大小关系必须为:mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration。

  • 当最大缓冲区时长(mMaxBufferDuration)大于5分钟时,为防止因为缓冲区过大导致的内存异常,系统将默认按5分钟生效。当mMaxBufferDuration设置超过50000 ms(即50s)时,可以启用大缓存,来降低内存占用,进一步提高播放性能,如有需要,请参见大缓存

设置HTTP Header

通过PlayerConfig方法,可以给播放器中的请求加上HTTP的header参数。示例如下:

let config:PlayerConfig | undefined = player.getConfig();
if (config) {
  //定义header
  let headers: string[] = [];
  headers.push("Host:example.com");//比如需要设置Host到header中。
  //设置header
  config.setCustomHeaders(headers);
  player.setConfig(config);
}

设置视频背景色

鸿蒙HarmonyOS NEXT播放器SDK支持设置播放器渲染的背景色。接口和用法说明如下:

接口示例

/**
 * 设置视频的背景色
 *
 * @param color  ARGB
 *
 */
/****
 * Set video background color
 * @param color  ARGB
 */
setVideoBackgroundColor: (color: number) => void;

用法说明

//参数为8位16进制数据,8位数据两两为一组,按照顺序分别表示A(alpha 透明度) R(red) G(green) B(blue) 
//例如0x0000ff00,表示绿色
player.setVideoBackgroundColor(0x0000ff00);

vidAuth设置指定播放域名

通过vidAuth方式可以指定vid对应的域名等字段,支持的字段详情请参见GetPlayInfo请求参数。接口及用法说明如下:

接口示例

/**
 * 设置播放参数
 *
 * @param playConfig 播放参数
 */
/****
 * Set playback parameters.
 *
 * @param playConfig The playback parameters.
 */
setPlayerConfig: (playerConfig: VidPlayerConfigGen) => void

用法说明

通过其中的VidPlayerConfigGen接口的addPlayerConfig添加playDomain字段。

const vidAuthSource: VidAuth = new VidAuth();
let configGen: VidPlayerConfigGen = new VidPlayerConfigGen();
//增加playDomain字段,可以添加的字段参考
//https://help.aliyun.com/zh/vod/developer-reference/api-vod-2017-03-21-getplayinfo?spm=a2c4g.11186623.0.0.2bec2e44eqeDgx#api-detail-35
configGen.addPlayerConfigString("playDomain", "com.xxx.xxx");
vidAuthSource.setPlayerConfig(configGen);

player.setVidAuthDataSource(vidAuthSource);

性能

本地缓存

鸿蒙HarmonyOS NEXT播放器SDK提供了本地缓存的功能,能够让用户重复播放视频时,提高起播速度、提高seek速度、减少卡顿,也能达到节省流量的目的。

开启本地缓存

本地缓存功能默认关闭,如需使用,需要手动开启。通过AliPlayerGlobalSettings中的enableLocalCache控制。示例如下:

展开查看代码

/**
   * 开启本地缓存,开启之后,就会缓存到本地文件中。
   * @param enable true:开启本地缓存。false:关闭。默认关闭。
   * @param maxBufferMemoryKB 设置单个源的最大内存占用大小。单位KB
   * @param localCacheDir 本地缓存的文件目录,绝对路径
   */
  /****
   * Enable local cache. When enabled, it will be cached in local files.
   * @param enable true: enables the local cache. false: disable. This function is disabled by default.
   * @param maxBufferMemoryKB Set the maximum memory size for a single source. Unit is KB
   * @param localCacheDir Directory of files cached locally, absolute path
   */
  static enableLocalCache(enable: boolean, maxBufferMemoryKB: number, localCacheDir: string)


    /**
   *  本地缓存文件自动清理相关的设置
   * @param expireMin 缓存多久过期:单位分钟,默认值30天,过期的缓存不管容量如何,都会在清理时淘汰掉;
   * @param maxCapacityMB 最大缓存容量:单位兆,默认值20GB,在清理时,如果缓存总大小超过此大小,会以cacheItem为粒度,按缓存的最后时间排序,一个一个淘汰掉一些缓存,直到小于等于最大缓存容量;
   * @param freeStorageMB 磁盘最小空余容量:单位兆,默认值0,在清理时,同最大缓存容量,如果当前磁盘容量小于该值,也会按规则一个一个淘汰掉一些缓存,直到freeStorage大于等于该值或者所有缓存都被干掉;
   */
  /****
   * Settings related to automatic cleanup of local cache files
   * @param expireMin How long the cache expires: the unit is minute. The default value is 30 days.
   * @param maxCapacityMB maximum cache capacity: in megabytes. The default value is 20GB. If the total cache size exceeds this size, the cache size is sorted by cacheItem until it is less than or equal to the maximum cache capacity.
   * @param freeStorageMB Minimum free disk capacity: in megabytes (default value: 0). If the current disk capacity is less than this value, the freeStorage will be eliminated one by one until the freeStorage is greater than or equal to this value or all caches are eliminated.
   */
  static setCacheFileClearConfig(expireMin: number, maxCapacityMB: number, freeStorageMB: number)

  /**
   * 设置加载url的hash值回调。如果不设置,SDK使用md5算法。
   */
  setCacheUrlHashCallback(cb: OnGetUrlHashCallback)
说明
  • 如果视频播放URL带有鉴权参数,本地缓存和播放时鉴权参数会变化,为提高相同URL在不同鉴权下的缓存命中率,可以将URL的鉴权参数去掉后再通过setCacheUrlHashCallback接口计算Hash值(例如MD5)。例如:带有鉴权参数的视频播放URL为http://****.mp4?aaa,则加载时使用http://****.mp4计算Hash值。但如果视频为经过加密后的m3u8视频,其keyURL若按照去掉鉴权参数再计算Hash值的方式处理,会导致不同视频的缓存命中同一个key导致播放失败。解决方案:您可以在setCacheUrlHashCallback的回调里进行域名判断,仅对播放域名(http(s)://xxxxx.m3u8?aaaa)做去掉鉴权参数的处理,而keyURL对应的域名(http(s)://yyyyy?bbbb)不做去掉鉴权参数的处理。进阶功能-本地缓存.png

  • 如果服务器同时支持HTTP和HTTPS协议,但是不同的协议指向的媒体文件是同一个,则可以将请求头去掉或者统一后再计算Hash值。例如:

    • 视频播放URL为https://****.mp4http://****.mp4,则加载时使用****.mp4计算hash值。

    • 视频播放URL为https://****.mp4,加载时统一为http://****.mp4后再计算Hash值。

  • 如果视频播放URL带有鉴权参数且播放协议为HLS,可以通过设置PlayerConfig.mEnableStrictAuthMode字段,进行不同鉴权模式的选择(默认值为false):

    • 非严格鉴权(false):鉴权也缓存,若上一次只缓存了部分媒体,下次播放至非缓存部分时,播放器会用缓存的鉴权发起请求,如果URL鉴权设置的有效期很短,会导致播放异常。

    • 严格鉴权(true):鉴权不缓存,每次起播都进行鉴权,无网络下会导致起播失败。

开启或关闭单个URL的本地缓存

如果想要针对单个URL开启或关闭本地缓存功能,可以在player config中设置。

let config:PlayerConfig | undefined = player.getConfig();
if (config) {
  //是否针对播放的URL开启本地缓存,默认值为true。当AliPlayerGlobalSettings处的本地缓开启时,且同时开启此处的本地缓存,即设置为true,该URL的本地缓存才会生效;若此处设置为false,则关闭该URL的本地缓存。
  config.mEnableLocalCache = true; 
  player.setConfig(config);
}

大缓存

通过设置数据的最大缓冲区时长可以在播放视频时通过缓存视频数据到内存中,从而提高播放性能和观看体验。当最大缓冲区时长设置过大时,会造成缓冲区对内存的消耗。通过启用大缓存,可以将视频数据缓存到文件中,从而降低内存的占用,进一步提高播放器性能。

当mMaxBufferDuration设置超过50000 ms时,通过开启本地缓存触发大缓存功能自动启用。操作流程如下:

  1. 开启全局本地缓存。

    本地缓存功能默认关闭,如需使用,需要手动开启。通过AliPlayerGlobalSettings中的enableLocalCache控制。代码示例请参见本地缓存中的开启本地缓存

  2. 开启URL的本地缓存。

    代码示例请参见本地缓存中的开启或关闭单个URL的本地缓存

  3. 开启大缓存。

    AliPlayerGlobalSettings.enableBufferToLocalCache(true);

预加载

鸿蒙HarmonyOS NEXT播放器SDK提供预加载功能,是对本地缓存功能的升级,通过设置视频缓存的内存占用大小,更能提升视频的起播速度。

预加载功能的使用限制如下:

  • 目前支持MP4、MP3、FLV、HLS等单个媒体文件的加载。

  • 仅支持UrlSource播放方式播放视频的预加载,暂不支持VidAuth、VidSts方式播放视频的预加载。

说明

鸿蒙HarmonyOS NEXT播放器SDK默认提供预加载时网络资源自动调度能力,以减少预加载的网络请求对正在播放视频的网络请求的影响。自动调度的策略是:仅当正在播放的视频缓冲到达一定阈值后,才会允许预加载进行请求。若您需要自行控制预加载的实时请求,可以通过以下方法将此策略关闭:

AliPlayerGlobalSettings.enableNetworkBalance(false);
  1. 开启本地缓存功能,详细操作请参见本地缓存

  2. 获取AliMediaLoader实例。

    AliMediaLoader实例为单例,即无论获取多少次,创建的都是同一个实例。

    let loader: MediaLoader = MediaLoader.getInstance();
  3. 配置AliMediaLoader。

    配置回调,并开始加载。

    说明

    playerprepare时刻与mediaLoader.load的调用时刻一致,由于都需要遍历本地文件,则可能导致出现ANR的问题。建议设置为当playeronPrepared回调中时,才开始加载。

    展开查看代码

    export interface OnLoadStatusListener {
      /**
       * 加载出错
       *
       * @param url  视频url
       * @param code 错误码
       * @param msg  错误描述
       */
      /****
       * Load error
       *
       * @param url Video URL
       * @param code Error code
       * @param msg Error description
       */
      onError: (url: string, code:number, msg: string) => void;
    
      /**
       * 加载完成
       *
       * @param url 视频url
       */
      /****
       * Load complete
       *
       * @param url Video URL
       */
      onCompleted: (url: string) => void;
    
      /**
       * 取消加载
       *
       * @param url 视频url
       */
      /****
       * Load canceled
       *
       * @param url Video URL
       */
      onCancel: (url: string) => void;
    }
    
    /**
     * 开始加载文件。异步加载。可以同时加载多个视频文件。
     * @param url - 视频文件地址。
     * @param duration - 加载的时长大小,单位:毫秒。
     */
    mediaLoader.load(url, duration);
  4. 可选:删除加载文件。

    可按需删除加载文件,以节省空间。鸿蒙HarmonyOS NEXT播放器SDK不提供删除接口,需要在App删除加载目录下的文件。

获取下载速度

获取当前播放视频的下载速度,在onInfo回调中获取,由getExtraValue接口实现。示例如下:

private mOnVideoInfo: OnInfoListener = {
    //播放器中的一些信息,包括:当前进度、缓存位置等等。
    onInfo: (bean: InfoBean) => {
      if (bean.getCode() === InfoCode.CurrentDownloadSpeed) {
        ///当前下载速度
        let extraValue: number = bean.getExtraValue();
      } 
    }
  }

网络特性

HTTPDNS

HTTPDNS是通过DNS解析技术将域名解析请求发送到特定的HTTPDNS服务器,以获取更快、更稳定的域名解析结果,降低DNS劫持风险。

HTTPDNS使用示例

HTTPDNS仅为阿里云CDN域名提供HTTPDNS服务,请确保您配置的域名为阿里云CDN域名且已完成域名配置可正常使用。视频点播中添加和配置CDN域名请参见添加加速域名。更多有关CDN域名的信息请参见阿里云CDN

//打开httpdns
AliPlayerGlobalSettings.enableHttpDns(true);;

HTTP/2

鸿蒙HarmonyOS NEXT播放器SDK支持使用HTTP/2协议,该协议通过多路复用,避免队头阻塞,以改善播放性能。示例如下:

AliPlayerGlobalSettings.setUseHttp2(true);

视频下载

鸿蒙HarmonyOS NEXT播放器SDK提供了点播服务视频的下载功能,允许用户通过阿里云播放器将视频缓存至本地观看。目前仅提供普通下载方式,安全下载将会在后续版本提供

  • 普通下载

    下载后的视频数据未经过阿里云加密,用户可以用第三方播放器播放。

  • 安全下载

    下载后的视频数据经过阿里云加密。第三方播放器无法播放。仅支持使用阿里云的播放器进行播放。

使用说明

  • 仅VidSts和VidAuth方式支持视频下载功能。

  • 使用播放器的视频下载功能,需要在点播控制台开启并配置下载模式,详细操作请参见离线下载

  • 视频下载支持断点续传。

操作步骤

  1. 可选:配置安全下载的加密校验文件。仅安全下载需要配置,普通下载无需配置。

    说明

    请确保配置的加密校验文件与App信息一致,否则会导致视频下载失败。

    如果设置为安全下载方式,则需要将在点播控制台生成的密钥文件配置到播放器SDK中,用于视频下载和播放的解密验证,密钥文件的生成请参见开启安全下载

    建议在Application中配置一次即可,示例如下:

    PrivateService.initServiceWithBytes(getContext(), "encryptedApp.dat 文件内实际文本字符串") //可以读取encryptedApp.dat文件信息后,将字符串传入接口
  2. 创建并设置下载器。

    创建下载器,通过AliDownloaderFactory创建。示例如下:

    ......
    //创建下载器
    let mAliDownloader:AliMediaDownloader = AliDownloaderFactory.create(getApplicationContext());
    //配置下载保存的路径
    mAliDownloader.setSaveDir(getContext().cacheDir);
  3. 设置监听事件。

    下载器提供了多个事件监听。示例如下:

    展开查看代码

    //下载准备成功回调.成功后,通过{@linkplain #selectItem(int)} 方法选择需要下载的Track.
    export interface OnPreparedListener {
      onPrepared: (mediaInfo: MediaInfo) => void;
    }
    
    // 进度回调 
    export interface OnProgressListener {
       //下载进度百分比。
      onDownloadingProgress: (percent: number) => void;
      //处理进度百分比
      onProcessingProgress: (percent: number) => void;
    }
    
    // 下载完成消息回调
    export interface OnCompletionListener {
      onCompletion: () => void;
    }
    
    //错误消息回调
    export interface OnErrorListener {
      //下载错误的消息
      onError: (errorInfo: ErrorInfo) => void;
    }
  4. 准备下载源。

    通过prepare方法准备下载源。下载源支持VidSts和VidAuth两种方式。示例如下:

    • VidSts

      //创建VidSts
      let aliyunVidSts : VidSts = new VidSts();
      aliyunVidSts.setVid("Vid信息");// 视频ID(VideoId)。
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>");// STS临时AK对的访问密钥ID,需要调用STS服务的AssumeRole接口生成。
      aliyunVidSts.setAccessKeySecret"<yourAccessKeySecret>");// STS临时AK对的访问密钥,需要调用STS服务的AssumeRole接口生成。
      aliyunVidSts.setSecurityToken("<yourSecurityToken>");// STS安全令牌,需要调用STS服务的AssumeRole接口生成。
      aliyunVidSts.setRegion("接入地域");// 点播服务的接入地域,默认为cn-shanghai。
      //准备下载源
      mAliDownloader.prepare(aliyunVidSts)
    • VidAuth

      //创建VidAuth
      let vidAuth : VidAuth = new VidAuth();
      vidAuth.setVid("Vid信息");// 视频ID(VideoId)。
      vidAuth.setPlayAuth("<yourPlayAuth>");// 播放凭证,需要调用点播服务的GetVideoPlayAuth接口生成。
      vidAuth.setRegion("接入地域");// 本参数已弃用,无需设置region,播放器会自动解析region。
      //准备下载源
      mAliDownloader.prepare(vidAuth);
    说明

    源文件格式与输出的下载文件格式保持一致,不支持更改。

  5. 准备成功后,选择下载项并开始下载。

    准备成功后,会回调OnPreparedListener方法。返回的TrackInfo中会包含各视频流的清晰度等信息,请选择一个Track进行下载,示例如下:

    mAliDownloader.setOnPreparedListener({
      onPrepared: (mediaInfo: MediaInfo) => {
        //准备下载项成功
        let trackInfos : TrackInfo[] = mediaInfo.getTrackInfos();
        //比如:下载第一个TrackInfo
        mAliDownloader.selectItem(trackInfos[0].getIndex());
        //开始下载
        mAliDownloader.start();
      }
    });
  6. (可选)更新下载源。

    为了防止VidSts和VidAuth过期,您也可以更新下载源的信息后开始下载。示例如下:

    //更新下载源
    mAliDownloader.updateVidStsSource(VidSts);
    //开始下载
    mAliDownloader.start();
  7. 下载成功或失败后,释放下载器。

    下载成功后,在onCompletion或者onError回调中调用release释放下载器。示例如下:

    mAliDownloader.stop();
    mAliDownloader.release();
  8. 可选:删除下载的文件。

    下载过程中,或者下载完成后,可以删除下载的文件。示例如下:

    //通过对象删除文件
    mAliDownloader.deleteFile();
    //通过静态方法删除,若删除成功则返回0
    AliDownloaderFactory.deleteFile("待删除的下载文件夹路径","视频ID","视频格式","下载的视频索引");

后续操作

下载的视频可以使用阿里云播放器进行播放。具体方法如下:

  1. 下载完成后获取视频文件的绝对路径。

    let path: string = mAliDownloader.getFilePath();
  2. 通过点播UrlSource方式设置绝对路径进行播放。

    let urlSource: UrlSource = new UrlSource();
    urlSource.setUri(path);//设置下载视频的绝对路径。
    aliPlayer.setUrlDataSource(urlSource);

视频加密播放

点播视频支持HLS标准加密、阿里云私有加密和DRM加密,直播视频仅支持DRM加密。加密播放请参见视频加密播放

相关文档