ijkplayer k0.11.9 适用于 iOS、tvOS、macOS 三大平台,据说还会支持安卓平台。

下面介绍三种常用的集成 ijkplayer 的方式:

CocoaPods 集成

可通过 CocoaPods 快速集成到工程,方便快捷:

pod "IJKMediaPlayerKit", :podspec => 'https://github.com/debugly/ijkplayer/releases/download/k0.11.9/IJKMediaPlayerKit.spec.json'

直接集成

如果没有使用 CocoaPods 工具,可以在 Release 页面直接下载预编译好的 IJKMediaPlayerKit.zip 拖入工程使用。

Git 子模块集成

如果需要修改源码,则推荐通过 Git 子模块的形式管理,然后通过 CocoaPods 工具集成。假定子模块目录是 Submodules/ijkplayer,那么可以 pod 'IJKMediaPlayerKit', :path => 'Submodules/ijkplayer' 集成。

常用功能

日志级别

[IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_DEBUG];

播放

IJKFFOptions *options = [IJKFFOptions optionsByDefault];
//创建播放器
self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options];
//创建播放器渲染view
NSView <IJKVideoRenderingProtocol>*playerView = self.player.view;
playerView.frame = self.playerContainer.bounds;
playerView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
[self.playerContainer addSubview:playerView positioned:NSWindowBelow relativeTo:self.playerCtrlPanel];

//加载完毕自动播放
self.player.shouldAutoplay = YES;

//异步加载
[self.player prepareToPlay];

常用的选项

//直播时可以设置成无限读包
[options setPlayerOptionIntValue:1 forKey:@"infbuf"];
//缓冲队列空是否需要加载一些数据后才能播放,0即为有数据就播放
[options setPlayerOptionIntValue:1 forKey:@"packet-buffering"];
//视频帧处理不过来的时候丢弃一些帧达到同步的效果
[options setPlayerOptionIntValue:1 forKey:@"framedrop"];
//视频帧缓存数量上限
[options setPlayerOptionIntValue:6 forKey:@"video-pictq-size"];
//停止预加载的最小(未解码的)帧数
[options setPlayerOptionIntValue:50000      forKey:@"min-frames"];
//循环播放
[options setPlayerOptionIntValue:1      forKey:@"loop"];
//设置 mgeg-ts 视频 seek 时过滤非关键帧,能够解决花屏问题
[options setFormatOptionIntValue:1 forKey:@"seek_flag_keyframe"];
//设置探测数据上限,默认是 5000000,但是一些超高码率的视频会探测失败,或者探测信息不全
[options setFormatOptionValue:@"10000000" forKey:@"probesize"];
//设置 icy 信息更新间隔
[options setPlayerOptionValue:@"3500" forKey:@"icy-update-period"];
//开启 cvpixelbufferpool,可提升性能
[options setPlayerOptionIntValue:0      forKey:@"enable-cvpixelbufferpool"];
//使用硬件加速解码视频帧,降低 CPU 消耗
[options setPlayerOptionIntValue:1 forKey:@"videotoolbox_hwaccel"];
//复制硬解解码数据
[options setPlayerOptionIntValue:1 forKey:@"copy_hw_frame"];
//开启精准 seek,避免进度回退
[options setPlayerOptionIntValue:1 forKey:@"enable-accurate-seek"];
//精准 seek 超时时长,单位ms
[options setPlayerOptionIntValue:1500 forKey:@"accurate-seek-timeout"];
//调试时有用,展示相关指标
options.showHudView = self.shouldShowHudView;
//指定使用 HTTP 1.0 Basic auth 授权认证,可避免一次试探请求。重定向后仍旧有效
[options setFormatOptionValue:@"1" forKey:@"auth_type2"];
//指定请求ts文件时,额外继承m3u8请求时的哪些options;默认继承 "headers", "user_agent", "cookies", "http_proxy", "referer", "rw_timeout", "icy"
[options setFormatOptionValue:@"ijkapplication" forKey:@"seg_inherit_options"];
//设置cookie
[options setFormatOptionValue:@"test=cookie" forKey:@"cookies"];
//开启gzip压缩
[options setFormatOptionValue:@"Accept-Encoding: gzip, deflate" forKey:@"headers"];
//设置代理
[options setFormatOptionValue:@"http://127.0.0.1:8888" forKey:@"http_proxy"];
...

暂停/播放/停止

[self.player play/pause/stop];

快进快退

直接修改 currentPlaybackTime 属性

倍速播放

直接修改 playbackRate 属性

调节音量

直接修改 playbackVolume 属性

字幕

添加外挂字幕,最多可挂载512个

//挂载并激活字幕;本地网络均可
- (BOOL)loadThenActiveSubtitle:(NSURL*)url;
//仅挂载不激活字幕;本地网络均可
- (BOOL)loadSubtitleOnly:(NSURL*)url;
//批量挂载不激活字幕;本地网络均可
- (BOOL)loadSubtitlesOnly:(NSArray<NSURL*>*)urlArr;

相同路径的字幕重复挂载会失败;没有激活的字幕,可通过 - (void)exchangeSelectedStream:(int)streamIdx; 方法激活。

关闭字幕和关闭音视频流方式一样:

// k_IJKM_VAL_TYPE__VIDEO, k_IJKM_VAL_TYPE__AUDIO, k_IJKM_VAL_TYPE__SUBTITLE
- (void)closeCurrentStream:(NSString *)streamType;

调整字幕样式

给 subtitlePreference 属性赋值,支持设置字体,设置字体颜色,边框颜色,背景颜色等

设置画面填充模式

直接修改 scalingMode 属性

逐帧播放

[self.player stepToNextFrame];

音频延迟/字幕延迟

设定音频延迟直接修改 currentAudioExtraDelay 属性,单位s
设定字幕延迟直接修改 currentSubtitleExtraDelay 属性,单位s

获取视频时长

通过 duration 属性获取视频时长,单位:ms
通过 playableDuration 属性获取预加载时长,单位:s
通过 bufferingProgress 属性获取缓冲进度

获取视频时长

通过 currentDownloadSpeed 属性获取下载速度,单位:byte

截屏

截取当前显示画面

[self.player.view snapshot];

旋转画面

IJKSDLRotatePreference preference;
preference.type = IJKSDLRotateZ;
preference.degrees = 90;
self.player.view.rotatePreference = preference;
if (!self.player.isPlaying) {
    [self.player.view setNeedsRefreshCurrentPic];
}

修改画面色彩

IJKSDLColorConversionPreference preference;
preference.brightness = 1.0;
preference.saturation = 1.0;
preference.contrast = 1.0;
self.player.view.colorPreference = preference;
if (!self.player.isPlaying) {
    [self.player.view setNeedsRefreshCurrentPic];
}

设定画面比例

IJKSDLDARPreference preference;
preference.ratio = 16.0/9;
self.player.view.darPreference = preference;
if (!self.player.isPlaying) {
    [self.player.view setNeedsRefreshCurrentPic];
}

项目开源地址: https://github.com/debugly/ijkplayer/


牧码人
3 声望0 粉丝

just coding ...