亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

實例講解iOS音樂播放器DOUAudioStreamer用法

2019-10-21 18:42:52
字體:
來源:轉載
供稿:網友

好久沒有寫東西了,最近加班太嚴重,今天抽空把用到的音樂播放器DOUAudioStreamer整理一下,由于項目之前用的是AVPlayer,這個也可以,但是就是要先緩存一段時間再播放,老板看了之后要求,要變緩存變播放(有網時,點擊播放按鈕就立刻播放),怎么不早說!怎么不早說!怎么不早說!還能怎樣?只能原諒他,繼續敲代碼。。。。。。(還是直接上代碼吧)

一、導入三方庫

pod 'DOUAudioStreamer'

或者GitHup下載地址:https://github.com/douban/DOUAudioStreamer

二、使用

1.從demo中獲取NAKPlaybackIndicatorView文件和MusicIndicator.h和MusicIndicator.m 文件,并導入頭文件

//音樂播放#import "DOUAudioStreamer.h"#import "NAKPlaybackIndicatorView.h"#import "MusicIndicator.h"#import "Track.h"

如圖:

iOS,音樂播放器,DOUAudioStreamer

2.創建一個Track類,用于音樂播放的URL存放

iOS,音樂播放器,DOUAudioStreamer

3.需要的界面.h中,添加DOUAudioStreamer,并用單利來初始化

+ (instancetype)sharedInstance ;@property (nonatomic, strong) DOUAudioStreamer *streamer;

 

如圖:

iOS,音樂播放器,DOUAudioStreamer

在.m中實現:

static void *kStatusKVOKey = &kStatusKVOKey;static void *kDurationKVOKey = &kDurationKVOKey;static void *kBufferingRatioKVOKey = &kBufferingRatioKVOKey;@property (strong, nonatomic) MusicIndicator *musicIndicator;@property (nonatomic, strong) Track *audioTrack;+ (instancetype)sharedInstance { static HYNEntertainmentController *_sharedMusicVC = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{  _sharedMusicVC = [[HYNEntertainmentController alloc] init];  _sharedMusicVC.streamer = [[DOUAudioStreamer alloc] init]; });  return _sharedMusicVC;}

 

播放按鈕事件

#pragma mark ---音樂播放按鈕-(void)playMusicStart:(UIButton *)sender{  //通過按鈕獲取cell  MusicCollectionViewCell *musicCell = (MusicCollectionViewCell *)[[sender superview] superview]; if(_playFirst == 0){//_playFirst == 0首次播放,其他為暫停  NSURL *url = [NSURL URLWithString:HttpImgUrl(musicCell.model.musicUrl)];  _audioTrack.audioFileURL = url;  @try {   [self removeStreamerObserver];  } @catch(id anException){   }  //在DOUAudioStreamer進行播放時,必須先置為nil  _streamer = nil;  _streamer = [DOUAudioStreamer streamerWithAudioFile:_audioTrack];  [self addStreamerObserver];  [_streamer play]; } if([_streamer status] == DOUAudioStreamerPaused ||  [_streamer status] == DOUAudioStreamerIdle){  [sender setBackgroundImage:[UIImage imageNamed:@"music_play_icon"] forState:UIControlStateNormal];  [_streamer play];  }else{  [sender setBackgroundImage:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];  [_streamer pause];  } _playFirst++; }

 

對添加監聽

