1:下載ijkplayer包 https://github.com/Bilibili/ijkplayer疤估。
2:解壓 ijkplayer-master灾常, cd 到ijkplayer-master文件夾,執(zhí)行init-ios.sh做裙,等待下載ffmpeg結(jié)束岗憋。
3.在 ios/compile-ffmpeg.sh 中將FF_ALL_ARCHS_IOS8_SDK="armv7 i386 x86_64"
修改為:FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
4.在 ijkplayer-master 下的 config 中,打開(kāi) module-lite.sh
將 export COMMON_FF_CFG_FLAGS="COMMON_FF_CFG_FLAGS --enable-protocol=rtp"
并添加 export COMMON_FF_CFG_FLAGS="COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"
export COMMON_FF_CFG_FLAGS="”被簡(jiǎn)書轉(zhuǎn)義了锚贱,老鐵們看下圖自己補(bǔ)充仔戈。
image.png
5.cd 到ijkplayer-master文件夾下的ios文件夾執(zhí)行: ./compile-ffmpeg.sh clean 和 ./compile-ffmpeg.sh all。
6.運(yùn)行ios/IJKMediaPlayer.會(huì)在拧廊,"config.h" 中 "armv7/config.h"
image.png
將編譯后的文件拉到自己項(xiàng)目,導(dǎo)入對(duì)應(yīng)包:
image.png
使用:
//
// LiveController.m
// Bluetooth
//
// Created by 姬拉 on 2018/9/3.
// Copyright ? 2018年科技. All rights reserved.
//
#import "LiveController.h"
#import "View+Tools.h"
@interface LiveController ()
@property(nonatomic,strong) NSURL *url; //流媒體播放地址
@property(nonatomic,retain) id<IJKMediaPlayback> ijkPlayer; //播放器
@property(nonatomic,strong) UIView *playView; //播放區(qū)域
@end
@implementation LiveController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// 拉流地址
self.url= [NSURL URLWithString:@"rtsp://192.168.3.152:8000/h.264"];
//調(diào)整參數(shù)
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
[options setPlayerOptionIntValue:30 forKey:@"max-fps"];
[options setPlayerOptionIntValue:30 forKey:@"r"];
//跳幀開(kāi)關(guān)
[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"];
//自動(dòng)轉(zhuǎn)屏開(kāi)關(guān)
[options setFormatOptionIntValue:0 forKey:@"auto_convert"];
//重連次數(shù)
[options setFormatOptionIntValue:1 forKey:@"reconnect"];
//開(kāi)啟硬解碼
[options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];
//ijk播放器
self.ijkPlayer = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options];
//播放區(qū)域
self.playView = [[UIView alloc] initWithFrame:CGRectMake(10, 0, self.view.frame.size.width-20, 400)];
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];
}
UILabel*playlb=[[UILabel alloc]initWithFrame:CGRectMake(10, 500, 60, 60)];
[self.view addSubview:playlb];
playlb.backgroundColor=[UIColor redColor];
playlb.text=@"play";
[playlb addTarget:self action:@selector(fuck)];
}
-(void)fuck
{
[self.ijkPlayer pause];
[self.ijkPlayer stop];
[self.ijkPlayer play];
}
//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];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)loadData
{
}
@end