iOS開發中適合新手學習的音樂播放器(帶DLNA功能)

一、需求

了解音樂播放器相關知識,熟悉相關邏輯,完成上一首,下一首,播放/暫停等基本功能。本文按照以上需求完成了一個小型的音樂播放器Demo,適合新手學習,大神可以繞道。

二、開發

1.開發第一步

這一步,我們先需要知道,完成一個音樂播放器要做哪些準備。

1.1 首先,我們要播放音樂,要一個播放的類,這個類是整個工程都只有一個,所以我們要設計成單例類。

1.2 其次,我們需要解決音樂源的問題,包括本地音樂與網絡音樂。怎么解決,請自己想辦法。

</br>

2.開發第二步

2.1 本地音樂

本文中的本地音樂是基于plist文件來實現的,通過讀取plist文件中的數據獲取,然后轉換成模型。


plist.png
-(NSMutableArray *)dataArray
{
    if (!_dataArray) {
        _dataArray = [[NSMutableArray alloc] initWithArray:[ZM_MusicModel mj_objectArrayWithFile:PlistPath]];
    }
    return _dataArray;
}

現在獲取到數據源了,tableview顯示就OK了。


本地列表

點擊cell進入播放頁面。


播放頁面

這是本地音樂的界面,搭建完成了。

2.2 網絡音樂

網絡音樂肯定就是從網上請求數據了,本文用的第三方庫有AFNetWorking(數據請求)、MJExtension(模型轉換)、MJRefresh(網絡數據刷新)和SDWebImage(網絡圖片加載)。


分類列表

網絡音樂列表.png

現在數據源有了,同樣是點擊cell跳轉到播放頁。現在可以去設計音樂播放器管理單例類了。

開發第三步

現在要設計單例類,單例類要做的事情有,播放/暫停音樂,上一首,下一首。暫時設計這三個主要功能,如果有其它的需求,自行添加。

3.1 單例類初始化

//初始化單例類
+(ZM_MusicManager *)shareMusicManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

-(instancetype)init
{
    self = [super init];
    if (self) {
        session = [AVAudioSession sharedInstance];
        //激活會話對象
        [session setActive:YES error:nil];
        //設置后臺播放
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
        _playList = [[NSMutableArray alloc] init];
    }
    return self;
}

3.2 播放與暫停

/**
 播放音樂

 @param playURL 音樂源地址
 @param index   播放列表下標
 */
-(void)playMusicWithURL:(NSURL *)playURL andIndex:(NSInteger)index
{
    NSError * error;
    NSData * data = [NSData dataWithContentsOfURL:playURL];
    //此處建議使用initWithData方法,不建議下面的initWithContentsOfURL方法
    self.audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];
    //self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    if(error){
        NSLog(@"data初始化方式出現錯誤,錯誤詳情:%@,進入URL初始化!",error);
        self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:playURL error:nil];
    }
     self.audioPlayer.delegate = self;
    if ([self.audioPlayer prepareToPlay]) {
        [self.audioPlayer play];
    }
}

/**
 暫停播放
 */
-(void)pausePlayMusic
{
    if ([self.audioPlayer isPlaying]) {
        [self.audioPlayer pause];
    }else{
        [self.audioPlayer play];
    }
}

3.3 上一首

其實上一首與下一首的思路很簡單,前面我們獲取到了音樂源,這是一個數組,這就是一個播放列表,然后數組是有下標的,我們通過下標遍歷數組就可以了。

/**
 上一首
 */
-(void)previousMusic
{
    _index --;
    NSURL * nextURL;
    if (_index < 0) {
        _index = self.playList.count - 1;
    }
    NSString * string = [NSString stringWithFormat:@"%@",[self.playList[_index] url]];
    NSArray * array = [string componentsSeparatedByString:@":"];
    if ([array[0] isEqualToString:@"http"]) {
        //網絡音樂
        nextURL  = [NSURL URLWithString:[NSString stringWithFormat:@"%@&ua=Iphone_Sst&version=4.239&netType=1&toneFlag=1",[self.playList[_index] url]]];
        
    }else{
        nextURL = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@",[_playList[_index] url]] withExtension:nil];
    }
    [self playMusicWithURL:nextURL andIndex:_index];

}

3.4 下一首

/**
 下一首
 */
-(void)nextMusic
{
    _index ++;
    NSURL * nextURL;
    if (_index > self.playList.count - 1) {
        _index = 0;
    }
    NSString * string = [NSString stringWithFormat:@"%@",[self.playList[_index] url]];
    NSArray * array = [string componentsSeparatedByString:@":"];
    if ([array[0] isEqualToString:@"http"]) {
        //網絡音樂
        nextURL  = [NSURL URLWithString:[NSString stringWithFormat:@"%@&ua=Iphone_Sst&version=4.239&netType=1&toneFlag=1",[self.playList[_index] url]]];
        
    }else{
        nextURL = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@",[_playList[_index] url]] withExtension:nil];
    }
    [self playMusicWithURL:nextURL andIndex:_index];
    
}

3.5 播放完一首歌后自動切換下一首歌

AVAudioPlayer有一個代理方法,可以在這個里面直接切換下一首。我們這里采用的是發通知告訴控制器,更改相應界面參數。

#pragma mark -AVAudioPlayerDelegate
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    //發送通知,告訴控制器音樂播放完了,切換下一首播放,也可以直接在這里播放下一首
    NSNotification * notification = [NSNotification notificationWithName:@"PLAYEND" object:nil];
    [[NSNotificationCenter defaultCenter] postNotification:notification];    
}

//接收通知,該通知由ZM_MusicManager發送,當前歌曲播放完畢,進行下一首播放
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nextBtnHandle:) name:@"PLAYEND" object:nil];

3.6 后臺播放

音樂播放器肯定是要后臺能夠播放最好,需要做下面的設置。

3.6.1 plist文件設置
plist設置.png

此處注意,方框里的設置為固定設置,不要改動。

3.6.2 添加代碼

3.1節代碼
然后我們的音樂播放器基本上就設計完了,附上Demo地址:ZM_MusicPlayer
DEMO完成了DLNA功能的設計,在common/model/upnp core下。
全文完。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容