iOS直播-播放基於RTMP協議的視頻

iOS直播-播放基於RTMP協議的視頻

 

流媒體協議介紹

1. 僞流媒體:

  • 漸進式下載 : 邊下邊存, 文件會保存
  • 使用http協議,也可以實現視頻播放, 也能快進快退等, 體驗上跟流媒體很像. 優酷, 土豆.這些網址就在使用這項技術.
  • 特色:實現簡單, 成本也低css

    2 流媒體:

    邊下邊播, 不會保存文件,特色:流過就沒有了.經常使用的協議有兩個,分別爲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實時消息傳送協議協議概述編輯
    RTMP(Real Time Messaging Protocol)實時消息傳送協議是Adobe Systems公司爲Flash播放器和服務器之間音頻、視頻和數據傳輸 開發的開放協議。
    它有多種變種:
    1. RTMP工做在TCP之上,默認使用端口1935;
    2. RTMPE在RTMP的基礎上增長了加密功能;
    3. RTMPT封裝在HTTP請求之上,可穿透防火牆;
    4. RTMPS相似RTMPT,增長了TLS/SSL的安全功能;

3. iOS實現基於視頻RTMP的視頻直播

3.1 RTMP協議的視頻播放

3.1.1 IJKPlayer簡介
  • 咱們使用Bilibili開源的IJKPlayer,來實現RTMP協議下的視頻播放
  • ijkplayer 是bilibili對開源框架FFmpeg(一個基於C的軟解碼視頻播放開源框架)的封裝.他使用起來更加方便和簡單.

3.1.2 下載並編譯iOS版的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.

編譯IJK.png


編譯後一個用於模擬器一個用於真機安全


IJKMediaFramework編譯結果.png


附: 若是你想把兩個framework進行合併,可使用lips -create 文件1 文件2 -o 要生成文件服務器


須要合併的文件.png


注意:在測試階段可使用合併後的framework,當打包時候最好只使用真機的framework以減少安裝包的大小網絡

3.1.3 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]; }
3.1.4 暫停與播放
- (IBAction)play:(id)sender { // 播放 [self.player play]; } - (IBAction)pause:(id)sender { // 暫停 [self.player pause]; }

效果圖.png
3.1.5 添加播放狀態的監聽

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];
相關文章
相關標籤/搜索