功能描述
媒体播放器组件(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 项目
- 打开 Microsoft Visual Studio 并点击新建项目。
- 进入新建项目窗口,选择项目类型为 MFC 应用程序,输入项目名称,选择项目存储路径,并点击确认。
- 进入MFC 应用程序窗口,选择应用程序类型为基于对话框,并点击完成。
集成 MediaPlayer Kit
配置项目文件
- 前往Github,下载最新版 RTC SDK,然后解压。
- 将 sdk 文件夹复制到你的项目文件夹下。
集成步骤:参考实现视频直播。
必须初始化完 RTC 引擎之后在去使用 MediaPlayer Kit
实现方法
本地播放媒体资源
集成 RTC SDK 后,参考如下步骤实现本地播放功能。
初始化RTC引擎
- 初始化 IRtcEngine
初始化媒体播放器
- 调用
createArMediaPlayer
方法创建IMediaPlayer
实例。
如需同时播放不同的媒体资源,你可以创建多个实例。
- 调用
initialize
方法初始化媒体播放器。
设置日志
日志文件包含媒体播放器组件运行时产生的所有日志。日志文件的默认输出地址为 C:/Users/{user_name}/AppData/Local/ar/{project_name}
。调用以下方法可以对日志文件进行如下设置:
- 调用
IMediaPlayer
类的setLogFile
方法设置日志文件的输出地址。 - 调用
IMediaPlayer
类的setLogFilter
方法设置输出日志的过滤等级。
注册一个播放器观测器对象
- 实现
IMediaPlayerObserver
接口,并实例化IMediaPlayerObserver
对象。 - 调用
IMediaPlayer
类的registerPlayerObserver
方法注册一个播放器的观测器对象,监听以下播放事件:onPositionChanged
,报告当前播放进度onPlayerStateChanged
,报告播放状态改变onPlayerEvent
,报告播放器事件onMetadata
,报告媒体附属信息(metadata)的接收
通过监听这些事件,你可以更好地掌握播放过程,并使用自定义格式数据(媒体附属信息)。如果播放发生异常,你可以根据这些事件排查问题。
(可选)注册一个音频观测器对象
- 实现
IAudioFrameObserver
接口,并实例化IAudioFrameObserver
对象。 - 调用
IMediaPlayer
类的registerAudioFrameObserver
方法注册一个音频观测器对象,监听每帧音频帧的接收事件。获取到AudioPcmFrame
后你可以对音频进行录制。
(可选)注册一个视频观测器对象
- 实现
IVideoFrameObserver
接口,并实例化IVideoFrameObserver
对象。 - 调用
IMediaPlayer
类的registerVideoFrameObserver
方法注册一个视频观测器对象,监听每帧视频帧的接收事件。获取到VideoFrame
后你可以对视频进行录制和截图。
准备播放
-
调用
IMediaPlayer
类的setView
方法设置播放器的渲染视图。 -
调用
IMediaPlayer
类的setRenderMode
方法设置播放器视图的渲染模式。 -
调用
IMediaPlayer
类的open
方法打开媒体资源。媒体资源路径可以为网络路径或本地路径,支持绝对路径和相对路径。请收到
onPlayerStateChanged
回调报告播放状态为PLAYER_STATE_OPEN_COMPLETED(2)
后再进行下一步操作。 -
调用
IMediaPlayer
类的play
方法本地播放该媒体资源。
调节播放设置
调用 ArMediaPlayerKit
接口的其他方法,你可以实现如下播放设置:
- 暂停/恢复播放,调节播放进度和速度,调节本地播放音量等。
- 获取媒体资源总时长,获取播放进度,获取当前播放状态,获取该媒体资源中媒体流的个数和每个媒体流的详细信息。
结束播放
-
调用
IMediaPlayer
类的stop
方法停止播放。 -
调用
IMediaPlayer
类的unregisterAuidoFrameObserver
方法取消观测音频帧。如果你没有注册音频观测器,请略过此步。
-
调用
IMediaPlayer
类的unregisterVideoFrameObserver
方法取消观测视频帧。如果你没有注册视频观测器,请略过此步。
-
调用
IMediaPlayer
类的unregisterPlayerObserver
方法取消观测播放器事件。 -
调用
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 文档