uniapp应用程序播放音频、背景音乐或视频,需要媒体播放器组件提供支持。本文分享即构的uniapp实时音视频SDK中的媒体播放器组件功能和实现。

媒体播放器功能简介

媒体播放器组件提供播放音视频媒体文件的能力,并且支持将播放的媒体文件的音画数据推流出去。

应用场景

  • 播放测试音频 :可以使用媒体播放器播放测试音频,验证音频播放设备是否工作正常。
  • 播放背景音乐 :使用媒体播放器播放音乐并混在流中推送出去,让远端听到背景音乐。
  • 播放视频文件 :结合自定义视频采集将媒体资源的视频数据推送出去,远端可拉流观看。

支持格式

媒体播放器默认支持格式为:MP3、MP4、FLV、WAV、AAC、M3U8、FLAC。如需支持其它格式,请联系 ZEGO 技术支持。

支持协议

支持 HTTP 和 HTTPS 协议。

前提条件

在使用媒体播放器之前,请确保:

  • 已在项目中集成 ZEGO Express SDK,实现基本的音视频功能,详情请参考 快速开始 – 集成 。
  • 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign。

媒体播放器使用步骤

创建媒体播放器

调用 ZegoExpressEngine 的 createMediaPlayer 接口以创建媒体播放器实例。一个媒体播放器实例只能播放一个音视频,引擎同一时间最多支持创建 4 个播放器实例,以达到同时播放多个媒体资源的效果。若当前已存在 4 个播放器实例,再次调用创建播放器接口将返回 null

  • 接口原型:
/**
 * 创建媒体播放器实例对象
 *
 * 目前最多支持创建 4 个实例,超过后将返回 null
 * @return 媒体播放器实例,超过最大数量限制后将返回 null
 */
createMediaPlayer(): Promise<ZegoMediaPlayer|null>;
  • 调用示例:
ZegoExpressEngine.instance().createMediaPlayer().then((player) => {
  this.mediaPlayer = player;
});

为播放器设置事件回调(可选)

调用媒体播放器的 on 接口为播放器设置事件回调,以接收“播放器状态改变”、“播放进度改变”、“播放器网络状态更新”等通知。

  • 接口原型:
export interface ZegoMediaPlayer {

/**
 * 监听播放器事件通知
 * 
 * @param event 事件类型 
 * @param callback 事件发送后触发的方法
 */
on<MediaPlayerEventType extends keyof ZegoMediaPlayerListener>(event: MediaPlayerEventType, callback: ZegoMediaPlayerListener[MediaPlayerEventType]): void;
......
}

export interface ZegoMediaPlayerListener {
/**
 * @event ZegoMediaPlayer#onMediaPlayerStateUpdate
 * @desc 播放器播放状态回调
 *
 * @property {ZegoMediaPlayer} mediaPlayer - 回调的播放器实例
 * @property {ZegoMediaPlayerState} state - 播放器状态
 * @property {number} errorCode - 错误码,详情请参考常用错误码文档 https://doc-zh.zego.im/article/10429.html
 */
mediaPlayerStateUpdate: (mediaPlayer: ZegoMediaPlayer, state: ZegoMediaPlayerState, errorCode: number) => void;

/**
 * @event ZegoMediaPlayer#onMediaPlayerNetworkEvent
 * @desc 播放器网络状态事件回调
 *
 * @property {ZegoMediaPlayer} mediaPlayer - 回调的播放器实例
 * @property {ZegoMediaPlayerNetworkEvent} networkEvent - 网络状态事件
 */
mediaPlayerNetworkEvent: (mediaPlayer: ZegoMediaPlayer, networkEvent: ZegoMediaPlayerNetworkEvent) => void;

/**
 * @event ZegoMediaPlayer#onMediaPlayerPlayingProgress
 * @desc 播放器播放进度回调
 *
 * @property {ZegoMediaPlayer} mediaPlayer - 回调的播放器实例
 * @property {number} millisecond - 进度,单位为毫秒
 */
mediaPlayerPlayingProgress: (mediaPlayer: ZegoMediaPlayer, millisecond: number) => void;
}
  • 调用示例:
this.mediaPlayer.on("mediaPlayerStateUpdate", (player, state, errorCode) => {
    switch (state) {
        case ZegoMediaPlayerState.NoPlay:
            // 播放停止状态
            break;
        case ZegoMediaPlayerState.Playing:
            // 正在播放状态
            break;
        case ZegoMediaPlayerState.Pausing:
            // 暂停状态
            break;
        case ZegoMediaPlayerState.PlayEnded:
            // 当前曲目播放完成,可执行播放下一首等操作
            break;
    }
  });

加载媒体资源

调用媒体播放器的 loadResource 指定要播放的媒体资源,可以是本地资源的绝对路径,也可以是网络资源的 URL,如 “http://your.domain.com/your-movie.mp4”。 用户可通过传入回调参数的方式获取加载文件的结果。

  • 接口原型:
/** 加载资源,可传本地资源的绝对路径或者网络资源的 URL */
loadResource(path: string): Promise<ZegoMediaPlayerLoadResourceResult>;
  • 调用示例:
