1. 程式人生 > >基於LFLive實現rtmp推流到本地nginx伺服器

基於LFLive實現rtmp推流到本地nginx伺服器

基於之前搭建的nginx + rtmp伺服器,現在結合LFLivekit,編碼獲取攝像頭視屏,麥克風音訊編碼推流

首先先將需要準備的東西下載下來整合到你的工程中去

  1. 在github上下載LFLivekit整合到你的工程中去
    需要在工程中新增相應的framework

      • UIKit
      • Foundation
      • AVFoundation
      • VideoToolbox
      • AudioToolbox
      • libz
      • libstdc++
  2. 下載ijkPlayer,這個播放器現在好像直播的app大都有的這個,也是基於FFMpeg封裝的,也可以直接用FFMPeg +kxMovie 做播放器,FFMPeg + kxmovie 播放器的編譯方法我在另一篇中有寫過

    FFMPeg + kxmovie編譯ios平臺下使用 ijkplayer編譯方法還沒來的急記錄下來,下次寫了再來這裡補充,我這裡直接提供一個下載編譯好的IJKMediaFramework.framWork加入工程就可以使用

下面直接貼程式碼編碼程式碼
建立一個控制器繼承自viewController
匯入庫

#import <IJKMediaFramework/IJKMediaFramework.h>
#import "LFLiveKit.h"

在LFLivekit中,LFLiveSession 是一個主要用的類

在inteface 中宣告稱全域性的量

@property
(nonatomic ,strong)LFLiveSession *session;

使用setter方法

-(LFLiveSession *)session
{
     if (_session == nil) {
    //初始化session要傳入音訊配置和視訊配置
    //音訊的預設配置為:取樣率44.1 雙聲道
    //視訊預設解析度為360 * 640

    _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfigurationForQuality:LFLiveVideoQuality_Low1]]
; _session.preView = self.SmallView; _session.delegate = self; //是否輸出除錯資訊 _session.showDebugInfo = YES; } return _session; }

首先獲取系統的攝像頭許可權,獲取視屏資源

- (void)requestAccessForVideo
{
    __weak typeof (self) weakSelf = self;
    //判斷授權狀態
    AVAuthorizationStatus statues = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    switch (statues) {
        case AVAuthorizationStatusNotDetermined:{
            //發起授權請求
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
                if (granted) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                       //進行會話
                        [weakSelf.session setRunning:YES];
                    });
                }
            }];

            break;
        }
        case AVAuthorizationStatusAuthorized:{
            //已授權繼續
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf.session setRunning:YES];
            });
            break;
        }


        default:
            break;
    }

}

獲取音訊許可權與資源

- (void)requestAudio
{
    __weak typeof (self) weakSelf = self;
    AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
    switch (status) {
        case AVAuthorizationStatusNotDetermined:{
            //發起授權請求
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
                if (granted) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                       //進行會話
                        [weakSelf.session setRunning:YES];
                    });
                }
            }];
            break;
        }

        case AVAuthorizationStatusAuthorized:{
            //授權繼續
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf.session setRunning:YES];
            });
        }
        default:
            break;
    }

}

LFLivekit監聽delegate方法

#pragma mark ===session的delegate監聽連結異常
- (void)liveSession:(LFLiveSession *)session errorCode:(LFLiveSocketErrorCode)errorCode
{
    //彈出警告
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Warning" message:@"連結錯誤,請檢查IP地址" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *sure = [UIAlertAction actionWithTitle:@"sure" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [self.navigationController popViewControllerAnimated:YES];
    }];
    [alert addAction:sure];
    [self presentViewController:alert animated:YES completion:nil];
}

執行推流的方法

//推流

- (void)startLive
{
    //RTMP要設定推流地址
    LFLiveStreamInfo *stremInfo = [LFLiveStreamInfo new];
    stremInfo.url = @"rtmp://192.168.1.173:1935/rtmplive/room";
    [self.session startLive:stremInfo];
}
    //這裡的@"rtmp://192.168.1.173:1935/rtmplive/room";
    這個地址是我自己建立的nginx + rtmp本地的推流伺服器,在上一篇的block中有具體的介紹,這裡就不在說了其中192.168.1.173 是自己的電腦ip,開啟網路偏好設定即可檢視的到注意替換正確,不然推流會失敗