- (void)addStreamerObserver { [_streamer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:kStatusKVOKey]; [_streamer addObserver:self forKeyPath:@"duration" options:NSKeyValueObservingOptionNew context:kDurationKVOKey]; [_streamer addObserver:self forKeyPath:@"bufferingRatio" options:NSKeyValueObservingOptionNew context:kBufferingRatioKVOKey]; }/// 播放器銷毀- (void)dealloc{ if (_streamer !=nil) {  [_streamer pause];  [_streamer removeObserver:self forKeyPath:@"status" context:kStatusKVOKey];  [_streamer removeObserver:self forKeyPath:@"duration" context:kDurationKVOKey];  [_streamer removeObserver:self forKeyPath:@"bufferingRatio" context:kBufferingRatioKVOKey];    _streamer =nil; } }- (void)removeStreamerObserver {  [_streamer removeObserver:self forKeyPath:@"status"]; [_streamer removeObserver:self forKeyPath:@"duration"]; [_streamer removeObserver:self forKeyPath:@"bufferingRatio"];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == kStatusKVOKey) {  [self performSelector:@selector(updateStatus)      onThread:[NSThread mainThread]     withObject:nil    waitUntilDone:NO]; } else if (context == kDurationKVOKey) {  [self performSelector:@selector(updateSliderValue:)      onThread:[NSThread mainThread]     withObject:nil    waitUntilDone:NO]; } else if (context == kBufferingRatioKVOKey) {  [self performSelector:@selector(updateBufferingStatus)      onThread:[NSThread mainThread]     withObject:nil    waitUntilDone:NO]; } else {  [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; }}- (void)updateSliderValue:(id)timer {}-(void)updateBufferingStatus{ }- (void)updateStatus { //self.musicIsPlaying = NO; _musicIndicator.state = NAKPlaybackIndicatorViewStateStopped; switch ([_streamer status]) {  case DOUAudioStreamerPlaying:   // self.musicIsPlaying = YES;   _musicIndicator.state = NAKPlaybackIndicatorViewStatePlaying;   break;  case DOUAudioStreamerPaused:   break;  case DOUAudioStreamerIdle:   break;  case DOUAudioStreamerFinished:   break;  case DOUAudioStreamerBuffering:   _musicIndicator.state = NAKPlaybackIndicatorViewStatePlaying;   break;    case DOUAudioStreamerError:   break; } }

這樣就能播放了。

鎖屏時的音樂顯示、拔出耳機后暫停播放、監聽音頻打斷事件

-(void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];//接受遠程控制[self becomeFirstResponder];[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];}//這個不能忘記了-(BOOL)canBecomeFirstResponder{return YES;}- (void)viewDidLoad {[super viewDidLoad];//音樂播放器[self initPlayer];}#pragma mark =========================音樂播放==============================//音樂播放器-(void)initPlayer{_audioTrack = [[Track alloc] init];AVAudioSession *session = [AVAudioSession sharedInstance];[session setActive:YES error:nil];[session setCategory:AVAudioSessionCategoryPlayback error:nil];//讓app支持接受遠程控制事件[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];//添加通知,拔出耳機后暫停播放[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(routeChange:) name:AVAudioSessionRouteChangeNotification object:nil];// 監聽音頻打斷事件[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:session];}// 監聽音頻打斷事件- (void)audioSessionWasInterrupted:(NSNotification *)notification{ //被打斷時if (AVAudioSessionInterruptionTypeBegan == [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue]){ [_streamer pause];UIButton *btn = (UIButton *)[self.view viewWithTag:2000];[btn setBackgroundImage:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];}else if (AVAudioSessionInterruptionTypeEnded == [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue]){}}// 拔出耳機后暫停播放-(void)routeChange:(NSNotification *)notification{NSDictionary *dic=notification.userInfo;int changeReason= [dic[AVAudioSessionRouteChangeReasonKey] intValue];//等于AVAudioSessionRouteChangeReasonOldDeviceUnavailable表示舊輸出不可用if (changeReason==AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {AVAudioSessionRouteDescription *routeDescription=dic[AVAudioSessionRouteChangePreviousRouteKey];AVAudioSessionPortDescription *portDescription= [routeDescription.outputs firstObject];//原設備為耳機則暫停if ([portDescription.portType isEqualToString:@"Headphones"]) {[_streamer pause];UIButton *btn = (UIButton *)[self.view viewWithTag:2000];[btn setBackgroundImage:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];}}}//鎖屏時音樂顯示(這個方法可以在點擊播放時,調用傳值)- (void)setupLockScreenInfoWithSing:(NSString *)sign WithSigner:(NSString *)signer WithImage:(UIImage *)image{// 1.獲取鎖屏中心MPNowPlayingInfoCenter *playingInfoCenter = [MPNowPlayingInfoCenter defaultCenter];//初始化一個存放音樂信息的字典NSMutableDictionary *playingInfoDict = [NSMutableDictionary dictionary];// 2、設置歌曲名if (sign) {[playingInfoDict setObject:sign forKey:MPMediaItemPropertyAlbumTitle];}// 設置歌手名if (signer) {[playingInfoDict setObject:signer forKey:MPMediaItemPropertyArtist];}// 3設置封面的圖片//UIImage *image = [self getMusicImageWithMusicId:self.currentModel];if (image) {MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:image];[playingInfoDict setObject:artwork forKey:MPMediaItemPropertyArtwork];}// 4設置歌曲的總時長//[playingInfoDict setObject:self.currentModel.detailDuration forKey:MPMediaItemPropertyPlaybackDuration];//音樂信息賦值給獲取鎖屏中心的nowPlayingInfo屬性playingInfoCenter.nowPlayingInfo = playingInfoDict;// 5.開啟遠程交互[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];}//鎖屏時操作- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent {if (receivedEvent.type == UIEventTypeRemoteControl) {UIButton *sender = (UIButton *)[self.view viewWithTag:2000];switch (receivedEvent.subtype) {//判斷是否為遠程控制case UIEventSubtypeRemoteControlPause:[[HYNEntertainmentController sharedInstance].streamer pause];[sender setBackgroundImage:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];break;case UIEventSubtypeRemoteControlStop:break;case UIEventSubtypeRemoteControlPlay:[[HYNEntertainmentController sharedInstance].streamer play];[sender setBackgroundImage:[UIImage imageNamed:@"music_play_icon"] forState:UIControlStateNormal];break;case UIEventSubtypeRemoteControlTogglePlayPause:break;case UIEventSubtypeRemoteControlNextTrack:break;case UIEventSubtypeRemoteControlPreviousTrack:break;default:break;}}}

