https://superdanny.link/2017/05/09/iOS-IJKPlayer/
2017-05-09
公司以前的直播业务是用Flash开发。为了适应趋势,从去年开始,公司打算使用原生进行开发。这里整理了一些相关的资料。对自己以后也许有所帮助。所谓前人种树,后人乘凉。在此,感谢所有默默无闻分享自己一线经验的老前辈们。
IJKFFOptions
参数说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
//打开h265硬解 ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-hevc", 1); /*-------------CodecOption-------------*/ //解码参数,画面更清晰 [options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_loop_filter"]; [options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_frame"]; //以下是直播、点播参数设置不同 if (直播) { // Param for living //最大缓存大小是3秒,可以依据自己的需求修改 [options setPlayerOptionIntValue:3000 forKey:@"max_cached_duration"]; //无限读 [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"]; } /*-------------PlayerOption-------------*/ //在视频帧处理不过来的时候丢弃一些帧达到同步的效果 //跳帧开关,如果cpu解码能力不足,可以设置成5,否则会引起音视频不同步,也可以通过设置它来跳帧达到倍速播放 [options setPlayerOptionIntValue:5/*0*/ forKey:@"framedrop"]; //最大fps [options setPlayerOptionIntValue:30 forKey:@"max-fps"]; //帧速率(fps) 可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97 [options setPlayerOptionIntValue:29.97 forKey:@"r"]; //设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推) [options setPlayerOptionIntValue:512 forKey:@"vol"]; //指定最大宽度 [options setPlayerOptionIntValue:960 forKey:@"videotoolbox-max-frame-width"]; //开启/关闭 硬解码(硬件解码CPU消耗低。软解,更稳定) [options setPlayerOptionIntValue:0 forKey:@"videotoolbox"]; //是否有声音 [options setPlayerOptionIntValue:1 forKey:@"an"]; //是否有视频 [options setPlayerOptionIntValue:1 forKey:@"vn"]; //每处理一个packet之后刷新io上下文 [options setPlayerOptionIntValue:1 forKey:@"flush_packets"]; //是否禁止图像显示(只输出音频) [options setPlayerOptionIntValue:1 forKey:@"nodisp"]; // [options setPlayerOptionIntValue:0 forKey:@"start-on-prepared"]; // [options setPlayerOptionIntValue:@"fcc-_es2" forKey:@"overlay-format"]; // [options setPlayerOptionIntValue:3 forKey:@"video-pictq-size"]; // [options setPlayerOptionIntValue:25 forKey:@"min-frames"]; /*-------------FormatOption-------------*/ //如果是rtsp协议,可以优先用tcp(默认是用udp) [options setFormatOptionValue:@"tcp" forKey:@"rtsp_transport"]; //播放前的探测Size,默认是1M, 改小一点会出画面更快 [options setFormatOptionIntValue:1024*16*0.5 forKey:@"probsize"]; //播放前的探测时间 [options setFormatOptionIntValue:50000 forKey:@"analyzeduration"]; //自动转屏开关 [options setFormatOptionIntValue:0 forKey:@"auto_convert"]; //重连次数 [options setFormatOptionIntValue:1 forKey:@"reconnect"]; //超时时间,timeout参数只对http设置有效。若果你用rtmp设置timeout,ijkplayer内部会忽略timeout参数。rtmp的timeout参数含义和http的不一样。 [options setFormatOptionIntValue:30 * 1000 * 1000 forKey:@"timeout"]; // [options setFormatOptionIntValue:@"nobuffer" forKey:@"fflags"]; // [options setFormatOptionIntValue:@"ijkplayer" forKey:@"user-agent"]; // [options setFormatOptionIntValue:0 forKey:@"safe"]; // [options setFormatOptionIntValue:0 forKey:@"http-detect-range-support"]; // [options setFormatOptionIntValue:4628439040 forKey:@"ijkapplication"]; // [options setFormatOptionIntValue:6176477408 forKey:@"ijkiomanager"]; |
skip_loop_filter
参数相关
1 2 3 4 5 6 7 8 9 10 11 |
// for codec option 'skip_loop_filter' and 'skip_frame' typedef enum IJKAVDiscard { /* We leave some space between them for extensions (drop some * keyframes for intra-only or drop just some bidir frames). */ IJK_AVDISCARD_NONE =-16, ///< discard nothing IJK_AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi IJK_AVDISCARD_NONREF = 8, ///< discard all non reference IJK_AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames IJK_AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes IJK_AVDISCARD_ALL = 48, ///< discard all } IJKAVDiscard; |
前面两个都看得懂
第三个是抛弃非参考帧(I帧)
第四个是抛弃B帧
第五个是抛弃除关键帧以外的,比如B,P帧
第六个是抛弃所有的帧,这我就奇怪了,之前Android默认的就是48,难道把所有帧都丢了?
那就没有视频帧了,所以应该不是这么理解,应该是skip_loop_filter和skip_frame的对象要过滤哪些帧类型。skip_loop_filter这个是解码的一个参数,叫环路滤波,设置成48和0,图像清晰度对比,0比48清楚,理解起来就是,0是开启了环路滤波,过滤的是大部分,而48基本没启用环路滤波,所以清晰度更低,但是解码性能开销小
skip_loop_filter(环路滤波)简言之:
a:环路滤波器可以保证不同水平的图像质量。
b:环路滤波器更能增加视频流的主客观质量,同时降低解码器的复杂度。具体参考:
http://blog.csdn.net/h514434485/article/details/52241778
http://www.cnblogs.com/TaigaCon/p/5500110.html
skip_frame我没完全理解意思,应该是等同上面这个类似。
//播放前的探测时间
[options setFormatOptionIntValue:1 forKey:@”analyzeduration”];
//开启硬解码(硬件解码CPU消耗低。软解,更稳定)
[options setPlayerOptionIntValue:1 forKey:@”videotoolbox”];
软编解码:使用CPU进行编解码,大多使用FFmpeg来编码和解压音视频数据;
硬编解码:主要使用非CPU进行编解码,如GPU等。在使用中,大多直接调用系统API进行音视频编解码处理。
优点 | 缺点 | |
---|---|---|
软编 解码 |
在不同的设备、系统版本中兼容性极高; 解码时,色彩还原度更高; 编解码过程可扩展性强; |
CPU占用高,手机易发热,耗电量大。 |
硬编 解码 |
系统占用少,执行效率高。 | 兼容性低,需根据硬件厂商和系统版本单独适配; 可控性比较差; |
综合以上情况,在推流方面,iOS系统和硬件设备统一性高,使用全硬编方案效果更好;Android因机型繁杂,支持程度不一,推荐4.3以上使用硬编。在播放解码方面,iOS硬解和软解支持性都较高,软解功耗更高,但是在部分细节方面表现较优,可控性强,具体视项目情况选择;Android推荐4.1版本以上使用硬解,以下版本使用软解。