iOS - AVFoundation - 視頻播放

在iOS9之前,視頻播放使用MPMoviePlayerController來實(shí)現(xiàn)。
在iOS9之后,MPMoviePlayerController被廢棄了,取代它的是AVPlayerViewController

MPMoviePlayerController

MPMoviePlayerController包含在MediaPlayer.framwork框架中,可以實(shí)現(xiàn)本地視頻和網(wǎng)絡(luò)視頻的播放。MPMoviePlayerController和MPMoviePlayerViewController這2個(gè)類都可以實(shí)現(xiàn)視頻的播放,MPMoviePlayerViewController繼承自UIViewController,默認(rèn)有一個(gè)全屏播放的view,并且是自動(dòng)播放的。MPMoviePlayerController繼承自NSObject(一開始不知道在addChildViewController:的時(shí)候掛了),使用的時(shí)候需要設(shè)置view的frame

//
//  ViewController.m
//  MPMovicePlayerController
//
//  Created by yangguangyu on 16/8/18.
//  Copyright ? 2016年 yangguangyu. All rights reserved.
//

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

@interface ViewController ()
@property (nonatomic, strong) MPMoviePlayerController *player;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"LG 觀韻創(chuàng)意廣告 典雅中國風(fēng)_高清.mp4" ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
    
    [self playVideoWithUrl:url];
}

-(void)playVideoWithUrl:(NSURL *)url {
    //三句代碼就可以,并且自動(dòng)播放
    //    MPMoviePlayerViewController *viewPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
    //    [self addChildViewController:viewPlayer];
    //    [self.view addSubview:viewPlayer.view];
    
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
    self.player = player;
    player.view.frame = self.view.frame;
    [self.view addSubview:player.view];
    [player play];
}

@end

如果需要監(jiān)聽視頻的狀態(tài),可以進(jìn)頭文件看一下,里面有很多的通知可以用
KRVideoPlayer基于MPMoviePlayerController的第三方,需要的可以看一下

AVPlayerViewController

AVPlayerViewController在AVKit.framework中,用來替代MPMoviePlayerController。使用起來還是很簡單的,不過需要注意的是AVPlayer是在AVFoundation框架中的,導(dǎo)入的時(shí)候AVFoundation也需要導(dǎo)入。

//
//  ViewController.m
//  AVPlayer
//
//  Created by yangguangyu on 16/8/18.
//  Copyright ? 2016年 yangguangyu. All rights reserved.
//

#import "ViewController.h"
#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>
#import "MyAVPlayerViewController.h"


@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"LG 觀韻創(chuàng)意廣告 典雅中國風(fēng)_高清.mp4" ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
    
    AVPlayerViewController *vc = [[AVPlayerViewController alloc] init];
    vc.player = [[AVPlayer alloc] initWithURL:url];
    vc.view.frame = self.view.frame;
    [self addChildViewController:vc];//這句不寫貌似AVPlayerViewController也不會(huì)掛掉
    [self.view addSubview:vc.view];
    
    [vc.player play];
}
@end

如果需要自己定制一下播放器的界面,可以使用蘋果提供的AVPlayerLayer類來做。AVPlayerLayer這個(gè)類是CALayer 的子類,專門用來顯示AVPlayer的視頻播放。比較前面的直接用一個(gè)控制器要更加輕量級,最重要的是可以靈活的定制界面。

self.player = [[AVPlayer alloc] initWithURL:url];
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    layer.frame = self.view.frame;
    [self.view.layer addSublayer:layer];

提供幾個(gè)框架
VKVideoPlayer
ZFPlayer

ZFPlayer.png

BMPlayer
BMPlayer

ZFPlayer的swift版本


WMPlayer
WMPlayer

TYVideoPlayer
TYVideoPlayer

我關(guān)注的大神,很多分享

第三方框架

無論是MPMoviePlayerController還是AVPlayer來播放視頻都相當(dāng)強(qiáng)大,但是它也存在著一些不可回避的問題,那就是支持的視頻編碼格式很有限:H.264、MPEG-4,擴(kuò)展名(壓縮格式):.mp4、.mov、.m4v、.m2v、.3gp、.3g2等,如果是RMVB就不行了,我們可以借助第三方的框架來實(shí)現(xiàn)更多格式的支持VLC,FFmpeg

提供幾個(gè)框架
kxmovie 基于FFmpeg

kxmovie.png

ijkplayer直播的貌似很多都是用的這個(gè)

視頻錄制

