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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

iOS从零开始学习直播之音频2.后台播放和在线播放

發布時間:2025/7/14 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS从零开始学习直播之音频2.后台播放和在线播放 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇主要講音頻的后臺播放和在線播放。

后臺播放

??上一篇寫的工程運行之后程序退至后臺,發現運行不了,歌停止了,這顯然不行,音樂后臺播放是標配啊。今天就來講一下后臺播放。
1.在plist文件里,告訴系統這是一款音樂軟件。

<key>Required background modes</key><array><string>App plays audio or streams audio/video using AirPlay</string></array>

2.代碼里設置。這個方法最好在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions ;

方法里調用,在別地調用也可以。

// 設置后臺播放 - (void)setBackGroudPlay {AVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];[audioSession setActive:YES error:nil];}

3.其實完成前兩步就可以實現后臺播放了,不過后臺播放最好加上一個過期時候的處理。

// 程序進入后臺,執行這個方法 - (void)applicationDidEnterBackground:(UIApplication *)application {UIBackgroundTaskIdentifier taskID = [application beginBackgroundTaskWithExpirationHandler:^{// 如果過期了,就停止任務[application endBackgroundTask:taskID];}]; }

在線播放(AVPlayer)

&emps;&emps;如果一個播放器僅僅支持本地音頻播放顯然是不夠的,在線播放也是標配啊。用AVAudioPlayer框架只能實現本地播放,想要實現在線播放得用AVPlayer框架。AVPlayer框架是用來播放視頻的,但是音頻也沒問題。
1.初識化UI

聲明的變量

