日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS AVPlayer播放模式的实现(随机播放 列表循环 单曲循环)

發(fā)布時(shí)間:2023/12/31 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS AVPlayer播放模式的实现(随机播放 列表循环 单曲循环) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先我在這里講一下我的整個(gè)播放器的思路:
首先是一個(gè)歌曲的列表,我把數(shù)據(jù)請(qǐng)求放在了一個(gè)單例里面,方便以后獲取每首歌曲對(duì)應(yīng)的model, 我給AVPlayer的播放也放在了一個(gè)單例里面,有播放開始,停止,等方法嗎,我通過單例的代理方法將當(dāng)前的播放時(shí)間傳給播放時(shí)的控制器,這樣控制器就可以根據(jù)傳過去的當(dāng)前時(shí)間給界面賦值了,比如播放界面的當(dāng)前時(shí)間,以及當(dāng)前的歌詞等.

實(shí)現(xiàn)播放模式的思路:
1.通過點(diǎn)擊按鈕 彈出來一個(gè)下彈窗 可以選擇播放模式 聲明一個(gè)全局變量 不同的點(diǎn)擊全局變量的值改變 全局變量默認(rèn)的播放模式是列表循環(huán)
2.播放音樂時(shí)給播放添加計(jì)時(shí)器每隔0/1秒就要響應(yīng)一次 通過代理方法傳給控制器當(dāng)前播放時(shí)間
3.在控制器的代理方法中 根據(jù)傳過來的時(shí)間與當(dāng)前歌曲的總時(shí)間對(duì)比,如果相等說明這首歌結(jié)束了,就調(diào)用歌曲結(jié)束的方法.
4.在音樂播放完畢的時(shí)候調(diào)用方法 根據(jù)不同的全局變量 實(shí)現(xiàn)不同的操作

第一步 實(shí)現(xiàn)button的點(diǎn)擊方法 通過點(diǎn)擊不同的下彈窗的值改變?nèi)肿兞?記錄選擇的模式

/ 模式typeButton的點(diǎn)擊方法的實(shí)現(xiàn) - (void)actionTypeButton:(UIButton *)typeButton {UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"請(qǐng)選擇模式" message:nil preferredStyle:(UIAlertControllerStyleActionSheet)];// 添加順序播放按鈕UIAlertAction *serialAction = [UIAlertAction actionWithTitle:@"順序播放" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {// 給定義的全局變量賦值self.typeCount = 0;}];// 添加隨機(jī)播放按鈕UIAlertAction *ArcAction = [UIAlertAction actionWithTitle:@"隨機(jī)播放" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {self.typeCount = 1;}];// 添加重復(fù)播放按鈕UIAlertAction *repeatAction = [UIAlertAction actionWithTitle:@"重復(fù)播放" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {self.typeCount = 2;}];[alertController addAction:serialAction];[alertController addAction:ArcAction];[alertController addAction:repeatAction];[self presentViewController:alertController animated:YES completion:nil]; }

第二步:給播放添加計(jì)時(shí)器每隔0/1秒就要響應(yīng)一次 通過代理方法傳給控制器當(dāng)前播放時(shí)間

// 開始播放 - (void)musicPlay {self.isPlaying = YES; // 當(dāng)前的播放狀態(tài)[self.player play]; // AVPlayer開始播放self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playingAction) userInfo:nil repeats:YES]; // 開始計(jì)時(shí)器 調(diào)用播放的響應(yīng)方法 }#pragma mark -播放過程中執(zhí)行 - (void)playingAction {// 取到當(dāng)前播放時(shí)間的秒數(shù)CGFloat time = self.player.currentTime.value / self.player.currentTime.timescale;// 代理方法 將獲取到的時(shí)間 傳遞到控制器if (self.delegate && [self.delegate performSelector:@selector(playingWithProgress:)]) {[_delegate playingWithProgress:time];}}

第三步:在控制器的代理方法中 根據(jù)傳過來的時(shí)間與當(dāng)前歌曲的總時(shí)間對(duì)比,如果相等說明這首歌結(jié)束了,就調(diào)用歌曲結(jié)束的方法.

#pragma mark -- 實(shí)現(xiàn)代理方法 - (void)playingWithProgress:(CGFloat)progress {// progress 當(dāng)前歌曲播放到的時(shí)間// self.model.duration 當(dāng)前歌曲的總時(shí)間NSInteger second = self.model.duration / 1000;if (progress == second) {[self musicEnd];}}

第四步:得到歌曲的進(jìn)度的值 當(dāng)播放完畢的時(shí)候 做不同的操作

#pragma mark --音樂結(jié)束后 不同模式下的反應(yīng)-- - (void)musicEnd { // progress 當(dāng)前歌曲播放到的時(shí)間// self.model.duration 當(dāng)前歌曲的總時(shí)間NSInteger second = self.model.duration / 1000;if (progress == second) {switch (self.typeCount) {case 0:{// 當(dāng)選擇列表循環(huán)時(shí)候的操作// actionDownButton: 下面有方法的實(shí)現(xiàn)[self performSelector:@selector(actionDownButton:) withObject:nil];break;}case 1:{// 當(dāng)選擇隨機(jī)播放是的操作NSInteger num = [[RootTableViewManager shareManager] getDataArrayCount];self.index = arc4random() % (num + 1);// 更改了index 就相當(dāng)于改變了model 更改了數(shù)據(jù) 所以要刷新界面[self Valuation]; // 該方法是更改界面 給AVPlayer更換playerItem(就是穿進(jìn)去新的MP3的url) 播放音樂break;}case 2:{// 當(dāng)選擇循環(huán)播放時(shí)的操作 只要更改界面就可以了[self Valuation];break;}default:break;}}}

// actionDownButton:方法的實(shí)現(xiàn)

// 下一首的實(shí)現(xiàn)方法 - (void)actionDownButton:(UIButton *)downButton {self.index ++;NSInteger num = [[RootTableViewManager shareManager] getDataArrayCount];// 當(dāng)時(shí)最后一首的時(shí)候 跳到最前面if (self.index > num) {self.index = 0;}[self Valuation];}

// 界面的賦值是根據(jù)model的 線面是model的實(shí)現(xiàn)

/ 重寫model的get方法 - (Model *)model {// 根據(jù)當(dāng)前的index 選中對(duì)應(yīng)index歌曲的model 成為當(dāng)前播放的數(shù)據(jù)源odel *model = [[RootTableViewManager shareManager] getModelAtIndex:self.index];return model; }

總結(jié)

以上是生活随笔為你收集整理的iOS AVPlayer播放模式的实现(随机播放 列表循环 单曲循环)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。