整體圖片:

iOS,音樂播放器,DOUAudioStreamer

上圖為未播放

iOS,音樂播放器,DOUAudioStreamer

上圖為播放中

iOS,音樂播放器,DOUAudioStreamer

上圖為鎖屏時狀態

應該沒有什么要添加的了,暫時告一段落,有不足之處,可以在下方的留言區討論,感謝對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品久久久久久久玫瑰园| 日韩欧美在线中文字幕| 色老头一区二区三区| 亚洲视频在线播放| 欧美精品在线免费播放| 欧美激情精品久久久久久久变态| 欧美丰满老妇厨房牲生活| 最新的欧美黄色| 日韩中文字幕网| 亚洲激情成人网| 久久久人成影片一区二区三区观看| 国产精品久久婷婷六月丁香| 欧美激情啊啊啊| 国产91精品青草社区| 亚洲欧美精品一区| 欧美国产视频一区二区| 国产不卡av在线免费观看| 久久亚洲国产精品成人av秋霞| 日本亚洲精品在线观看| 一二美女精品欧洲| 久久久视频精品| 91久久精品国产91久久性色| 中文字幕日韩精品在线观看| 久久亚洲一区二区三区四区五区高| 色婷婷久久一区二区| 红桃视频成人在线观看| 亚洲成人久久久| 韩曰欧美视频免费观看| 国产在线视频2019最新视频| 国产一区二区三区在线免费观看| 日韩激情在线视频| 日韩av中文字幕在线播放| 日韩在线视频网站| 成人激情综合网| 欧美一级电影免费在线观看| 91av视频在线免费观看| 国产精品日本精品| 91地址最新发布| 亚洲男人av在线| 亚洲欧美日韩中文在线| 亚洲国产成人精品久久久国产成人一区| 亚洲男人天堂网| 久久夜色精品国产亚洲aⅴ| 成人国产精品免费视频| 欧美黄色片免费观看| 欧美三级xxx| 欧美黑人极品猛少妇色xxxxx| 在线观看欧美日韩| 久久亚洲成人精品| 永久免费看mv网站入口亚洲| 最近2019年手机中文字幕| 91中文字幕在线观看| 欧美最猛性xxxxx免费| 国产国产精品人在线视| 欧美孕妇孕交黑巨大网站| 国产精品久久久久aaaa九色| 亚洲qvod图片区电影| 亚洲欧洲第一视频| 全亚洲最色的网站在线观看| 亚洲人成人99网站| 欧美国产一区二区三区| 亚洲欧美日韩精品久久亚洲区| 2020欧美日韩在线视频| 亚洲国产毛片完整版| 国产在线一区二区三区| 美女精品久久久| 欧美资源在线观看| 欧美人与性动交| 欧美成人精品在线| 欧美丝袜一区二区三区| 成人精品视频99在线观看免费| 久久福利网址导航| 久久的精品视频| 51精品国产黑色丝袜高跟鞋| 欧美极品少妇与黑人| 亚洲最大的成人网| 亚洲最大福利视频网站| 国产精品美女久久久久久免费| 成人在线观看视频网站| 国内免费精品永久在线视频| 色yeye香蕉凹凸一区二区av| 91在线视频免费| 日韩福利视频在线观看| 日韩亚洲成人av在线| 日韩美女写真福利在线观看| 欧美在线观看www| 中文字幕精品影院| 日韩在线免费视频| 国产精品精品久久久| 欧美极品少妇xxxxx| 91国自产精品中文字幕亚洲| 国产精品吊钟奶在线| 国产欧美日韩最新| 亚洲精品久久久久久久久久久| 久久视频免费在线播放| 欧美高清videos高潮hd| 黄色成人av网| 欧美日韩中文字幕| 欧美视频在线免费看| 精品爽片免费看久久| 日韩精品中文字幕在线播放| 97香蕉超级碰碰久久免费软件| 国产999在线观看| 国产免费一区二区三区在线观看| 欧美日韩激情美女| 欧美丰满少妇xxxxx做受| 国产在线一区二区三区| 久久久久久97| 久久艹在线视频| 欧美专区在线播放| 精品成人69xx.xyz| 日韩精品在线免费观看| 亚洲自拍另类欧美丝袜| 久久亚洲精品毛片| 国产精品免费一区豆花| 91性高湖久久久久久久久_久久99| 日韩av大片免费看| 欧美国产日韩视频| 中文字幕一区二区精品| 欧美激情精品久久久久久黑人| 国产精品久久久久久久久久免费| 国产日韩欧美成人| 久久五月天综合| 久久久久久久久久久国产| 精品久久久久久亚洲精品| 欧美大片在线看免费观看| 久久精品国产欧美亚洲人人爽| 久久综合国产精品台湾中文娱乐网| 欧美成人高清视频| 日韩a**站在线观看| 日韩av三级在线观看| 久久亚洲春色中文字幕| 欧美最猛性xxxxx亚洲精品| 欧美激情女人20p| 国产精品欧美激情| 亚洲国产精品小视频| 国产精品九九九| 777国产偷窥盗摄精品视频| 国产精品丝袜久久久久久不卡| 久久av红桃一区二区小说| 国产精品黄色影片导航在线观看| 日韩欧美在线免费观看| 懂色av一区二区三区| 久久免费视频在线观看| 亚洲 日韩 国产第一| 日韩人体视频一二区| 国产日产欧美精品| 久久免费精品日本久久中文字幕| 亚洲综合日韩中文字幕v在线| 精品高清美女精品国产区| 91在线中文字幕| 久久久久久国产免费| 亚洲xxxxx| 国产成人精品视频在线| 精品国产一区二区在线| 在线亚洲国产精品网| 国产欧美精品一区二区三区介绍| 日韩av网站在线| 亚洲欧美中文日韩在线| 精品亚洲一区二区三区| 精品亚洲永久免费精品| 久久天堂电影网| 国产精品美女主播在线观看纯欲| 欧美高清视频免费观看|