媒体播放器组件提供播放音视频媒体文件的能力,并且支持将播放的媒体文件的音画数据推流出去。
可以使用媒体播放器播放测试音频,验证音频播放设备是否工作正常。
使用媒体播放器播放音乐,媒体播放器支持将播放出来的音频推流出去,让远端听到背景音乐。
主唱使用媒体播放器播放 MV 或其它类型歌曲,主唱随音乐唱歌,通过简单的配置就能让观众欣赏主唱 K 歌。结合媒体次要信息,还可以实现歌词同步显示。
媒体播放器支持 MP3、MP4、FLV、WAV、AAC、M3U8 等格式文件,并支持播放 iOS 媒体库中的音乐(ipod-library://
)。除了支持播放本地媒体文件,媒体播放器还支持 HTTP 和 HTTPS 协议,在线播放这些格式的文件。
媒体播放器默认支持格式为:MP3、MP4、FLV、WAV、AAC。如需支持其它格式,请联系 ZEGO 技术支持。
在 6.5.0 版本 (2021 年 10 月发布)之前的 SDK 默认不包含媒体播放器功能,可联系 ZEGO 技术支持提供。
媒体播放器业务状态流转如下图所示:
相关功能的 Demo 源码,请联系 ZEGO 技术支持获取。
/**
初始化
@param type @see MediaPlayerType
@param index sdk提供多个播放器实例,通过index可以指定获取的是哪个播放器实例 @see ZegoMediaPlayerIndex
@return 播放器对象
*/
- (instancetype)initWithPlayerType:(MediaPlayerType)type playerIndex:(ZegoMediaPlayerIndex)index;
ZegoMediaPlayer *mediaPlayer1;
ZegoMediaPlayer *mediaPlayer2;
mediaPlayer1 = [[ZegoMediaPlayer alloc] initWithPlayerType:MediaPlayerTypeAux playerIndex:ZegoMediaPlayerIndexFirst];
mediaPlayer2 = [[ZegoMediaPlayer alloc] initWithPlayerType:MediaPlayerTypePlayer playerIndex:ZegoMediaPlayerIndexSecond];
-setPlayerType:
修改播放器类型。-initWithPlayerType:
初始化媒体播放器。设置播放器事件回调,就可以接收到开始播放,结束播放,播放错误等事件回调。
- (void)setEventWithIndexDelegate:(id<ZegoMediaPlayerEventWithIndexDelegate>)delegate;
回调代理协议请详细查看 ZegoMediaPlayerEventWithIndexDelegate
当使用播放器播放视频资源时,可以使用 setView: API 设置视频的显示视图。
/**
设置显示视频的view
@param view 播放的控件
*/
- (void)setView:(UIView *)view;
/**
开始播放
@param path 媒体文件的路径
@param repeat 是否重复播放
*/
- (void)start:(NSString *)path repeat:(BOOL)repeat;
/**
停止播放
*/
- (void)stop;
http://your.domain.com/your-movie.mp4
;repeat 参数设置为 YES
时,表示开启循环播放。onPlayStart
事件,如果失败则回调 onPlayError
事件。/**
暂停播放
*/
- (void)pause;
/**
恢复播放
*/
- (void)resume;
在开始播放后,可以调用 pause
暂停当前媒体播放,并在成功时回调 onPlayPause
事件;在预加载完成或暂停播放后,可以调用 resume
恢复播放,并在成功时回调 onPlayResume
事件。
和初始化接口对应,在不需要播放器时,应该调用反初始化播放器接口。
/**
释放播放器
*/
- (void)uninit;
注意: 必须先调用
uninit
反初始化播放器,再将player
实例置空。
ZegoMediaPlayer
支持将音视频都推流出去,以下分别介绍播放器的音频、视频的推流方式。推流参考文档:快速集成-推流
在创建播放器 -initWithPlayerType:
或修改播放器类型 -setPlayerType:
设置播放器为 MediaPlayerTypeAux
类型,就可以实现将播放器的音频混音到推流。
要将播放器的视频推流出去,需要使用视频外部采集方式将视频数据混入推流中。具体使用步骤为:
通过方法 -setVideoPlayDelegate:format:
设置播放器播放视频帧回调和回调视频帧的格式,方法说明如下:
/**
设置视频帧数据回调
@param delegate 回调
@param format 需要返回的视频帧数据格式,@see ZegoMediaPlayerVideoPixelFormat
*/
- (void)setVideoPlayDelegate:(id<ZegoMediaPlayerVideoPlayDelegate>)delegate format:(ZegoMediaPlayerVideoPixelFormat)format;
ZegoMediaPlayerVideoPixelFormat
现支持的视频帧数据格式如下:
typedef NS_ENUM(NSInteger, ZegoMediaPlayerVideoPixelFormat) {
ZegoMediaPlayerVideoPixelFormatUnknown = 0,
ZegoMediaPlayerVideoPixelFormatI420 = 1,
ZegoMediaPlayerVideoPixelFormatNV12 = 2,
ZegoMediaPlayerVideoPixelFormatNV21 = 3,
ZegoMediaPlayerVideoPixelFormatBGRA32 = 4,
ZegoMediaPlayerVideoPixelFormatRGBA32 = 5,
ZegoMediaPlayerVideoPixelFormatARGB32 = 6,
ZegoMediaPlayerVideoPixelFormatABGR32 = 7,
};
在回调对象中实现 ZegoMediaPlayerVideoPlayDelegate
中的方法,其中 -onPlayVideoData:size:format:
回调的是RGB
类的数据,-onPlayVideoData2:size:format:
回调的是 YUV
类的数据,说明如下:
/**
视频帧数据回调接口
当格式为ARGB32/ABGR32/RGBA32/BGRA32,数据通过OnPlayVideoData回调。
当格式为I420/NV12/NV21,数据通过OnPlayVideoData2回调。
其他非法格式都判定为I420
*/
@protocol ZegoMediaPlayerVideoPlayDelegate <NSObject>
@optional
/**
视频帧数据回调,格式为ARGB32/ABGR32/RGBA32/BGRA32
@param data 视频帧原始数据
@param size 视频帧原始数据大小
@param format 视频帧原始数据格式
@note 同步回调,请不要在回调中处理数据或做其他耗时操作
*/
- (void)onPlayVideoData:(const char *)data size:(int)size format:(struct ZegoMediaPlayerVideoDataFormat)format;
/**
视频帧数据回调,格式为I420/NV12/NV21
@param data 视频帧原始数据
@param size 视频帧原始数据大小
@param format 视频帧原始数据格式
@note 同步回调,请不要在回调中处理数据或做其他耗时操作
*/
- (void)onPlayVideoData2:(const char **)data size:(int *)size format:(struct ZegoMediaPlayerVideoDataFormat)format;
@end
回调的设置和回调方法的实现可以参考 Demo 中的实现。
在 Init SDK 前,设置 SDK 使用视频外部采集。示例代码如下:
[ZegoLiveRoomApi setVideoCaptureFactory:self.externalVideoCaptureFactory];
视频外部采集,详见视频外部采集,或参考
Demo 的视频外部采集
专题代码。
必须先开始推流,才能将播放器的音视频数据推流出去。推流参考文档:快速开始 - 实现流程 的 “3.3 推流”。
根据设置的回调视频帧数据格式不同,在相应的回调方法中处理视频帧,然后将数据塞给 SDK,实现将播放器的视频推流出去。其中 -onPlayVideoData:size:format:
回调的是 RGB
类的数据,-onPlayVideoData2:size:format:
回调的是 YUV
类的数据。
在示例 Demo 中,回调的数据处理成 CVPixelBufferRef
类型,然后通过视频外部采集工厂塞给 SDK。Demo 代码参考如下:
// 回调 RGB 类的数据
- (void)onPlayVideoData:(const char *)data size:(int)size format:(struct ZegoMediaPlayerVideoDataFormat)format {
// 注意:不要在另外的线程处理 data,因为 data 可能会被释放
Weakify(self);
[self.playerVideoHandler convertRGBCategoryDataToPixelBufferWithVideoData:data size:size format:format completion:^(ZGMediaPlayerVideoDataToPixelBufferConverter * _Nonnull converter, CVPixelBufferRef _Nonnull buffer, CMTime timestamp) {
Strongify(self);
[self postMediaPlayerVideoFrameData:buffer presentationTimeStamp:timestamp format:format];
}];
}
// 回调 YUV 类的数据
- (void)onPlayVideoData2:(const char **)data size:(int *)size format:(struct ZegoMediaPlayerVideoDataFormat)format {
// 注意:不要在另外的线程处理 data,因为 data 可能会被释放
Weakify(self);
[self.playerVideoHandler convertYUVCategoryDataToPixelBufferWithVideoData:data size:size format:format completion:^(ZGMediaPlayerVideoDataToPixelBufferConverter * _Nonnull converter, CVPixelBufferRef _Nonnull buffer, CMTime timestamp) {
Strongify(self);
[self postMediaPlayerVideoFrameData:buffer presentationTimeStamp:timestamp format:format];
}];
}
按照以上流程下来,即可实现将 ZegoMediaPlayer
的视频数据的推流出去。
播放器 onPlayError
返回的错误码如下:
错误码 | 说明 |
---|---|
ErrorCode = -1 | 文件格式不支持 |
ErrorCode = -2 | 配置文件获取失败,路径不存在 |
ErrorCode = -3 | 文件无法解码 |
ErrorCode = -4 | 文件中没有可播放的音视频流 |
ErrorCode = -5 | 文件解析过程中出现错误 |
ErrorCode = -6 | 文件播放过程中出现丢帧,视频解码性能不够。提示信息,不影响播放流程 |
ErrorCode = -7 | 视频播放超时 |
Q1:播放器得到的音频混入推流后,采集音频数据回调(
[ZegoLiveApiAudioRecordDelegate -onAudioRecord:sampleRate:numOfChannels:bitDepth:type:]
)包含播放器的音频吗?
答:包含。
Q2: 媒体播放器可以播放网络视频吗?
答:可以,支持播放 HTTP/HTTPS 协议的 MP3、MP4、FLV、WAV、AAC、M3U8 等格式的网络资源。
Q3: 媒体播放器支持哪些格式的本地媒体文件?
答:支持播放 MP3、MP4、FLV、WAV、AAC、M3U8 等格式的本地媒体文件。
Q4:使用播放器混音后,还能使用原有的混音接口吗?
答:播放器混音推流并不影响原有混音接口功能,二者可以同时并存。
Q5:播放器调用了
start
方法以后没有开始播放?
答:load
播放器以后只能通过 resume
方法恢复,load
以后调用 start
方法会被跳过。如果想要调用 start
方法有效的话,不能调用 load
方法。
Q6:为什么收不到
onPlayError
回调?
答:在 mediaPlayer 初始化以后设置 mediaPlayer delegate。
Q7:播放结束以后怎么怎么再次播放,不是让视频自动播放?
答:调用 start
方法。
Q8:为什么收不到播放进度
onProcessInterval
回调?
答:需要通过 setProcessInterval
设置时间间隔。
Q9:我调用了
seek
方法以后是不是必须resume ?
答:seek 以后是自动播放的,无需再次调用 resume
。
Q10:同一个实例能不能 load 两次 url,还是说 load 第二个 url 之前必须先 stop?
答:同一个实例需要 stop 之后才能再次 load, 不能连续 load 两次。
联系我们
文档反馈