iOS 本地視頻和網路視頻流播放

来源:http://www.cnblogs.com/CoderEYLee/archive/2017/07/03/Object-C-0024.html
-Advertisement-
Play Games

需求:最近公司需要做一個樓宇對講的功能:門口機(連接WIFI)撥號對室內機(對應的WIFI)的設備進行呼叫,室內機收到呼叫之後將對收到的數據進行UDP廣播的轉發,手機(連接對應的WIFI)收到視頻流之後,實時的展示視頻數據(手機可以接聽,掛斷,手機接聽之後,室內機不展示視頻,只是進行轉發。) 簡單點 ...


需求:最近公司需要做一個樓宇對講的功能:門口機(連接WIFI)撥號對室內機(對應的WIFI)的設備進行呼叫,室內機收到呼叫之後將對收到的數據進行UDP廣播的轉發,手機(連接對應的WIFI)收到視頻流之後,實時的展示視頻數據(手機可以接聽,掛斷,手機接聽之後,室內機不展示視頻,只是進行轉發。)

簡單點說就是手機客戶端需要做一個類似於直播平臺的軟體,可以實時的展示視頻,實時的播放接收到的聲音數據,並且實時將手機麥克風收到的聲音回傳給室內機,室內機負責轉發給門口機。

之前從來做過視頻播放都是本地文件的直接播放,從來沒有做過網路視頻流的播放,百度了很多都是介紹框架怎麼使用的,按著它的流程是行不通的,沒有一個詳細的使用流程!!!想哭呀!!!

這篇文章說一下本地視頻文件播放和網路視頻播放以及三方框架的使用,有不對的地方歡迎指正!!!

 

#pragma mark -- 本地視頻文件播放

 

 

使用AVFoundation.framework 

 

第一步:導入框架AVFoundation.framework

//經過測試:不導入這個框架也能播放,在第三步使用的時候導入就行了,為了不出現未知的BUG還是乖乖的導入吧!!!

 

第二步: 拖入一個視頻文件到你的項目中

 

第三步: 代碼實現

 

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h> //需要導入框架

#define EYScreenWidth [[UIScreen mainScreen] bounds].size.width
#define EYScreenHeight [[UIScreen mainScreen] bounds].size.height

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.從mainBundle獲取test.mp4的具體路徑
    NSString * path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
    //2.文件的url
    NSURL * url = [NSURL fileURLWithPath:path];
    
    //3.根據url創建播放器(player本身不能顯示視頻)
    AVPlayer * player = [AVPlayer playerWithURL:url];
    
    //4.根據播放器創建一個視圖播放的圖層
    AVPlayerLayer * layer = [AVPlayerLayer playerLayerWithPlayer:player];
    
    //5.設置圖層的大小
    layer.frame = CGRectMake(0, 0, EYScreenWidth, EYScreenHeight);
    
    //6.添加到控制器的view的圖層上面
    [self.view.layer addSublayer:layer];
    
    //7.開始播放
    [player play];
}

@end

 

 

#pragma mark -- 網路視頻流播放

 

方式一:MobileVLCKit.framework

 

 第一步: 下載MobileVLCKit.framework

 1. 可以去百度官網地址,上面有詳細的編譯步驟,GitHub上面也有詳細的教程!!!--->之後直接進行第六步!!!

 2. 我已經編譯好了 真機和模擬器都可以使用的: MobileVLCKit.framework

 鏈接: https://pan.baidu.com/s/1o8hsgg6 密碼: zswp  如果連接失效,請發郵件: [email protected] 或下方留言!!!

 

第二步: 將下載下來的zip解壓,MobileVLCKit文件夾中的MobileVLCKit.framework 拖入到你的工程中

 

 

 

第四步: 選擇finish

 

 

 第五步:添加依賴庫

1:  AudioToolbox.framework

2:  VideoToolbox.framework

3:  CoreMedia.framework

4:  CoreVideo.framework

5:  CoreAudio.framework

6:  AVFoundation.framework

7:  MediaPlayer.framework

8:  libstdc++.6.0.9.tbd

9:  libiconv.2.tbd

10: libc++.1.tbd

11: libz.1.tbd

12: libbz2.1.0.tbd

 

共12個

完成之後如圖所示:

 

 

 

第六步: 使用框架

 

ViewController.h

 

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

//視頻流的路徑,外界傳過來的視頻流的地址
@property (nonatomic, copy) NSString * rtspPath;

@end

 

ViewController.m

 

#import "ViewController.h"
#import <MobileVLCKit/MobileVLCKit.h>

//屏幕寬高的巨集
#define EYScreenWidth [[UIScreen mainScreen] bounds].size.width
#define EYScreenHeight [[UIScreen mainScreen] bounds].size.height

@interface ViewController ()

//視頻播放
@property (nonatomic, strong) VLCMediaPlayer *player;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//1.創建播放視圖,模擬器測試會有問題!!!真機可以正常播放 UIView *videoView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, EYScreenWidth, EYScreenHeight)]; [self.view addSubview:videoView]; //2.創建播放器 self.player = [[VLCMediaPlayer alloc] initWithOptions:nil]; //3.設置播放圖層 self.player.drawable = videoView; //4.設置播放的路徑 self.player.media = [VLCMedia mediaWithURL:[NSURL URLWithString:self.rtspPath]]; //5.開始播放 [self.player play]; } - (void)dealloc { if (self.player.isPlaying) { [self.player stop]; } } @end

 

 第七步: 真機測試

 