/** 此处示例获取 App 包内的 sample.mp4 文件绝对路径 */
this.mediaPlayer.loadResource("sample.mp4").then((ret) => {
    console.log("load resource error: " + ret.errorCode);
});

播放控制

播放状态控制

调用 start、pause、resume、stop 来启停播放。除了 Web 平台,一旦播放器的内部状态改变,mediaPlayerStateUpdate 回调将会被触发。

除了 Web 平台,开发者也可通过调用 getCurrentState 随时获取播放器的当前状态。

如果 enableRepeat 设置为 “true”,则播放器会在播放完文件后自动重播。

export interface ZegoMediaPlayer {

    /**
     * 加载媒体资源
     */
    loadResource(path: string): Promise<ZegoMediaPlayerLoadResourceResult>;

    /**
     * 开始播放(播放前需要先加载资源)
     */
    start(): Promise<void>;

    /**
     * 停止播放
     */
    stop(): Promise<void>;

    /**
     * 暂停播放
     */
    pause(): Promise<void>;

    /**
     * 恢复播放
     */
    resume(): Promise<void>;

    ......
}

播放进度控制

播放文件的进度会通过 mediaPlayerPlayingProgress 接口回调,默认触发回调的间隔是 1000 ms,可通过 setProgressInterval 更改此间隔。

开发者也可通过 getCurrentProgress 来获取当前播放进度。

通过 seekTo 接口可以调整播放进度进度。

  • 接口原型:
export interface ZegoMediaPlayer {

    /** 整个文件的播放时长,毫秒 */
    getTotalDuration(): Promise<number>;

    /** 当前播放进度,毫秒 */
    getCurrentProgress(): Promise<number>;

    ......

    /** 设置指定播放进度,毫秒 */
    seekTo(millisecond: number): Promise<ZegoMediaPlayerSeekToResult>;

    ......

    /** 设置播放进度回调间隔 */
    setProgressInterval(millisecond: number): Promise<void>;

    ......
  • 调用示例:
this.mediaPlayer.setProgressInterval(1000)

let totalDuration = await this.mediaPlayer.getTotalDuration()

this.mediaPlayer.seekTo(totalDuration/2);

this.mediaPlayer.currentProgress();

播放速度控制

加载资源完成后,用户可以调用 setPlaySpeed 接口来设置播放器当前的播放速度。

  • 接口原型
/**
 * 设置播放倍速
 *
 * 详情描述:设置播放器的播放倍速
 * 调用时机:必须在加载资源完成后才能调用
 * 使用限制:无
 * 相关接口:可通过 loadResource 函数加载资源
 *
 * @param speed 播放速度,范围为 0.5 ~ 2.0,默认为 1.0
 */
setPlaySpeed(speed: number): Promise<void>;
  • 调用示例:
// 设置 2 倍速播放
this.mediaPlayer.setPlaySpeed(2.0);

播放器音频控制

通过 getPlayVolume 和 setPlayVolume 接口获取和控制播放音量。

通过 getPublishVolume 和 setPublishVolume 接口获取和控制推流音量。

调用 enableAux 接口可以将文件的声音混入正在推的流中。

调用 muteLocal 接口可以使本地静默播放但能正常将声音混入流。

/** 获取播放器当前播放音量 */
var playVolume = await this.mediaPlayer.getPlayVolume;

/** 设置播放器音量为原先的一半 */
this.mediaPlayer.setPlayVolume(playVolume/2)

/** 开启将资源的声音混入正在推的流中 */
this.mediaPlayer.enableAux(true)

/** 开启本地静默播放 */
this.mediaPlayer.muteLocal(true)

播放器视频控制

本节操作仅适用于音视频场景,纯音频场景下无需设置。

当播放视频资源时,使用 <zego-mediaplayer-view> 标签,调用 setPlayerView 接口来设置视频的显示视图。

  • 接口原型:
/** 设置播放器视图 */
setPlayerView(playerID: number): Promise<void>;
  • 调用示例:
<template>
    <zego-mediaplayer-view :playerID="playerID" style="height: 260.38rpx"></zego-mediaplayer-view>
</template>

js部分:
let mediaPlayer = await ZegoExpressEngine.instance().createMediaPlayer();
this.playerID = mediaPlayer.getIndex();
mediaPlayer.setPlayerView(this.playerID);

销毁媒体播放器

使用完媒体播放器后,需要及时调用 destroyMediaPlayer 接口销毁播放器实例变量,释放占用的资源。

  • 调用示例:
/** 销毁媒体播放器 */
ZegoExpressEngine.instance().destroyMediaPlayer(this.mediaPlayer)

常见问题

1. 如何在播放中途切换播放资源?

先调用播放器的 stop 接口,然后重新调用 loadResource 接口加载新资源。

以上涉及的接口及参数请参考文档:

https://doc-zh.zego.im/unique-api/express-video-sdk/zh/javascript_uni-app/classes/zegoexpressdefines.zegomediaplayer.html

 本文转载自实时互动网,文章出处《uniapp音视频播放功能实现(uniapp音视频开发系列8)》

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