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];
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。