Command + R 運行報錯

 

 

 在工程設置中,Setting搜索bitcode,將Yes修改為No

 

 

如果出現下圖錯誤,將對應文件的第38行代碼註釋掉就行了!

 

 

 

 

再次運行就是OK了!!!

如果不好使嘗試將ViewController.m----->ViewController.mm

如果上面的路徑是本地路徑的話,是可以播放本地視頻的!!!

 

 

 

方式二: IJKMediaFramework

 

第一步: 下載IJKMediaFramework

 1. 可以去百度官網地址,上面有詳細的編譯步驟,GitHub上面也有詳細的教程!!! -->之後直接進行第三步!!!

 2. 我已經編譯好了 真機和模擬器都可以使用的: IJKMediaFramework

鏈接: https://pan.baidu.com/s/1dFGM9uL 密碼: gxi6  如果連接失效,請發郵件: [email protected] 或下方留言!!!

 

 第二步: 將下載下來的IJK.zip解壓,IJK文件夾中的

1、IJKMediaFramework.framework

2、libcrypto.a

3、librtmp.a

4、libssl.a

總共4個拖入到你的工程中

 

第三步: 編寫代碼

 

ViewController.h

 

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

//視頻流的路徑
@property (nonatomic, copy) NSString * rtspPath;

@end

 

 

ViewController.m

 

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

// 巨集定義
#define EYScreenBounds [UIScreen mainScreen].bounds

@interface ViewController ()

@property (nonatomic, strong) IJKFFMoviePlayerController * ijkPlayer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //初始化播放控制器
    self.ijkPlayer = [[IJKFFMoviePlayerController alloc] initWithContentURLString:self.rtspPath withOptions:nil];

    //設置列印級別, 測試發現沒有什麼效果
    [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_DEBUG];

    //設置控制器的view大小
    self.ijkPlayer.view.frame = EYScreenBounds;

    //控制器的view添加到自身的view上面
    [self.view addSubview:self.ijkPlayer.view];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if (!self.ijkPlayer.isPlaying) {
        //播放
        [self.ijkPlayer prepareToPlay];
    }
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if (self.ijkPlayer.isPlaying) {
        //關閉
        [self.ijkPlayer shutdown];
    }
}

@end

 

註意點:方式一和方式二只能使用一個,因為他們兩個會有衝突,暫時沒有找到解決方案!!!(個人感覺應該是方式二中的.a與系統的.tbd有衝突)

 

 

 更多內容--> 博客導航 每周一篇喲!!!

 

 

 

有任何關於iOS開發的問題!歡迎下方留言!!!或者郵件[email protected] 雖然我不一定能夠解答出來,但是我會請教iOS開發高手!!!解答您的問題!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]使用方法 [2]基本用法 [3]原理分析 [4]擴展用法 ...
  • 多態(Polymorphism)按字面的意思就是“多種狀態”,同樣的行為(方法)在不同對象上有不同的狀態。在OOP中很多地方都要用到多態的特性,比如同樣是點擊滑鼠右鍵,點擊快捷方式、點擊桌面空白處、點擊任務欄等彈出的菜單都是不同的。 ...
  • 很多人在進入學習前端的時候(包括我自己),除了選擇學習合適的技術,還需要一個得(自)心(己)應(喜)手(歡)的開發工具,一個得心應手的開發工具除了可以令你的效率大大提高,也可以令你在寫代碼的時候,心情舒暢 O(∩_∩)O。 我的第一個前端開發工具就是Sublime Text ,說一說我對它的理解吧。 ...
  • 在字面量方式中,我們//之間包起來的所有的內容都是元字元,有的具有特殊意義,大部分都是代表本身含義的普通的元字元 為瞭解決上述想在正則裡面加上一個變數這樣的需求,我們只能使用實例創建的方式了 var reg = new RegExp("^\\d+"+name+"\\d+$","g") 字面量方式和實 ...
  • function busUpLoadImg(postUrl,id) { .......//省略部分不用修改 uploader.on('uploadSuccess', function(file) { $('#' + file.id).addClass('upload-state-done'); //... ...
  • 手機號碼: 電子郵箱: 身份證: 銀行卡: ...
  • 廢話不多說,直接進入主題,margin相關技巧。 1、設置元素水平居中:margin:x auto; 2、margin負值讓元素位移及邊框合併。 外邊距合併 指當兩個垂直外邊距相遇時,它們將形成一個外邊距。合併後的外邊距的高度等於兩個發生合併的外邊距的高度中的較大者。 解決外邊距合併的方法: a、使 ...
  • 這周末在家呆了兩天,正好中午閑暇時間繼續分享Angularjs相關,今天主要分享Angularjs總體介紹及數據綁定部分內容,下麵直接進入主題。 1、基本概念: AngularJS是為了剋服HTML在構建應用上的不足而設計的。HTML是一門很好的偽靜態文本展示設計的聲明式語言,但要構建WEB應用的話 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...