播放器组件

最近更新时间:2022-09-20 05:17:40

功能描述

媒体播放器组件(MediaPlayer Kit)是一款功能强大的播放器,支持播放本地或在线的媒体资源。通过该播放器,你可以本地播放媒体资源,或将媒体资源同步分享给 anyRTC 频道内的远端用户观看/收听。

使用须知

支持格式

  • 目前支持的音频格式:MP3、WAV等
  • 目前支持的视频格式:AVI、MP4、MKV、FLV等

支持协议

目前支持HTTP、RTMP 和 RTSP 协议的在线媒体流。

本地播放时

必须先创建 RTC 引擎然后使用 MediaPlayer Kit ,因为 MediaPlayer Kit 播放器与 RTC 的音频路由一致,这种方式避免了同时使用RTC 和MediaPlayer Kit 播放器声音路由问题。

分享到远端时

播放器的画面会抢占主播摄像头采集的画面。所以,如果你希望远端用户同时看到主播和播放器的画面,则需另起一个进程来采集主播的画面。

准备开发环境

前提条件

  • Microsoft Visual Studio 2015 或以上版本
  • 支持 Windows 7 或以上版本的 Windows 设备
  • 必须结合RTC SDK 使用

创建项目

参考以下步骤创建一个 Windows 项目。

创建 Windows 项目
  1. 打开 Microsoft Visual Studio 并点击新建项目。
  2. 进入新建项目窗口,选择项目类型为 MFC 应用程序,输入项目名称,选择项目存储路径,并点击确认
  3. 进入MFC 应用程序窗口,选择应用程序类型为基于对话框,并点击完成。

集成 MediaPlayer Kit

配置项目文件

  1. 前往Github,下载最新版 RTC SDK,然后解压。
  2. sdk 文件夹复制到你的项目文件夹下。

集成步骤:参考实现视频直播

必须初始化完 RTC 引擎之后在去使用 MediaPlayer Kit

实现方法

本地播放媒体资源

集成 RTC SDK 后,参考如下步骤实现本地播放功能。

初始化RTC引擎

  1. 初始化 IRtcEngine

初始化媒体播放器

  1. 调用 createArMediaPlayer 方法创建 IMediaPlayer 实例。

如需同时播放不同的媒体资源,你可以创建多个实例。

  1. 调用 initialize 方法初始化媒体播放器。

设置日志

日志文件包含媒体播放器组件运行时产生的所有日志。日志文件的默认输出地址为 C:/Users/{user_name}/AppData/Local/ar/{project_name}。调用以下方法可以对日志文件进行如下设置:

  • 调用 IMediaPlayer 类的 setLogFile 方法设置日志文件的输出地址。
  • 调用 IMediaPlayer 类的 setLogFilter 方法设置输出日志的过滤等级。

注册一个播放器观测器对象

  1. 实现 IMediaPlayerObserver 接口,并实例化 IMediaPlayerObserver 对象。
  2. 调用 IMediaPlayer 类的 registerPlayerObserver 方法注册一个播放器的观测器对象,监听以下播放事件:
    • onPositionChanged,报告当前播放进度
    • onPlayerStateChanged,报告播放状态改变
    • onPlayerEvent,报告播放器事件
    • onMetadata,报告媒体附属信息(metadata)的接收

通过监听这些事件,你可以更好地掌握播放过程,并使用自定义格式数据(媒体附属信息)。如果播放发生异常,你可以根据这些事件排查问题。

(可选)注册一个音频观测器对象

  1. 实现 IAudioFrameObserver 接口,并实例化 IAudioFrameObserver 对象。
  2. 调用 IMediaPlayer 类的 registerAudioFrameObserver 方法注册一个音频观测器对象,监听每帧音频帧的接收事件。获取到 AudioPcmFrame 后你可以对音频进行录制。

