特色:實現簡單, 成本也低css
邊下邊播, 不會保存文件,特色:流過就沒有了.經常使用的協議有兩個,分別爲HLS
(HTTP Live Streaming) 和 RTMP
(Real Time Messaging Protocol)ios
HLS
(HTTP Live Streaming),Apple的動態碼率自適應技術。主要用於Mac和iOS音視頻服務。包括一個m3u(8)的索引文件(.M3u8),多個TS媒體分片文件(.ts)和key加密串文件。支持推流和播放. iOS自帶的播放器就能夠直接播放基於HLS
協議的視頻.git
RTMP是Real Time Messaging Protocol(實時消息傳輸協議)的首字母縮寫。該協議基於TCP,是一個協議族,包括RTMP基本協議及RTMPT/RTMPS/RTMPE等多種 變種。RTMP是一種設計用來進行實時數據通訊的網絡協議,主要用來在Flash/AIR平臺和支持RTMP協議的流媒體/交互服務器之間進行音視頻和數 據通訊.github
RTMP
協議下的視頻播放bilibili
對開源框架FFmpeg(一個基於C的軟解碼視頻播放開源框架)的封裝.他使用起來更加方便和簡單.ijkplayer
#下載 ijkplayer-ios git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios #到` ijkplayer-ios`目錄中 cd ijkplayer-ios #切換到 `k0.5.1` 分支 git checkout -B latest k0.5.1 #運行iOS初始化腳本 ./init-ios.sh #進入到 iOS 文件夾 cd iOS #清空編譯 ./compile-ffmpeg.sh clean #編譯所有,比較耗時,須要等待 ./compile-ffmpeg.sh all #使用Xcode打開ios文件夾下面的 IJKMediaPlayer 項目,分別在模擬器和真機上編譯IJKMediaFramework.framework.
編譯後一個用於模擬器一個用於真機安全
附: 若是你想把兩個framework進行合併,可使用lips -create 文件1 文件2 -o 要生成文件
服務器
注意:在測試階段可使用合併後的framework,當打包時候最好只使用真機的framework以減少安裝包的大小
網絡
IJKMediaFramework.framework
的基本使用- (void)viewDidLoad { [super viewDidLoad]; //1. 根據當前環境設置日誌信息 //1.1若是是Debug狀態的 #ifdef DEBUG // 設置報告日誌 [IJKFFMoviePlayerController setLogReport:YES]; // 設置日誌的級別爲Debug [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_DEBUG]; //1.2不然(若是不是debug狀態的) #else // 設置不報告日誌 [IJKFFMoviePlayerController setLogReport:NO]; // 設置日誌級別爲信息 [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_INFO]; #endif // 2. 檢查版本是否匹配 [IJKFFMoviePlayerController checkIfFFmpegVersionMatch:YES]; // 3. 建立IJKFFMoviePlayerController // 3.1 默認選項配置 IJKFFOptions *options = [IJKFFOptions optionsByDefault]; // 3.2 建立播放控制器 IJKFFMoviePlayerController *ffMoviePlayerController = [[IJKFFMoviePlayerController alloc] initWithContentURLString:@"rtmp://192.168.41.35:1935/gzhm/room" withOptions: options]; //4. 屏幕適配 // 4.1 設置播放視頻視圖的frame與控制器的View的bounds一致 self.player.view.frame = self.view.bounds; // 4.2 設置適配橫豎屏(設置四邊固定,長寬靈活) self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; // 4.3 設置播放視圖的縮放模式 self.player.scalingMode = IJKMPMovieScalingModeAspectFit; // 4.4 設置自動播放 self.player.shouldAutoplay = YES; // 4.5 自動更新子視圖的大小 self.view.autoresizesSubviews = YES; // 4.6 添加播放視圖到控制器的View [self.view addSubview:self.player.view]; } #pragma mark - 視圖即將顯示 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 當試圖即將展現的時候開始播放 [self.player prepareToPlay]; } #pragma mark - 視圖已經消失 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; // 關閉播放 [self.player shutdown]; }
- (IBAction)play:(id)sender { // 播放 [self.player play]; } - (IBAction)pause:(id)sender { // 暫停 [self.player pause]; }
IJKFFMoviePlayerController
支持的通知有不少,常見的有:app
IJKMPMoviePlayerLoadStateDidChangeNotification(加載狀態改變通知)
IJKMPMoviePlayerPlaybackDidFinishNotification(播放結束通知)
IJKMPMoviePlayerPlaybackStateDidChangeNotification(播放狀態改變通知)
框架
步驟:less
在viewWillAppear
添加監聽
// 1. 添加播放狀態改變的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateDidChange:) name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];
實現監聽方法
- (void) playbackStateDidChange:(NSNotification *) notification { // NSLog(@"%@",notification); // IJKMPMoviePlaybackStateStopped, 中止 // IJKMPMoviePlaybackStatePlaying, 正在播放 // IJKMPMoviePlaybackStatePaused, 暫停 // IJKMPMoviePlaybackStateInterrupted, 打斷 // IJKMPMoviePlaybackStateSeekingForward, 快進 // IJKMPMoviePlaybackStateSeekingBackward 快退 switch (self.player.playbackState) { case IJKMPMoviePlaybackStateStopped: NSLog(@"中止"); break; case IJKMPMoviePlaybackStatePlaying: NSLog(@"正在播放"); break; case IJKMPMoviePlaybackStatePaused: NSLog(@"暫停"); break; case IJKMPMoviePlaybackStateInterrupted: NSLog(@"打斷"); break; case IJKMPMoviePlaybackStateSeekingForward: NSLog(@"快進"); break; case IJKMPMoviePlaybackStateSeekingBackward: NSLog(@"快退"); break; default: break; } }
viewDidDisappear
移除監聽 [[NSNotificationCenter defaultCenter] removeObserver:self name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];