ijkplayer--簡易ios播放器和參數設置

[如果覺得文章有用,可以支持一下放眼直播]

一個最簡單的播放器的

  

//
//  ijkPlayerViewController.m
//  MediaPlayerDemo
//
//  Created by gongjia on 2017/2/24.
//

#import "ijkPlayerViewController.h"
#import "ControlView.h"
#import "MBProgressHUD.h"

#import "IJKMediaPlayer/IJKMediaPlayer.h"

@interface ijkPlayerViewController () <ControlViewDelegate>
@property (nonatomic, strong) ControlView *controlView;
@property(atomic, strong) id<IJKMediaPlayback> player;
@end

@implementation ijkPlayerViewController
{
    MBProgressHUD                *mbProgressHUD;
}

#define alertMsg(msg) UIAlertView *alertMsg = [[UIAlertView alloc] initWithTitle:@"提示" message:msg delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil]; [alertMsg show];

- (void)viewDidLoad {
    [super viewDidLoad];
    
    IJKFFOptions *options = [IJKFFOptions optionsByDefault]; //使用默認配置
    
    //硬解
    [options setPlayerOptionIntValue:0 forKey:@"videotoolbox"];
    
    //https測試鏈接: https://vod2.fangyan.tv/c07a0ccbd55e47dc.mp4
    NSURL * url = [NSURL URLWithString:@"http://vod2.fangyan.tv/39b943f69814af90.m3u8"];
    
    //初始化播放器,播放在線視頻
    self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options];
    
    //設置自適應布局
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    self.player.view.frame = self.view.bounds;
    
    //縮放模式為FILL
    self.player.scalingMode = IJKMPMovieScalingModeAspectFill;

    // 設置自動播放模式
    self.player.shouldAutoplay = YES;

    self.view.autoresizesSubviews = YES;
    [self.view addSubview:self.player.view];

}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // 啟動預播放操作
    [self.player prepareToPlay];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [self.player shutdown];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)dealloc {
    
}

@end

iOS端參數設置(和Android基本一樣):

//開啟硬件解碼
[options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];

// 設置音量大小,256為標準音量。(要設置成兩倍音量時則輸入512,依此類推)
[options setPlayerOptionIntValue:512 forKey:@"vol"];

// 最大fps
[options setPlayerOptionIntValue:30 forKey:@"max-fps"];

// 跳幀開關,如果cpu解碼能力不足,可以設置成5,否則
// 會引起音視頻不同步,也可以通過設置它來跳幀達到倍速播放
[options setPlayerOptionIntValue:0 forKey:@"framedrop"];

// 指定最大寬度,我沒試過
[options setPlayerOptionIntValue:960 forKey:@"videotoolbox-max-frame-width"];

// 自動轉屏開關,我沒試過
[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"];

// 幀速率(fps)  我沒試過(可以改,確認非標準楨率會導致音畫不同步,所以只能設定為15或者29.97)
[options setPlayerOptionIntValue:29.97 forKey:@"r"];
e.g. 直播設置: 

有幾個不同的接口:
setFormatOptionValue  
setPlayerOptionIntValue
setCodecOptionIntValue

    //如果是rtsp協議,可以優先用tcp(默認是用udp)
    [options setFormatOptionValue:@"tcp" forKey:@"rtsp_transport"];
    //播放前的探測Size,默認是1M, 改小一點會出畫面更快
    [options setFormatOptionIntValue:1024 * 16 forKey:@"probesize"];
    //播放前的探測時間
    [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"];
    
    Boolean _isLive = true;
    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"];
    }

Note: 這里有個比較有用的參數,skip_loop_filter

// 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我沒完全理解意思,應該是等同上面這個類似。

Android:設置和iOS基本一樣,接口不同而已,注意區屬性的分類,有的是formart的,有的是別的
比如下面這個OPT_CATEGORY_PLAYER

//可以打開h265硬解;
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-hevc", 1);

//開啟mediacodec硬解
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容