最近工作需要用到媒體播放器坞古,所以開始在看這方面的資料。
先是做了一個使用 AVPlayer 播放網(wǎng)絡(luò)視頻的 Demo, 由于需要使用 rtsp 協(xié)議連接設(shè)備來進(jìn)行視頻實(shí)時播放,AVFoundation 并不對此進(jìn)行支持俐筋。
不過既然做了愉择,就還是做一下筆記吧。
如果需要簡單的播放 http 協(xié)議的網(wǎng)絡(luò)視頻膊畴,可以直接套用掘猿。
1. 基本步驟
1.1 自定義播放視圖
該視圖就是播放器的載體。
主要是要重設(shè)該視圖的 Layer唇跨,讓他成為 AVPlayerLayer稠通,才能用來播放視頻。
NJPreviewPlayerView.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface NJPreviewPlayerView : UIView
- (void)setPlayer:(AVPlayer *)player;
@end
NJPreviewPlayerView.m
#import "NJPreviewPlayerView.h"
#import "FFMpegPlayer.h"
@interface NJPreviewPlayerView()
@property (nonatomic) AVPlayer *player;
@end
@implementation NJPreviewPlayerView
+ (Class)layerClass {
return [AVPlayerLayer class];
}
- (AVPlayer*)player {
return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer *)player {
[(AVPlayerLayer *)[self layer] setVideoGravity:AVLayerVideoGravityResize];
[(AVPlayerLayer *)[self layer] setPlayer:player];
}
@end
1.2 配置與控制播放器
設(shè)置屬性 AVPlayer买猖,AVPlayerItem改橘。如果是本地視頻還有一個 AVAssets。
基本流程:配置 AVPlayerItem玉控,配置 AVPlayer飞主,監(jiān)聽 AVPlayerItem 狀態(tài),然后進(jìn)行播放高诺。
主要代碼在 configurationPlayer 以及 observeValueForKeyPath 中碌识。
NJPreviewPlayerView.h
#import <UIKit/UIKit.h>
#import "NJPreviewPlayerView.h"
@interface NJPreviewViewController : UIViewController
@end
NJPreviewPlayerView.m
#import "NJPreviewViewController.h"
@interface NJPreviewViewController ()
@property (weak, nonatomic) IBOutlet NJPreviewPlayerView *preview;
@property (nonatomic) AVPlayer * player;
@property (nonatomic) AVPlayerItem * playerItem;
@end
@implementation NJPreviewViewController
#pragma mark - Lift cycle
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self configurationPlayer];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
[self removeObservers];
}
#pragma mark - Preview
- (void)configurationPlayer {
NSURL * url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
self.playerItem = [AVPlayerItem playerItemWithURL:url];
self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
[self setObservers];
[self.preview setPlayer:self.player];
}
#pragma mark - KVO
- (void)setObservers {
[self.playerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
}
- (void)removeObservers {
[self.playerItem removeObserver:self forKeyPath:@"status"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if ([keyPath isEqualToString:@"status"]) {
NSLog(@"%@", self.playerItem.error);
switch (self.playerItem.status) {
case AVPlayerItemStatusReadyToPlay:
NSLog(@"AVPlayerItemStatusReadyToPlay");
[self.player play];
break;
case AVPlayerItemStatusUnknown:
NSLog(@"AVPlayerItemStatusUnknown");
break;
case AVPlayerItemStatusFailed:
NSLog(@"AVPlayerItemStatusFailed");
break;
}
}
}
@end
2. 參考資料
我用到的就是這么簡單的,所以沒有寫復(fù)雜虱而,但是其實(shí) AVFoundation 家族非常強(qiáng)大筏餐,錄音,錄像也可以用它來做牡拇。
具體參考官方文檔魁瞪,講得非常詳細(xì)。