AVPlayer之音訊,視訊
AVPlayer介紹
AVPlayer屬於AVFoundation框架,它的強大之處在於,不僅能夠播放音訊,還可以播放視訊,支援本地和網鏈,而且使用起來非常方便.
AVPlayer之音訊
使用AVPlayer播放音訊必須知道的三個類
1.1 AVPlayer : 可以理解成播放器
1.2 AVPlayerItem : 播放器需要播放的資源,比如一首歌曲
1.3 CMTime : 記錄AVPlayerItem資源的播放進度以及這個資源的其他資訊,當你需要顯示播放進度的時候可以用到它,它本身是個結構體音訊播放示例
2.1 說明 : 此處只介紹一下簡單的使用過程
2.2 程式碼 :
AVPlayerManager.h
#import <Foundation/Foundation.h>
@interfaceAVPlayerManager : NSObject
+ (instancetype)shareManager;
- (void)musicPlayerWithURL:(NSURL *)playerItemURL;
- (void)pause;
@end
AVPlayerManager.m
#import "AVPlayerManager.h"
#import <AVFoundation/AVFoundation.h>
@interface AVAudioManager(){
BOOL isPlaying;//是否正在播放
BOOL isPrepare;//資源是否準備完畢
}
@property (nonatomic, strong) AVPlayer *player;//播放器
@end
@implementation AVAudioManager
//單例
+ (instancetype)shareManager{
static AVPlayerManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [AVPlayerManager new];
});
return manager;
}
//播放音訊的方法(下面會在控制器呼叫)
- (void)musicPlayerWithURL:(NSURL *)playerItemURL{
//建立要播放的資源
AVPlayerItem *playerItem = [[AVPlayerItem alloc]initWithURL:playerItemURL];
//新增觀察者
//當資源的status發生改變時就會觸發觀察者事件
[playerItem addObserver:self forKeyPath:@"status" options:(NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew) context:nil];
//播放當前資源
[self.player replaceCurrentItemWithPlayerItem:playerItem];
}
//播放
- (void)play{
if (!isPrepare) {
return;
}
[self.player play];
isPlaying = YES;
}
//暫停
- (void)pause{
if (!isPlaying) {
return;
}
[self.player pause];
isPlaying = NO;
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
AVPlayerItemStatus status = [change[@"new"] integerValue];
switch (status) {
case AVPlayerItemStatusReadyToPlay:
isPrepare = YES;
[self play];
break;
case AVPlayerItemStatusFailed:
NSLog(@"載入失敗");
break;
case AVPlayerItemStatusUnknown:
NSLog(@"未知資源");
break;
default:
break;
}
}
//播放器懶載入
-(AVPlayer *)player{
if (!_player) {
_player = [AVPlayer new];
}
return _player;
}
@end
#import "ViewController.h"
#import "AVPlayerManager.h"
@interface ViewController ()
@end
ViewController.m中呼叫單例裡的方法
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
AVPlayerManager *manger = [AVPlayerManager shareManager];
NSString *Path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp3"];//我在本地有一個1.mp3的歌曲,當然也可以直接連結網上的URL
NSURL *Url = [NSURL fileURLWithPath:Path];
[manger musicPlayerWithURL:Url];//根據url播放
}
@end
AVPlayer之視訊
使用AVPlayer播放視訊必須知道的三個類
1.1 AVPlayer : 同樣理解成播放器
1.2 AVPlayerItem : 同樣是播放器需要播放的資源,比如一首歌曲
1.3 AVPlayerLayer : 要顯示視訊我們就要把AVPlayerLayer物件加到要顯示的檢視的layer層上,因此我們只要能拿到AVPlayer的layer,然後把拿到的layer 賦值給 AVPlayerLayer物件即可視訊播放示例
2.1 說明 : 此處只介紹一下簡單的使用過程
2.2 程式碼 :
//建立一個item
AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"xxxxx.mp4"]];//以前用的連結丟了,自己找個添上吧
//初始化播放器
self.player = [[AVPlayer alloc] initWithPlayerItem:item];
//獲取播放器的layer
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
//設定播放器的layer
playerLayer.frame = self.view.frame;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
playerLayer.backgroundColor = [[UIColor blueColor] CGColor];
//講layer新增到當期頁面的layer層中
[self.view.layer addSublayer:playerLayer];
//播發器開始播放
[self.player play];
容易出現的問題:AVPlayer不釋放網路導致memory佔用越來越大
- 問題:當在專案中使用AVPlayer,可以正常播放的時候,此時你退出了播放器,即使播放器被置空,觀察者也已經移除,但是在Xcode中會發現播放器依然在快取資源,導致memory佔用越來越高.
- 解決方法(親測:可以解決)
2.1 在播放器走dealloc方法之前,重新把當前資源替換為nil[self.player replaceCurrentItemWithPlayerItem:nil];
2.2 然後播放器會走到下面的方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
此時播放器資源就不會是AVPlayerItemStatusReadyToPlay
狀態,就不會再繼續緩衝了
2.3 最後在dealloc方法裡面把通知中心之類的移除就好了(其實到上面一步已經解決問題了)
相關文章
- web音訊流轉發之音視訊直播Web音訊
- 帶你用AVPlayer實現音訊和視訊播放音訊
- 音視訊入門之音訊採集、編碼、播放音訊
- iOS AVPlayer之後臺連續播放視訊iOS
- iOS AVPlayer播放視訊的留白處理iOS
- iOS 基於AVPlayer自定義視訊播放器iOS播放器
- WebRTC系列之音訊的那些事Web音訊
- WebRTC 系列之音訊會話管理Web音訊會話
- iPhone程式設計之音訊播放iPhone程式設計音訊
- 一個基礎功能的視訊播放器(XXVideoPlayer)-AVPlayer封裝播放器IDE封裝
- iOS AVPlayer之無縫切換播放(類似今日頭條視訊播放效果)iOS
- MTK6577+Android之音訊(audio)移植Android音訊
- 視訊模組 視訊分析
- iOS 9音訊應用播放音訊之音量設定與聲道設定iOS音訊
- 音視訊--視訊入門
- iOS 視訊剪下、旋轉,視訊新增音訊、新增水印,視訊匯出iOS音訊
- 短視訊“音訊化”,音樂“視訊化”音訊
- 音視訊通訊——直播協議和視訊推流協議
- IOS音視訊(二)AVFoundation視訊捕捉iOS
- THINKPHP開發 優酷視訊網|線上視訊|PHP
- 【視訊分享】尚矽谷Java視訊教程_DubboJava
- 音視訊--音訊入門音訊
- 音視訊–音訊入門音訊
- 小程式音訊和視訊音訊
- HTML的音訊和視訊HTML音訊
- HTML 視訊HTML
- nginx視訊Nginx
- webscarab視訊Web
- JAVA視訊Java
- 針對Office 365的新型網路釣魚詐騙之音訊郵件音訊
- Android進階系列:八、自定義View之音訊抖動動效AndroidView音訊
- 短視訊seo優化,短視訊seo排名優化
- 尚矽谷Java視訊教程_SpringCloud視訊教程JavaSpringGCCloud
- 尚矽谷大資料視訊_Shell視訊教程大資料
- Android音視訊之MediaPlayer音視訊播放Android
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- iOS開發:音訊播放、錄音、視訊播放、拍照、視訊錄製iOS音訊
- Mac線上視訊音訊提取工具Mac音訊