(可选)注册一个视频观测器对象

  1. 实现 IVideoFrameObserver 接口,并实例化 IVideoFrameObserver 对象。
  2. 调用 IMediaPlayer 类的 registerVideoFrameObserver 方法注册一个视频观测器对象,监听每帧视频帧的接收事件。获取到 VideoFrame 后你可以对视频进行录制和截图。

准备播放

  1. 调用 IMediaPlayer 类的 setView 方法设置播放器的渲染视图。

  2. 调用 IMediaPlayer 类的 setRenderMode 方法设置播放器视图的渲染模式。

  3. 调用 IMediaPlayer 类的 open 方法打开媒体资源。媒体资源路径可以为网络路径或本地路径,支持绝对路径和相对路径。

    请收到 onPlayerStateChanged 回调报告播放状态为 PLAYER_STATE_OPEN_COMPLETED(2) 后再进行下一步操作。

  4. 调用 IMediaPlayer 类的 play 方法本地播放该媒体资源。

调节播放设置

调用 ArMediaPlayerKit 接口的其他方法,你可以实现如下播放设置:

  1. 暂停/恢复播放,调节播放进度和速度,调节本地播放音量等。
  2. 获取媒体资源总时长,获取播放进度,获取当前播放状态,获取该媒体资源中媒体流的个数和每个媒体流的详细信息。

结束播放

  1. 调用 IMediaPlayer 类的 stop 方法停止播放。

  2. 调用 IMediaPlayer 类的 unregisterAuidoFrameObserver 方法取消观测音频帧。

    如果你没有注册音频观测器,请略过此步。

  3. 调用 IMediaPlayer 类的 unregisterVideoFrameObserver 方法取消观测视频帧。

    如果你没有注册视频观测器,请略过此步。

  4. 调用 IMediaPlayer 类的 unregisterPlayerObserver 方法取消观测播放器事件。

  5. 调用 IMediaPlayer 类的 release 方法释放 IMediaPlayer 资源。

示例代码

class CPlayerSimpleDemo : public CWnd, public ar::rtc::IMediaPlayerObserver {
public:
    DECLARE_MESSAGE_MAP()
    CPlayerSimpleDemo() : media_player_( nullptr )
    {
    }
 
 
    ~CPlayerSimpleDemo()
    {
        if ( media_player_ )
        {
            media_player_->Release();
            media_player_ = nullptr;
        }
    }
 
 
    // IMediaPlayerObserver
    virtual void onPlayerStateChanged( const IMediaPlayer::PLAYER_STATE state,
                       const IMediaPlayer::PLAYER_ERROR ec ) override
    {
        switch ( state )
        {
        case IMediaPlayer::PLAYER_STATE_OPEN_COMPLETE:
            media_player_->play();
            break;
        case IMediaPlayer::PLAYER_STATE_FAILED:
            media_player_->stop();
            break;
        case IMediaPlayer::PLAYER_STATE_PLAYBACKCOMPLETED:
            media_player_->stop();
            break;
        default:
            break;
        }
    }
 
 
    virtual void onPositionChanged( const int64_t position ) override
    {
    }
 
 
    virtual void onMetaData( void* data, int length ) override
    {
    }
 
 
    virtual void onPlayerEvent( const IMediaPlayer::PLAYER_EVENT event ) override
    {
    }
 
 
    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct )
    {
        if ( CWnd::OnCreate( lpCreateStruct ) == -1 )
            return(-1);
        media_player_ = createArMediaPlayer();
        if ( media_player_ )
        {
            media_player_->registerPlayerObserver( this );
            media_player_->setView( m_hWnd );
            media_player_->open( "http://tb-video.bdstatic.com/tieba-smallvideo/68_20df3a646ab5357464cd819ea987763a.mp4" );
        }
        return(0);
    }
 
 
private:
    ar::rtc::IMediaPlayer* media_player_;
};

注意事项

使用播放器组件必须要先初始化 RTC SDK

API 文档

详见 API 文档