在viewdidload中呼叫就可以開啟攝像頭進行推流了,注意在plist檔案中新增攝像頭和麥克風的授權請求

- (void)viewDidLoad {
    [super viewDidLoad];
    //錄製端
    [self requestAccessForVideo];
    [self requestAudio];
    [self startLive];
    }

在播放的也頁面可以使用ijk 可以拉流
拉流的方法為


-(IJKFFMoviePlayerController *)player
{
    if (_player == nil) {
        IJKFFOptions *options = [IJKFFOptions optionsByDefault];
        _player = [[IJKFFMoviePlayerController alloc]initWithContentURLString:@"rtmp://192.168.1.173:1935/rtmplive/room" withOptions:options];
        //設定填充模式
        _player.scalingMode = IJKMPMovieScalingModeAspectFill;

        //設定播放檢視
        _player.view.frame = self.bigView.bounds;
        [self.bigView addSubview:_SmallView];
        //設定自動播放
        _player.shouldAutoplay = YES;
        [_player prepareToPlay];
    }
    return _player;
}


相關推薦

基於LFLive實現rtmp本地nginx伺服器

基於之前搭建的nginx + rtmp伺服器,現在結合LFLivekit,編碼獲取攝像頭視屏,麥克風音訊編碼推流 首先先將需要準備的東西下載下來整合到你的工程中去 在github上下載LFLivekit整合到你的工程中去 需要在工程中新增相應的frame

直播nginx伺服器搭建

nginx依賴pcre和zlib和openssl,分別去這兩個官方網站下載最新的版本. pcre下載頁面> zlib下載頁面> openssl下載頁面> 最後統一拷貝到某個目錄下 用命令解壓3個檔案

基於c++實現RTSP/RTMP元件PushStream簡介

技術在於交流、溝通,轉載請註明出處並保持作品的完整性。 原文:https://blog.csdn.net/hiwubihe/article/details/84639975  [本系列相關文章]   本篇介紹一個基於C++開發的RTSP/RTMP推流元件Pus

Mac搭建nginx+rtmp伺服器,通過ffmpeg實現視訊

最近在研究關於直播方面的技術,中間遇到很多坑,在此記錄一下,以免再次跳坑 1.安裝Homebrew 開啟終端, 檢視是否已經安裝了Homebrew, 直接終端輸入命令 man brew 如果Mac已經安裝了, 會顯示一些命令的幫助資訊. 此時 輸入Q退出即可, 直接進

nginx-rtmp-module授權機制實現直播多房間授權認證

假設nginx直播伺服器已經搭建完畢,如果還沒有搭建完畢可以查閱利用nginx的nginx-rtmp-module搭建流媒體直播伺服器這篇文章。在開發直播專案時推流應該是需要做許可權認證的,不是任何人都可以隨意向直播伺服器推流,這就需要許可權認證,實現起來也不復雜,只需要在nginx配置檔案中的rt

Nginx-RTMP(video)

Camera 採集資料 Camera負責採集資料,把採集來的資料交給 X264進行編碼打包給RTMP進行推流, Camera採集來的資料是NV21, 而X264編碼的輸入資料格式為I420格式。 NV21和I420都是屬於YUV420格式。而NV21是一種two-plane模式,即Y和UV分為兩個Pla

Nginx-RTMP(audio)

需要文中完整程式碼的可以前往Github上獲取,順便給個star唄。 AAC編碼 ​ 推送音訊跟推送視訊差不多,經過資料採集,編碼,然後通過RTMP推流。資料採集通常有兩種方式,一種是Java層的AudioRecord,另一種是native層opensl es;採集完後就是編碼,相比視訊比較簡單,編碼庫這

nginxrtmp

環境 安裝Homebrow ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 安裝nginx 下載nginx專案

ffmpeg多執行緒本地mp4 rtmp,h264+aac編碼

