ijkplayer一个开源库,基于ffmpeg,支持iOS硬解码
一、下载ijkplayer
地址: https://github.com/Bilibili/ijkplayer
二、进入 ijkplayer-master 文件夹
命令行执行 ./init-iso.sh 下载ffmpeg,时间较长 (网不好会很慢!)
三、编译配置(目的是开启rtsp支持)
在 ijkplayer-master 下的 config 中,打开 module-lite.sh
将 export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtp"
修改为 export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"
并添加 export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"
然后命令行执行:
rm module.sh
ln -s module-lite.sh module.sh
cd ..
cd ios
sh compile-ffmpeg.sh clean
sh compile-ffmpeg.sh all
等待编译结果...
四、打包framework ( iPhone6 plus )
进入 ijkplayer-master/ios/IJKMediaPlayer 打开工程
按下两图配置工程:
五、使用framework ( iPhone6 plus )
#import "ViewController.h"
#import
#define ScreenWidth [UIScreen mainScreen].bounds.size.width
#define ScreenHeight [UIScreen mainScreen].bounds.size.height
@interface ViewController ()
@property(nonatomic,strong) NSURL *url; //流媒体播放地址
@property(nonatomic,retain) id ijkPlayer; //播放器
@property(nonatomic,strong) UIView *playView; //播放区域
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.url = [NSURL URLWithString:@"rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov"];
//调整参数
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
[options setPlayerOptionIntValue:30 forKey:@"max-fps"];
[options setPlayerOptionIntValue:30 forKey:@"r"];
//跳帧开关
[options setPlayerOptionIntValue:1 forKey:@"framedrop"];
[options setPlayerOptionIntValue:0 forKey:@"start-on-prepared"];
[options setPlayerOptionIntValue:0 forKey:@"http-detect-range-support"];
[options setPlayerOptionIntValue:48 forKey:@"skip_loop_filter"];
[options setPlayerOptionIntValue:0 forKey:@"packet-buffering"];
[options setPlayerOptionIntValue:2000000 forKey:@"analyzeduration"];
[options setPlayerOptionIntValue:25 forKey:@"min-frames"];
[options setPlayerOptionIntValue:1 forKey:@"start-on-prepared"];
[options setCodecOptionIntValue:8 forKey:@"skip_frame"];
[options setFormatOptionValue:@"nobuffer" forKey:@"fflags"];
[options setFormatOptionValue:@"8192" forKey:@"probsize"];
//自动转屏开关
[options setFormatOptionIntValue:0 forKey:@"auto_convert"];
//重连次数
[options setFormatOptionIntValue:1 forKey:@"reconnect"];
//开启硬解码
[options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];
//ijk播放器
self.ijkPlayer = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options];
//播放区域
self.playView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
self.playView.backgroundColor = [UIColor blackColor];
[self.view addSubview:self.playView];
UIView *playingView = [self.ijkPlayer view];
playingView.frame = self.playView.bounds;
// playingView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.playView insertSubview:playingView atIndex:1];
//
[self.ijkPlayer setScalingMode:IJKMPMovieScalingModeFill];
[self installMovieNotificationObservers];
if(![self.ijkPlayer isPlaying]){
[self.ijkPlayer prepareToPlay];
}
}
//network load state changes
- (void)loadStateDidChange:(NSNotification *)notification{
IJKMPMovieLoadState loadState = self.ijkPlayer.loadState;
NSLog(@"LoadStateDidChange : %d",(int)loadState);
}
//when movie playback ends or a user exits playback.
- (void)moviePlayBackFinish:(NSNotification *)notification{
int reason = [[[notification userInfo] valueForKey:IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
NSLog(@"playBackFinish : %d",reason);
}
//
- (void)mediaIsPreparedToPlayDidChange:(NSNotification *)notification{
NSLog(@"mediaIsPrepareToPlayDidChange");
}
// when the playback state changes, either programatically or by the user
- (void)moviePlayBackStateDidChange:(NSNotification *)notification{
switch (_ijkPlayer.playbackState) {
case IJKMPMoviePlaybackStateStopped:
NSLog(@"playBackState %d: stoped", (int)self.ijkPlayer.playbackState);
break;
case IJKMPMoviePlaybackStatePlaying:
NSLog(@"playBackState %d: playing", (int)self.ijkPlayer.playbackState);
break;
case IJKMPMoviePlaybackStatePaused:
NSLog(@"playBackState %d: paused", (int)self.ijkPlayer.playbackState);
break;
case IJKMPMoviePlaybackStateInterrupted:
NSLog(@"playBackState %d: interrupted", (int)self.ijkPlayer.playbackState);
break;
case IJKMPMoviePlaybackStateSeekingForward:
break;
case IJKMPMoviePlaybackStateSeekingBackward:
break;
default:
break;
}
}
- (void)installMovieNotificationObservers{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(loadStateDidChange:)
name:IJKMPMoviePlayerLoadStateDidChangeNotification
object:self.ijkPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackFinish:)
name:IJKMPMoviePlayerPlaybackDidFinishNotification
object:self.ijkPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mediaIsPreparedToPlayDidChange:)
name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification
object:self.ijkPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackStateDidChange:)
name:IJKMPMoviePlayerPlaybackStateDidChangeNotification
object:self.ijkPlayer];
}
- (void)removeMovieNotificationObservers{
[[NSNotificationCenter defaultCenter] removeObserver:self
name:IJKMPMoviePlayerLoadStateDidChangeNotification
object:self.ijkPlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:IJKMPMoviePlayerPlaybackDidFinishNotification
object:self.ijkPlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification
object:self.ijkPlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:IJKMPMoviePlayerPlaybackStateDidChangeNotification
object:self.ijkPlayer];
}
六、优化