在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的swift版本
我關(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
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錄制視頻的步驟:
- 輸入設(shè)備:麥克風(fēng)帜羊,攝像頭,鍵盤...
- 輸出設(shè)備:解析數(shù)據(jù)
- 會(huì)話: 連接輸入和輸出設(shè)備
- 預(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種解決方案