iOS 本地視頻和網路視頻流播放,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/1o8hsgg6 密碼: zswp 如果串連失效,請發郵件: 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/1dFGM9uL 密碼: gxi6 如果串連失效,請發郵件: 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開發高手!!!解答您的問題!!!