@interface FHAVPlayerViewController (){UIProgressView *_progressView; // 緩沖進度條UISlider *_pregressSlider; // 播放控制條UILabel *_pregressLabel; // 進度UISlider *_volumeSlider; // 聲音控制 }@property (nonatomic, strong)AVPlayer *avPlayer; @property (nonatomic, strong)AVPlayerItem * songItem; @property (nonatomic, strong)id timePlayProgerssObserver;// 播放器進度觀察者@end

&emps;&emps;黃色是UIProgressView,代表緩沖進度條,藍色的是UISlider,代表播放控制條。

// (1)初始化二個Button;NSArray *titleArr = @[@"播放",@"暫停"];for (int i = 0; i < titleArr.count; i++ ) {UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];[self.view addSubview:button];[button setFrame:CGRectMake(20 + i * 50, 130 , 60, 40)];[button setTitle:titleArr[i] forState:UIControlStateNormal];button.tag = i+100;[button addTarget:self action:@selector(controlAVPlayerAction:) forControlEvents:UIControlEventTouchUpInside];}// (2)初始化緩沖進度條_progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(20, 59, ScreenWidth - 130 - 20, 5)];// 設置緩沖進度條的顏色_progressView.progressTintColor = [UIColor yellowColor];[self.view addSubview:_progressView];// (3)初始化播放進度_pregressSlider = [[UISlider alloc] initWithFrame:CGRectMake(20, 50, ScreenWidth - 130 - 20, 20)];_pregressSlider.minimumValue = 0.0f;_pregressSlider.maximumValue = 1.0f;// 把_pregressSlider小于滑塊的部分設置成藍色以顯示播放進度_pregressSlider.minimumTrackTintColor = [UIColor blueColor];// 把_pregressSlider大于滑塊的部分設置成透明以顯示緩沖進度_pregressSlider.maximumTrackTintColor = [UIColor clearColor];[_pregressSlider addTarget:self action:@selector(pregressChange) forControlEvents:UIControlEventValueChanged];[self.view addSubview: _pregressSlider];// (4)時間_pregressLabel = [[UILabel alloc] initWithFrame:CGRectMake(ScreenWidth - 120, 50, 100, 20)];_pregressLabel.text = @"00:00/00:00";[self.view addSubview:_pregressLabel];// (5)初始化音量_volumeSlider = [[UISlider alloc] initWithFrame:CGRectMake(20, 90, ScreenWidth - 130 - 20, 20)];[_volumeSlider addTarget:self action:@selector(volumeChange) forControlEvents:UIControlEventValueChanged];_volumeSlider.minimumValue = 0.0f;_volumeSlider.maximumValue = 10.0f;_volumeSlider.value = 1.0f;[self.view addSubview:_volumeSlider];UILabel *volumeLabel = [[UILabel alloc] initWithFrame:CGRectMake(ScreenWidth - 120, 90, 40, 20)];volumeLabel.text = @"音量";[self.view addSubview:volumeLabel];

注意:(1)播放進度條要放在緩沖進度條上面,否則緩沖進度遮擋播放進度。
(2)其他的和上一個工程一樣,就不介紹了。具體的可以去本人的GitUp上下載。
2.實現在線播放
準備:在plist文件里讓工程支持http。

<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict> // (1)取得音頻播放路徑NSString *strURL = @"http://yinyueshiting.baidu.com/data2/music/42783748/42783748.mp3?xcode=b31ae4e046eac3470c486914f0acd7b6";// (2)把音頻文件轉化成url格式NSURL *url = [NSURL URLWithString:strURL];// (3)使用playerItem獲取視頻的信息,當前播放時間,總時間等_songItem = [[AVPlayerItem alloc]initWithURL:url];// (3)初始化音頻類 并且添加播放文件self.avPlayer = [[AVPlayer alloc]initWithPlayerItem:_songItem];// (4) 設置初始音量大小 默認1,取值范圍 0~1self.avPlayer.volume = 1.0;

注意:必須等緩沖完了才能播放。

// 音頻控制 - (void)controlAVPlayerAction : (UIButton *)button {NSInteger tag = button.tag;// 播放if (tag == 100) {[self.avPlayer play];}// 暫停if (tag == 101) {[self.avPlayer pause];} }

3.監聽在線播放狀態

(1) 監聽播放器狀態和緩沖狀態

// (5)監聽播放器狀態 NSKeyValueObservingOptionNew 把更改之前的值提供給處理方法[self.avPlayer.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// (6)監聽緩存狀態[self.avPlayer.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];

備注:監聽self.avPlayer.currentItem的status和loadedTimeRanges屬性,一有變化就把更改之前的值提供給下面的方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context {if ([keyPath isEqualToString:@"status"]) {switch (_avPlayer.status) {case AVPlayerStatusUnknown:NSLog(@"KVO:未知狀態,此時不能播放");break;case AVPlayerStatusReadyToPlay:NSLog(@"KVO:準備完畢,可以播放");break;case AVPlayerStatusFailed:NSLog(@"KVO:加載失敗,網絡或者服務器出現問題");break;default:break;}}if ([keyPath isEqualToString:@"loadedTimeRanges"]) {NSArray * timeRanges = self.avPlayer.currentItem.loadedTimeRanges;//本次緩沖的時間范圍CMTimeRange timeRange = [timeRanges.firstObject CMTimeRangeValue];//緩沖總長度NSTimeInterval totalLoadTime = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration);//音樂的總時間NSTimeInterval duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration);//計算緩沖百分比例NSTimeInterval scale = totalLoadTime/duration;//更新緩沖進度條_progressView.progress = scale;} }

注意:status是檢測的硬件屬性,也就是用戶的手機。只要手機沒壞都能準備完成.但是準備完成還不能播放,得能緩沖完。
(2)監聽音樂播放的進度

// 防止循環引用__weak typeof(self) weakSelf = self;__block UISlider *weakPregressSlider = _pregressSlider;__block UILabel *weakPregressLabel = _pregressLabel;self.timePlayProgerssObserver = [self.avPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {// 當前播放的時間float current = CMTimeGetSeconds(time);// 總時間float total = CMTimeGetSeconds(weakSelf.avPlayer.currentItem.duration);// 更改當前播放時間NSString *currentMStr = [weakSelf FormatTime: current / 60];NSString *currentSStr = [weakSelf FormatTime: (int)current % 60];NSString *durationMStr = [weakSelf FormatTime:total / 60];NSString *durationSStr = [weakSelf FormatTime: (int)total % 60];weakPregressLabel.text = [NSString stringWithFormat:@"%@:%@/%@:%@",currentMStr,currentSStr,durationMStr,durationSStr];// 更新播放進度條weakPregressSlider.value = current / total;}]; - (NSString *)FormatTime: (int)time {if (time < 10) {return [NSString stringWithFormat:@"0%d",time];}else {return [NSString stringWithFormat:@"%d",time];} }

注意:block里面一定要防止循環引用。
(3)監聽音樂播放完成

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil]; - (void)playFinished:(NSNotification *)notification {// 時間跳轉到零 重新播放[self.avPlayer seekToTime:kCMTimeZero];[self.avPlayer play]; }

注意:播放完成如果你什么都不設置,就會變成停止播放。AVPlayer沒有播放次數的屬性,得我們自己實現。
3.最后

- (void)dealloc {[[NSNotificationCenter defaultCenter] removeObserver:self];[self.avPlayer removeTimeObserver:self.timePlayProgerssObserver];self.timePlayProgerssObserver = nil; }

注意:如果不移除觀察者,將造成內存泄漏。
??要想獲得完整工程可以去本人的GitUp上下載。

轉載于:https://www.cnblogs.com/doujiangyoutiao/p/6105316.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的iOS从零开始学习直播之音频2.后台播放和在线播放的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。