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è)控制器要更加輕量級(jí)早龟,最重要的是可以靈活的定制界面。

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í)候嘀略,相對(duì)來說就會(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末因俐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子周偎,更是在濱河造成了極大的恐慌,老刑警劉巖撑帖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓉坎,死亡現(xiàn)場離奇詭異,居然都是意外死亡胡嘿,警方通過查閱死者的電腦和手機(jī)蛉艾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷敌,“玉大人勿侯,你說我怎么就攤上這事〗陕蓿” “怎么了助琐?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長面氓。 經(jīng)常有香客問我兵钮,道長,這世上最難降的妖魔是什么舌界? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任掘譬,我火速辦了婚禮,結(jié)果婚禮上呻拌,老公的妹妹穿的比我還像新娘葱轩。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布靴拱。 她就那樣靜靜地躺著垃喊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缭嫡。 梳的紋絲不亂的頭發(fā)上缔御,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音妇蛀,去河邊找鬼耕突。 笑死,一個(gè)胖子當(dāng)著我的面吹牛评架,可吹牛的內(nèi)容都是我干的眷茁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼纵诞,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼上祈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浙芙,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤登刺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嗡呼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纸俭,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年南窗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揍很。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡万伤,死狀恐怖窒悔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敌买,我是刑警寧澤简珠,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站放妈,受9級(jí)特大地震影響北救,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芜抒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一珍策、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宅倒,春花似錦攘宙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疗绣。三九已至,卻和暖如春铺韧,著一層夾襖步出監(jiān)牢的瞬間多矮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工哈打, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塔逃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓料仗,卻偏偏與公主長得像湾盗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子立轧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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