程式說明:使用了c++11的std執行緒,鎖,訊號量等東西,替換了pthread多執行緒。主要之前用windows下移植的linux發現多執行緒始終有問題,所以決定用原生的試試。不過現在想來,應該問題還是我佇列的設計問題。主要這裡有個坑,就是c語言for迴圈內部

java封裝FFmpeg命令,支援原生ffmpeg全部命令,實現FFmpeg多程序處理與多執行緒輸出控制(開啟、關閉、查詢),rtsp/rtmp、拉

前言: 之前已經對FFmpeg命令進行了封裝http://blog.csdn.net/eguid_1/article/details/51787646,但是當時沒有考慮到擴充套件性,所以總體設計不是太好,需要改動的地方也比較多,也不支援原生ffmpeg命令,所以本次版本推翻

EasyRTMP實現rtmp的基本協議流程

EasyRTMP介紹 EasyRTMP是結合了多種音視訊快取及網路技術的一個rtmp直播推流端,包括:圓形緩衝區(circular buffer)、智慧丟幀、自動重連、rtmp協議等等多種技術,能夠非常有效地適應各種平臺(Windows、Linux、ARM、A

ffmpeg rtmp nginx搭建的rtmp伺服器

1、利用nginx搭建的rtmp伺服器 下載nginx-rtmp-module模組,解壓 下載nginx,解壓 進入nginx目錄下,編譯安裝nginx支援rtmp流媒體配置 ./configure

搭建基於RTMP本地Nginx伺服器報錯homebrew/nginx was deprecated. This tap is now empty as all its form

最近搭建基於RTMP的本地Nginx伺服器,沒想到第一步克隆就報錯:homebrew/nginx was deprecated. This tap is now empty as all its formulae were migrated.具體如下:第一步使用: 1>

寫代碼實現直播

global tag double 掌握 點播 -i void turn duration 花滿樓原創 小白:你之前介紹過使用nginx來實現直播,使用攝像頭來錄制,這些知識已經可以做到推流了。 花滿樓:之前是使用ffmpeg命令來推流,控制度不夠高,現在以代碼的方式

基於SRS搭建RTMP直播媒體伺服器

軟體定位 SRS 定位是運營級的網際網路直播伺服器叢集,追求更好的概念完整性和最簡單實現的程式碼。 運營級:商業運營追求極高的穩定性、良好的系統對接、錯誤排查和處理機制。譬如日誌檔案格式、reload、系統 HTTP 介面、提供 init.d 指令碼、轉發、轉碼和邊緣回多源站

Holer實現外網訪問本地Nginx

外網訪問內網Nginx 內網主機上安裝了Nginx,只能在區域網內訪問,怎樣從公網也能訪問本地Nginx? 本文將介紹使用holer實現的具體步驟。 1. 準備工作 1.1 安裝並啟動Nginx 預設安裝的Nginx埠是80。 2. 實現步驟 2.1 下載並解壓holer軟體包 Holer軟體

RTMP及協議學習

前期準備 瞭解RTMP定義 RTMP是Real Time Messaging Protocol(實時訊息傳輸協議)的首字母縮寫。該協議基於TCP,是一個協議族,包括RTMP基本協議及RTMPT/RTMPS/RTMPE等多種變種。RTMP

FFMPEG RTMP分析

簡介 RTMP推流器(Streamer)的在流媒體系統中的作用可以用下圖表示。首先將視訊資料以RTMP的形式傳送到流媒體伺服器端(Server,比如FMS,Red5,Wowza等),然後客戶端(一般為Flash Player)通過訪問流媒體伺服器就可以收看實時流了。

FFmpeg-rtmp例子(著重解析函式,剖析FFmpeg流程)

致敬雷霄驊師兄,感謝他的引領入門,以下都是他的筆記的個人補充。 本文,記錄在根據雷霄驊的RTMP推流demo原始碼,學習FFmpeg的執行流程。 記錄如下: 1. 首先是記錄demo並做一點修改,同時推送audio和video至rtmp-server。 2.對此程式碼的關鍵

基於vlc進行攝像頭的細節

Stream with DirectShow (Windows) 基於DirectShow的流(Windows) Install your peripheral drivers You need to install your peripherals under Wi