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


需求:最近公司需要做一個樓宇對講的功能:門口機(連接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/1ggwYyor 密碼: 9adf  如果連接失效,請發郵件: lieryangios@126.com 或下方留言!!!

 

第二步: 將下載下來的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/1ggwYyor 密碼: 9adf  如果連接失效,請發郵件: lieryangios@126.com 或下方留言!!!

 

 第二步: 將下載下來的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開發的問題!歡迎下方留言!!!或者郵件lieryangios@126.com 雖然我不一定能夠解答出來,但是我會請教iOS開發高手!!!解答您的問題!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM