1.在对ijkplayer进行使用调试的时候(使用FFMoviePlayer),我发现输出栏中有:
===== options =====
player-opts : start-on-prepared = 1
player-opts : overlay-format = fcc-i420
player-opts : max-fps = 60
player-opts : framedrop = 0
player-opts : videotoolbox-max-frame-width = 960
player-opts : videotoolbox = 1
player-opts : video-pictq-size = 3
format-opts : ijkinject-opaque = 140449007406288
format-opts : user-agent = ijkplayer
format-opts : auto_convert = 0
format-opts : timeout = 30000000
format-opts : reconnect = 1
format-opts : safe = 0
codec-opts : skip_frame = 0
codec-opts : skip_loop_filter = 0
这就是当前player的一些选项,那么我们再看看ffoptions中包含的东西:
typedef enum IJKFFOptionCategory {
kIJKFFOptionCategoryFormat = 1,
kIJKFFOptionCategoryCodec = 2,
kIJKFFOptionCategorySws = 3,
kIJKFFOptionCategoryPlayer = 4,
} IJKFFOptionCategory;
这里的category就是对应上面的option的,那么我们怎么改变这些参数呢,我们继续往下看FFoptions:我们可以看到,作者提供了这样的设置接口给我们可以看到,作者提供了这样的设置接口给我们:
- (void)setOptionValue:(NSString *)value
forKey:(NSString *)key
ofCategory:(IJKFFOptionCategory)category;
- (void)setOptionIntValue:(int64_t)value
forKey:(NSString *)key
ofCategory:(IJKFFOptionCategory)category;
那么根据这个我们就可以在初始化播放器时对options进行调整:比如这样:
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
[options setOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@”skip_frame” ofCategory:kIJKFFOptionCategoryCodec];
[options setOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@”skip_loop_filter” ofCategory:kIJKFFOptionCategoryCodec];
[options setOptionIntValue:1 forKey:@”videotoolbox” ofCategory:kIJKFFOptionCategoryPlayer];
[options setOptionIntValue:60 forKey:@”max-fps” ofCategory:kIJKFFOptionCategoryPlayer];
_player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options];
这里要注意几个地方:
Options初始化不能少[IJKFFOptions optionsByDefault]
,然后可能由于一些误解可能会使用错函数:setvalue forkey,然后忽略了category,导致设置不成功。
至于ffmpeg内部的options呢就只能自己去configure里面设置了
2.ijkplayer和ffplay在打开rtmp串流视频时,大多数都会遇到5~10秒的延迟,在ffplay播放时,如果加上-fflags nobuffer可以缩短播放的rtmp视频延迟在1s内,而在IjkMediaPlayer中加入
mediaPlayer.setOption(1, "analyzemaxduration", 100L);
mediaPlayer.setOption(1, "probesize", 10240L);
mediaPlayer.setOption(1, "flush_packets", 1L);
mediaPlayer.setOption(4, "packet-buffering", 0L);
mediaPlayer.setOption(4, "framedrop", 1L);
1: 设置是否开启变调
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"soundtouch",isModifyTone?0:1);
2:设置是否开启环路过滤: 0开启,画面质量高,解码开销大,48关闭,画面质量差点,解码开销小
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC,"skip_loop_filter",isSkipLoopFilter?0:48L);
3:设置播放前的最大探测时间
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"analyzemaxduration",100L);
4:设置播放前的探测时间 1,达到首屏秒开效果
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"analyzeduration",1);
5:播放前的探测Size,默认是1M, 改小一点会出画面更快
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"probesize",1024*10);
6:每处理一个packet之后刷新io上下文
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"flush_packets",1L);
7: 是否开启预缓冲,一般直播项目会开启,达到秒开的效果,不过带来了播放丢帧卡顿的体验
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"packet-buffering",isBufferCache?1:0);
8:播放重连次数
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"reconnect",5);
9:最大缓冲大小,单位kb
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"max-buffer-size",maxCacheSize);
10:跳帧处理,放CPU处理较慢时,进行跳帧处理,保证播放流程,画面和声音同步
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"framedrop",5);
11:最大fps
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"max-fps",30);
12:设置硬解码方式
jkPlayer支持硬解码和软解码。 软解码时不会旋转视频角度这时需要你通过onInfo的what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED
去获取角度,自己旋转画面。或者开启硬解硬解码,不过硬解码容易造成黑屏无声(硬件兼容问题),下面是设置硬解码相关的代码
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);
13.SeekTo设置优化
某些视频在SeekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题,通俗一点就是FFMPEG不兼容,视频压缩过于厉害,seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
3.iOS端使用实例代码:
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
// Set param
[options setFormatOptionIntValue:1024 * 16 forKey:@"probsize"];
[options setFormatOptionIntValue:50000 forKey:@"analyzeduration"];
[options setPlayerOptionIntValue:0 forKey:@"videotoolbox"];
[options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_loop_filter"];
[options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_frame"];
if (_isLive) {
// Param for living
[options setPlayerOptionIntValue:3000 forKey:@"max_cached_duration"]; // 最大缓存大小是3秒,可以依据自己的需求修改
[options setPlayerOptionIntValue:1 forKey:@"infbuf"]; // 无限读
[options setPlayerOptionIntValue:0 forKey:@"packet-buffering"]; // 关闭播放器缓冲
} else {
// Param for playback
[options setPlayerOptionIntValue:0 forKey:@"max_cached_duration"];
[options setPlayerOptionIntValue:0 forKey:@"infbuf"];
[options setPlayerOptionIntValue:1 forKey:@"packet-buffering"];
}
```
> iOS开发者交流群:①群:446310206 ②群:426087546 (付费群, 介意勿加! 手机加群)