AVPlayer 簡易播放器

最近工作需要用到媒體播放器,所以開始在看這方面的資料。
先是做了一個使用 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ì)。

Apple: AVFoundation Programming Guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容