IJKPlayer通过IJKFFMoviePlayerController管理播放器。
IJKFFMoviePlayerController里的代码过多,无法梳理。通过删除代码,保留核心,可以了解其调用方式。
#import "IJKMediaPlayback.h"
#import "IJKFFOptions.h"
@interface LivePlayerController : NSObject <IJKMediaPlayback>
- (id)initWithContentURL:(NSURL *)aUrl withOptions:(IJKFFOptions *)options;
@end
#import "LivePlayerController.h"
#import <UIKit/UIKit.h>
#import "IJKFFMoviePlayerDef.h"
#import "IJKAudioKit.h"
@implementation LivePlayerController
{
IjkMediaPlayer * _mediaPlayer;
IJKSDLGLView * _glView;
NSString * _urlString;
}
@synthesize view = _view;
- (instancetype)initWithContentURL:(NSURL *)aUrl withOptions:(IJKFFOptions *)options {
if (aUrl == nil) {
return nil;
}
// Detect if URL is file path and return proper string for it
NSString *aUrlString = [aUrl isFileURL] ? [aUrl path] : [aUrl absoluteString];
self = [super init];
if (self) {
// 初始化
ijkmp_global_init();
_urlString = aUrlString;
// 创建播放器(结构体类型的对象)
_mediaPlayer = ijkmp_ios_create(copy_media_player_msg_loop);
// 创建播放控件(画面将在这个控件中显示)
_glView = [[IJKSDLGLView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 播放控件右侧不显示调试信息
_glView.shouldShowHudView = NO;
// 公开播放控件,使其可调用于其他页面
_view = _glView;
// 关联播放器和播放控件(播放控件的画面将由播放器管理)
ijkmp_ios_set_glview(_mediaPlayer, _glView);
// 初始化音频
[[IJKAudioKit sharedInstance] setupAudioSession];
}
return self;
}
- (void)prepareToPlay {
if (!_mediaPlayer) {
return;
}
// 设置播放器的数据来源(直播地址)
ijkmp_set_data_source(_mediaPlayer, [_urlString UTF8String]);
// 开始播放
ijkmp_prepare_async(_mediaPlayer);
}
- (void)shutdown {
if (!_mediaPlayer) {
return;
}
// 停止播放
ijkmp_stop(_mediaPlayer);
// 关闭播放器
ijkmp_shutdown(_mediaPlayer);
// 销毁播放器
ijkmp_dec_ref_p(&_mediaPlayer);
}
int copy_media_player_msg_loop(void * arg) {
return 0;
}
@end