iOS的視頻錄制可以通過2種方式
1.UIImagePickerController(視頻的錄制,以及圖片的拍攝,圖片選擇)
The UIImagePickerController class manages customizable, system-supplied user interfaces for taking pictures and movies on supported devices, and for choosing saved images and movies for use in your app.
從蘋果官方文檔中找的一句話,大概意思是說 UIImagePickerController可以用來拍照錄制視頻,或者用來選取以及保存的圖片和視頻

2.AVFoundation
AVFoundation提供了一些方便的類(AVAudioPlayer、AVAudioRecorder、AVPlayer)來讓我們使用,但是在視頻錄制的時(shí)候,相對來說就會(huì)復(fù)雜一些,沒有現(xiàn)成的可以直接調(diào)用。
AVFoundation錄制視頻的步驟:

  1. 輸入設(shè)備:麥克風(fēng),攝像頭,鍵盤...
  2. 輸出設(shè)備:解析數(shù)據(jù)
  3. 會(huì)話: 連接輸入和輸出設(shè)備
  4. 預(yù)覽(顯示)圖層:在屏幕上展示
//
//  ViewController.m
//  視頻錄制
//
//  Created by yangguangyu on 16/8/18.
//  Copyright ? 2016年 yangguangyu. All rights reserved.
//

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

@interface ViewController ()<AVCaptureFileOutputRecordingDelegate>
@property (nonatomic, strong) AVCaptureDeviceInput *input;
@property (nonatomic, strong) AVCaptureMovieFileOutput *output;
@property (nonatomic, strong) AVCaptureSession *session;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.輸入設(shè)備
    //指定是視頻輸入設(shè)備
    AVCaptureDevice *device = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo].firstObject;
    self.input = [[AVCaptureDeviceInput alloc] initWithDevice:device error:nil];
    
    //2.輸出設(shè)備  -- 用來解析數(shù)據(jù)
    /*
     AVCaptureMetadataOutput    //元數(shù)據(jù)(查的字典),應(yīng)該就是沒有進(jìn)過處理的數(shù)據(jù)
     AVCaptureFileOutput        //把數(shù)據(jù)當(dāng)做文件來處理
     AVCaptureMovieFileOutput   //把數(shù)據(jù)當(dāng)做視頻文件來處理
     AVCaptureVideoDataOutput   //把數(shù)據(jù)當(dāng)做視頻的data處理
     AVCaptureAudioDataOutput   //把數(shù)據(jù)當(dāng)做音頻的data處理
     AVCaptureStillImageOutput  //把數(shù)據(jù)當(dāng)做靜態(tài)圖片處理處理 -- layer顯示的時(shí)候就會(huì)是圖片,不再是視頻了
     */
    
    //指定是視頻文件輸出
    self.output = [[AVCaptureMovieFileOutput alloc] init];
    
    //3.會(huì)話
    self.session = [[AVCaptureSession alloc] init];
    //連接輸入設(shè)備
    if ([self.session canAddInput:self.input]) {
        [self.session addInput:self.input];
    }
    //連接輸出設(shè)備
    if ([self.session canAddOutput:self.output]) {
        [self.session addOutput:self.output];
    }
    
    //設(shè)置代理,監(jiān)聽輸出的數(shù)據(jù)
    NSURL *url = [NSURL fileURLWithPath:@"/Users/yangguangyu/Desktop/123.mp4"];
    NSLog(@"%@",url);
    [self.output startRecordingToOutputFileURL:url recordingDelegate:self];
    
    //4.預(yù)覽圖層
    AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    layer.frame = [UIScreen mainScreen].bounds;
    [self.view.layer addSublayer:layer];
    

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    if ([self.session isRunning]) {
        [self.session stopRunning];
    }else {
        [self.session startRunning];
    }
}

-(void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections {
    NSLog(@"開始錄制。。。");
}

-(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error {
    NSLog(@"%@",outputFileURL);
}

@end

上面的錄制視頻代碼有一個(gè)問題,不能調(diào)用代理方法,暫時(shí)先放一下,有時(shí)間再弄一下。
總結(jié):
UIImagePickerController,AVPlayerViewController和MPMoviePlayerController都是被蘋果進(jìn)一步的封裝,讓開發(fā)者可以用更少的學(xué)習(xí)成本來實(shí)現(xiàn)想要的功能。高度的封裝意味著在自定義這塊就會(huì)差一些,比如在二維碼的掃描這塊,雖然都是調(diào)用的攝像頭來獲取數(shù)據(jù)的,但是如果用UIImagePickerController就不能實(shí)現(xiàn)這個(gè)功能。

推薦:
Swift AVPlayer 播放網(wǎng)絡(luò)視頻之基礎(chǔ)篇
淺談iOS視頻播放的N種解決方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,278評論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內(nèi)容