首页 > 编程知识 正文

ijkplayer教程,ijkplayer缓存

时间:2023-05-03 17:17:50 阅读:268251 作者:833

1.在对ijkplayer进行使用调试的时候(使用FFMoviePlayer),我发现输出栏中有:

===== options =====player-opts : start-on-prepared = 1player-opts : overlay-format = fcc-i420player-opts : max-fps = 60player-opts : framedrop = 0player-opts : videotoolbox-max-frame-width = 960player-opts : videotoolbox = 1player-opts : video-pictq-size = 3format-opts : ijkinject-opaque = 140449007406288format-opts : user-agent = ijkplayerformat-opts : auto_convert = 0format-opts : timeout = 30000000format-opts : reconnect = 1format-opts : safe = 0codec-opts : skip_frame = 0codec-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 (付费群, 介意勿加! 手机加群)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。